mirror of
https://github.com/IcedRooibos/py32f0-template.git
synced 2025-10-28 00:12:05 -07:00
253 lines
8.3 KiB
Markdown
253 lines
8.3 KiB
Markdown
# py32f0-template
|
|
|
|
* Template project for Puya PY32F0 MCU
|
|
* Supports GNU Arm Embedded Toolchain
|
|
* Supports J-Link and DAPLink/PyOCD programmers
|
|
* Supports IDE: VSCode
|
|
|
|
# Puya PY32F0 Family
|
|
|
|
* PY32F002A
|
|
* PY32F002Ax5(20KB Flash/3KB RAM)
|
|
* PY32F003
|
|
* PY32F003x4(16KB Flash/2KB RAM), PY32F003x6(32KB Flash/4KB RAM), PY32F003x8(64KB Flash/8KB RAM)
|
|
* PY32F030
|
|
* PY32F030x4(16KB Flash/2KB RAM), PY32F030x6(32KB Flash/4KB RAM), PY32F030x7(48KB Flash/6KB RAM), PY32F030x8(64KB Flash/8KB RAM)
|
|
* PY32F072
|
|
* PY32F072xB(128KB Flash/16KB RAM)
|
|
|
|
**Note**
|
|
|
|
PY32F002A, PY32F003 and PY32F030 are highly likely to share the same core. Therefore, when it comes to coding and programming, you can treat all of them as PY32F030.
|
|
|
|
# File Structure
|
|
|
|
```
|
|
├── Build # Build results
|
|
├── Docs # Datesheets and User Manuals
|
|
├── Examples
|
|
│ ├── FreeRTOS # FreeRTOS examples
|
|
│ ├── HAL # HAL library examples
|
|
│ └── LL # LL(Low Layer) library examples
|
|
├── Libraries
|
|
│ ├── BSP # SysTick delay and printf for debug
|
|
│ ├── BSP_LL # SysTick delay and printf for debug
|
|
│ ├── CMSIS
|
|
│ ├── FreeRTOS # FreeRTOS library
|
|
│ ├── LDScripts # LD files
|
|
│ ├── PY32F0xx_HAL_Driver # MCU peripheral driver
|
|
│ └── PY32F0xx_LL_Driver # MCU low layer peripheral driver
|
|
├── Makefile # Make config
|
|
├── Misc
|
|
│ ├── Flash
|
|
│ │ ├── JLinkDevices # JLink flash loaders
|
|
│ │ └── Sources # Flash algorithm source code
|
|
│ ├── Puya.PY32F0xx_DFP.x.pack # DFP pack file for PyOCD
|
|
│ └── SVD # SVD files
|
|
├── README.md
|
|
├── rules.mk # Pre-defined rules include in Makefile
|
|
└── User # User application code
|
|
```
|
|
|
|
# Requirements
|
|
|
|
* PY32F0 EVB or boards of PY32F002/003/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. Clone This Repository
|
|
|
|
Clone this repository to local workspace
|
|
```bash
|
|
git clone https://github.com/IOsetting/py32f0-template.git
|
|
```
|
|
|
|
## 3. Install SEGGER J-Link Or PyOCD
|
|
|
|
### 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_V784f_x86_64.deb
|
|
# uncompression command for .tar.gz
|
|
sudo tar xvf JLink_Linux_V784f_x86_64.tgz -C [target folder]
|
|
```
|
|
The default installation directory is */opt/SEGGER*
|
|
|
|
Copy [Project directory]/Misc/Flash/JLinkDevices to [User home]/.config/SEGGER/JLinkDevices/
|
|
```bash
|
|
cd py32f0-template
|
|
cp -r Misc/Flash/JLinkDevices/ ~/.config/SEGGER/
|
|
```
|
|
Read more: [https://wiki.segger.com/J-Link_Device_Support_Kit](https://wiki.segger.com/J-Link_Device_Support_Kit)
|
|
|
|
### 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
|
|
|
|
## 4. Edit Makefile
|
|
|
|
Change the settings in Makefile
|
|
|
|
* **USE_LL_LIB** Puya provides two sets of library, HAL and LL, set `USE_LL_LIB ?= y` to use LL instead of HAL.
|
|
* **ENABLE_PRINTF_FLOAT** set it to `y` to `-u _printf_float` to link options. This will increase the binary size.
|
|
* **USE_FREERTOS** Set `USE_FREERTOS ?= y` will include FreeRTOS in compilation
|
|
* **USE_DSP** Include CMSIS DSP or not
|
|
* **FLASH_PROGRM**
|
|
* If you use J-Link, `FLASH_PROGRM` can be jlink or pyocd
|
|
* If you use DAPLink, set `FLASH_PROGRM ?= pyocd`
|
|
* ST-LINK is not supported yet.
|
|
* **ARM_TOOCHAIN** Make sure it points to the correct path of arm-none-eabi-gcc
|
|
|
|
```makefile
|
|
##### Project #####
|
|
|
|
PROJECT ?= app
|
|
# The path for generated files
|
|
BUILD_DIR = Build
|
|
|
|
|
|
##### Options #####
|
|
|
|
# Use LL library instead of HAL, y:yes, n:no
|
|
USE_LL_LIB ?= n
|
|
# Enable printf float %f support, y:yes, n:no
|
|
ENABLE_PRINTF_FLOAT ?= n
|
|
# Build with FreeRTOS, y:yes, n:no
|
|
USE_FREERTOS ?= 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:
|
|
# PY32F002AX5,
|
|
# PY32F003X4, PY32F003X6, PY32F003X8,
|
|
# PY32F030X4, PY32F030X6, PY32F030X7, PY32F030X8
|
|
JLINK_DEVICE ?= PY32F030X6
|
|
# path to PyOCD,
|
|
PYOCD_EXE ?= pyocd
|
|
# PyOCD device type, options:
|
|
# py32f002ax5,
|
|
# py32f003x4, py32f003x6, py32f003x8,
|
|
# py32f030x3, py32f030x4, py32f030x6, py32f030x7, py32f030x8
|
|
# py32f072xb
|
|
PYOCD_DEVICE ?= py32f030x8
|
|
|
|
|
|
##### Paths ############
|
|
|
|
# Link descript file: py32f002ax5.ld, py32f003x6.ld, py32f003x8.ld, py32f030x6.ld, py32f030x8.ld
|
|
LDSCRIPT = Libraries/LDScripts/py32f030x8.ld
|
|
# Library build flags:
|
|
# PY32F002Ax5,
|
|
# PY32F003x4, PY32F003x6, PY32F003x8,
|
|
# PY32F030x3, PY32F030x4, PY32F030x6, PY32F030x7, PY32F030x8,
|
|
# PY32F072xB
|
|
LIB_FLAGS = PY32F030x6
|
|
```
|
|
|
|
## 5. Compiling And Flashing
|
|
|
|
```bash
|
|
# clean source code
|
|
make clean
|
|
# build
|
|
make
|
|
# or make with verbose output
|
|
V=1 make
|
|
# flash
|
|
make flash
|
|
```
|
|
|
|
# Debugging In VSCode
|
|
|
|
Install Cortex Debug extension, add a new configuration in launch.json, e.g.
|
|
```
|
|
{
|
|
"armToolchainPath": "/opt/gcc-arm/arm-gnu-toolchain-12.2.rel1-x86_64-arm-none-eabi/bin/",
|
|
"toolchainPrefix": "arm-none-eabi",
|
|
"name": "Cortex Debug",
|
|
"cwd": "${workspaceFolder}",
|
|
"executable": "${workspaceFolder}/Build/app.elf",
|
|
"request": "launch", // can be launch or attach
|
|
"type": "cortex-debug",
|
|
"runToEntryPoint": "Reset_Handler", // "main" or other function name. runToMain is deprecated
|
|
"servertype": "jlink", // jlink, openocd, pyocd, pe and stutil
|
|
"device": "PY32F030X8",
|
|
"interface": "swd",
|
|
"preLaunchTask": "build", // Set this to run a task from tasks.json before starting a debug session
|
|
// "preLaunchCommands": ["Build all"], // Uncomment this if not using preLaunchTask
|
|
"svdFile": "${workspaceFolder}/Misc/SVD/py32f030xx.svd", // svd for this part number
|
|
"showDevDebugOutput": "vscode", // parsed, raw, vscode:vscode log and raw
|
|
"swoConfig":
|
|
{
|
|
"enabled": true,
|
|
"cpuFrequency": 8000000, // Target CPU frequency in Hz
|
|
"swoFrequency": 4000000,
|
|
"source": "probe", // either be “probe” to get directly from the debug probe,
|
|
// or a serial port device to use a serial port external to the debug probe.
|
|
"decoders":
|
|
[
|
|
{
|
|
"label": "ITM port 0 output",
|
|
"type": "console",
|
|
"port": 0,
|
|
"showOnStartup": true,
|
|
"encoding": "ascii"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
If Cortex Debug cannot find JLinkGDBServerCLExe, add the following line to settings.json
|
|
```
|
|
"cortex-debug.JLinkGDBServerPath": "/opt/SEGGER/JLink/JLinkGDBServerCLExe",
|
|
```
|
|
|
|
# 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
|