From fb85d299d3df10b10547a42984717d42ca12a464 Mon Sep 17 00:00:00 2001 From: IOsetting Date: Sun, 25 Dec 2022 11:50:36 +0800 Subject: [PATCH] docs: add readme --- Makefile | 6 +- README.md | 205 ++++++++++++++++++++++++++++++++++++++++++++++++++++ User/main.c | 36 +++------ 3 files changed, 217 insertions(+), 30 deletions(-) diff --git a/Makefile b/Makefile index bcdca8b..f61bdfd 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ BUILD_DIR = Build ##### Options ##### # Use LL library instead of HAL -USE_LL_LIB ?= y +USE_LL_LIB ?= n # Enable printf float %f support, y:yes, n:no ENABLE_PRINTF_FLOAT ?= n # Build with CMSIS DSP functions, y:yes, n:no @@ -20,7 +20,7 @@ FLASH_PROGRM ?= pyocd #ARM_TOOCHAIN ?= /opt/gcc-arm/gcc-arm-11.2-2022.02-x86_64-arm-none-eabi/bin #ARM_TOOCHAIN ?= /opt/gcc-arm/arm-gnu-toolchain-11.3.rel1-x86_64-arm-none-eabi/bin -ARM_TOOCHAIN ?= /opt/gcc-arm/arm-gnu-toolchain-12.2.mpacbti-bet1-x86_64-arm-none-eabi/bin +ARM_TOOCHAIN ?= /opt/gcc-arm/arm-gnu-toolchain-12.2.rel1-x86_64-arm-none-eabi/bin # path to JLinkExe JLINKEXE ?= /opt/SEGGER/JLink/JLinkExe @@ -34,7 +34,7 @@ PYOCD_DEVICE ?= py32f003x8 ##### Paths ############ -# Link descript file +# Link descript file: py32f003x6.ld, py32f003x8.ld, py32f030x6.ld, py32f030x8.ld LDSCRIPT = Libraries/LDScripts/py32f003x8.ld # Library build flags: PY32F030x3, PY32F030x4, PY32F030x6, PY32F030x7, PY32F030x8, PY32F003x4, PY32F003x6, PY32F003x8 LIB_FLAGS = PY32F003x8 diff --git a/README.md b/README.md index 098b464..199bbb1 100644 --- a/README.md +++ b/README.md @@ -1 +1,206 @@ # py32f0-template + +* Puya PY32F003/030 template project for GNU Arm Embedded Toolchain +* Supported programmers: J-Link, DAPLink/PyOCD +* Supported IDE: VSCode + +# File Structure + +``` +├── Build # Build results +├── Examples +│   ├── FreeRTOS # FreeRTOS examples +│   ├── Raw # NonFreeRTOS examples +│   └── Raw_LL # NonFreeRTOS examples with low layer lib +├── Libraries +│   ├── BSP # SysTick delay and printf for debug +│   ├── BSP_LL # SysTick delay and printf for debug +│   ├── CMSIS +│   ├── LDScripts # ld files +│   ├── PY32F0xx_HAL_Driver # MCU peripheral driver +│   └── PY32F0xx_LL_Driver # MCU low layer peripheral driver +├── Makefile # Make config +├── Misc +│   └── Devices # FLM files +├── README.md +├── rules.mk # Pre-defined rules include in Makefile +└── User # User application code +``` + +# Requirements + +* PY32F0 EVB or boards of PY32F003/030 series +* Programmer + * J-Link: J-Link OB programmer + * PyOCD: DAPLink or J-Link +* SEGGER J-Link Software and Documentation pack [https://www.segger.com/downloads/jlink/](https://www.segger.com/downloads/jlink/) +* PyOCD [https://pyocd.io/](https://pyocd.io/) +* GNU Arm Embedded Toolchain + +# Building + +## 1. Install GNU Arm Embedded Toolchain + +Download the toolchain from [Arm GNU Toolchain Downloads](https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads) according to your pc architecture, extract the files + +```bash +sudo mkdir -p /opt/gcc-arm/ +sudo tar xvf arm-gnu-toolchain-12.2.rel1-x86_64-arm-none-eabi.tar.xz -C /opt/gcc-arm/ +cd /opt/gcc-arm/ +sudo chown -R root:root arm-gnu-toolchain-12.2.rel1-x86_64-arm-none-eabi/ +``` +## 2. Option #1: Install SEGGER J-Link + +Download and install JLink from [J-Link / J-Trace Downloads](https://www.segger.com/downloads/jlink/). + +```bash +# installation command for .deb +sudo dpkg -i JLink_Linux_V770a_x86_64.deb +``` +The default installation directory is */opt/SEGGER* + +Copy all .FLM files from [Project directory]/Misc/Devices/Puya to [JLink directory]/Devices/Puya + +```bash +cd py32f0-template +sudo cp -r Misc/Devices/* /opt/SEGGER/JLink/Devices/ +``` + +Edit JLinkDevices.xml + +```bash +sudo vi /opt/SEGGER/JLink/JLinkDevices.xml +``` +Add the following lines in `` section + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + + +## 2. Option #2: Install PyOCD + +Don't install from apt repository, because the version 0.13.1+dfsg-1 is too low for J-Link probe. + +Install PyOCD from pip + +```bash +pip uninstall pyocd +``` +This will install PyOCD into: +``` +/home/[user]/.local/bin/pyocd +/home/[user]/.local/bin/pyocd-gdbserver +/home/[user]/.local/lib/python3.10/site-packages/pyocd-0.34.2.dist-info/* +/home/[user]/.local/lib/python3.10/site-packages/pyocd/* +``` +In Ubuntu, .profile will take care of the PATH, run `source ~/.profile` to make pyocd command available + +## 3. Clone This Repository + +Clone this repository to local workspace +```bash +git clone https://github.com/IOsetting/py32f0-template.git +``` + +## 4. Edit Makefile + +Change the settings in Makefile +* make sure **ARM_TOOCHAIN** points to the correct path of arm-none-eabi-gcc +* If you use J-Link, **FLASH_PROGRM** can be jlink or pyocd +* If you use DAPLink, set **FLASH_PROGRM** to pyocd +* ST-LINK is not supported yet. ST-LINK works in Windows Keil5, but I failed to make it work in Ubuntu +* Puya provides two sets of library, HAL lib and LL lib, switch in **USE_LL_LIB** option +* **ENABLE_PRINTF_FLOAT** will add `-u _printf_float` to link options, which will significantly increase the binary size. + +```makefile +##### Project ##### + +PROJECT ?= app +# The path for generated files +BUILD_DIR = Build + + +##### Options ##### + +# Use LL library instead of HAL +USE_LL_LIB ?= y +# Enable printf float %f support, y:yes, n:no +ENABLE_PRINTF_FLOAT ?= n +# Build with CMSIS DSP functions, y:yes, n:no +USE_DSP ?= n +# Programmer, jlink or pyocd +FLASH_PROGRM ?= pyocd + +##### Toolchains ####### + +ARM_TOOCHAIN ?= /opt/gcc-arm/arm-gnu-toolchain-12.2.rel1-x86_64-arm-none-eabi/bin + +# path to JLinkExe +JLINKEXE ?= /opt/SEGGER/JLink/JLinkExe +# JLink device type, options: PY32F003X4, PY32F003X6, PY32F003X8, PY32F030X6, PY32F030X7, PY32F030X8 +JLINK_DEVICE ?= PY32F003X8 +# path to PyOCD +PYOCD_EXE ?= pyocd +# PyOCD device type, options: py32f003x4, py32f003x6, py32f003x8, py32f030x3, py32f030x4, py32f030x6, py32f030x7, py32f030x8 +PYOCD_DEVICE ?= py32f003x8 + + +##### Paths ############ + +# Link descript file: py32f003x6.ld, py32f003x8.ld, py32f030x6.ld, py32f030x8.ld +LDSCRIPT = Libraries/LDScripts/py32f003x8.ld +# Library build flags: PY32F030x3, PY32F030x4, PY32F030x6, PY32F030x7, PY32F030x8, PY32F003x4, PY32F003x6, PY32F003x8 +LIB_FLAGS = PY32F003x8 +``` + +## 5. Compiling And Flashing + +```bash +# clean source code +make clean +# build +make +# or make with verbose output +V=1 make +# flash +make flash +``` + +# Try Other Examples + +More examples can be found in *Examples* folder, copy and replace the files under *User* folder to try different examples. + +# Links + +* Puya Product Page(Datasheet & SDK download): https://www.puyasemi.com/cpzx3/info_267_aid_242_kid_235.html diff --git a/User/main.c b/User/main.c index 70bbdb0..71db4c9 100755 --- a/User/main.c +++ b/User/main.c @@ -33,35 +33,29 @@ static void APP_LedConfig(void); -/** - * @brief 应用程序入口函数. - * @param 无 - * @retval int - */ int main(void) { - /* 初始化所有外设,Flash接口,SysTick */ + /* + * Configure the Flash prefetch and the Instruction cache, + * the time base source, NVIC and any required global low level hardware + * by calling the HAL_MspInit() callback function to be optionally defined in user file + * PY32F0xx_hal_msp.c. + */ HAL_Init(); - /* 初始化LED */ + /* LED GPIO init */ APP_LedConfig(); BSP_USART_Config(); while (1) { - /* 延时250ms */ HAL_Delay(1000); HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5); printf("echo\r\n"); } } -/** - * @brief 初始化LED - * @param 无 - * @retval 无 - */ static void APP_LedConfig(void) { GPIO_InitTypeDef GPIO_InitStruct; @@ -76,15 +70,8 @@ static void APP_LedConfig(void) HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* GPIO初始化 */ } - -/** - * @brief 错误执行函数 - * @param 无 - * @retval 无 - */ void APP_ErrorHandler(void) { - /* 无限循环 */ while (1) { } @@ -92,16 +79,11 @@ void APP_ErrorHandler(void) #ifdef USE_FULL_ASSERT /** - * @brief 输出产生断言错误的源文件名及行号 - * @param file:源文件名指针 - * @param line:发生断言错误的行号 - * @retval 无 + * @brief Export assert error source and line number */ void assert_failed(uint8_t *file, uint32_t line) { - /* 用户可以根据需要添加自己的打印信息, - 例如: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ - /* 无限循环 */ + /* printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ while (1) { }