文章目录
STM32
hardware setup
ST-LINK v2
SWCLK (clock) ; SWDIO (data input & output) ; power supply (for the micro chip) you can find the corresponding pins on stm32 chip (SWCLK SWDIO)
SWCLK pull low externally (link to GND); SWDIO pull high
for JTAG , pins are same (正点原子 STM32F1 的板子)
you can also find SWDIO is pulled up while SWCLK is pulled down.
Degub protoptype (JTAG / SWD)
https://blog.csdn.net/LEON1741/article/details/72846434
JTAG 是芯片内部的测试协议。标准的JTAG接口是4线:TMS、 TCK、TDI、TDO,分别为模式选择、时钟、数据输入和数据输出线。 相关JTAG引脚的定义为:
TMS:测试模式选择,TMS用来设置JTAG接口处于某种特定的测试模式;
TCK:测试时钟输入;
TDI:测试数据输入,数据通过TDI引脚输入JTAG接口;
TDO:测试数据输出,数据通过TDO引 脚从JTAG接口输出;
SWD,串行调试(Serial Wire Debug), 更少的引脚(4 个), 大数据下更稳定。
可以看到对上面正点原子的板子, SWD 与 JTAG 共用了一个口
SWD 相比于 JTAG 使用接口更少,只需要 SWDIO, SWCLK, VCC, GND 四根线(stm32f103-minimum 上的四个借口)
仿真器
jlink
基于 JTAG 仿真,面对计算机采用 USB 口, 对板仍然采用 JTAG 口
ST - link
专门针对 ST 公司的芯片, 可以烧写,仿真,下载。 st-link v2 对于 JTAG 和 SWD 是通用的,在 Keil 可以随意选择。
烧写
- openocd
参见 nuttx 中 openocd 安装与烧写方法
openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c init -c "reset halt" -c "flash write_image erase nuttx.bin 0x08000000"
openocd 也可以用来和芯片相连接,提供调试的本地端口。
openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg
openocd 配置文件在 /usr/local/share/openocd/scripts
下。interface
对应的是调试器硬件 (stlink-v2, …) target
对应是板子
- stlink
使用 stlink 驱动烧写。此时 BOOT0
与 BOOT1
引脚拉低,从 FLASH 启动。
- 串口烧写程序
在 STM32CubeProgrammer
中
选择串口模式,然后启动方式选择 System Memory
,用串口连接后烧写程序。
- 烧写时的 BOOT 引脚设置。
BOOT0 | BOOT1 | 启动方式 |
---|---|---|
0 | 无关 | 用户闪存存储器启动 (User Flash memory) |
1 | 0 | 从系统存储器启动 (System memory) |
1 | 1 | 从内嵌SRAM 启动 (Embedded SRAM) |
- User Flag memory
正常工作模式
- System Memory
系统存储器是芯片内部一块特定的区域, ST 在出厂时,在内部预置了一段 bootloader, (ROM)。在 bootloader 帮助下,通过串口下载程序到 flash 中。
- Embedded SRAM
该模式用于调试代码(不需要全部擦除从来)
2020.5.30 晚上一直不清楚 stlink-v2 通过 openocd 无法连接芯片的原因。后来发现是 Boot 接线不对,导致驱动检测不到芯片。
若从主闪存启动,从地址 0x0800 0000 访问,这也就是通过 openocd 烧写指定的地址。
内置 SRAM 是在 0x2000 0000
Debug
目前调试可以用 openocd 完成。注意在启动文件中修改烧写文件区域的大小。
arm-none-eabi-gdb nuttx # program name
# gdb interface
target remote localhost:3333 # connect to the localhost port provided by openocd
monitor reset # reset chip
monitor halt # halt the program
load nuttx # load binary file
monitor
是本地远程发送到芯片的命令。
Custom Board
这里记录一些见到过的板子和使用HAL
时注意事项。
STM32F407G-DISC1
STM32 官方的板子。这个板子有意思地方在于板上集成 了一个 stlink-v2 调试器,不需要自己再购买一个。 CN3
控制调试器选择。跳接时,选择板上集成的调试器。否则可以用自己的调试器,直接连接在 GPIO 管脚上。
STM32F103ZET6(正点原子战舰板)
裸片配置:
RCC
里面选中HSE
、LSE
。sys
里面Debug
选择Serial Wire
。(不然无法用 ST-Link 调试)- 检查
NVIC
-->Code Generation
-->System Tick Timer
是否生成中断响应函数IRQ
并调用HAL
处理函数(HAL_Handler
)。
记得把板子左侧的电源接口插着。
communication
UART
异步收发串行通信 <–> 同步方式 (USART)
规范标准 : RS232. RS449
COM 是 PC 上异步串行通信口 RS232
开始时保持低电平是为了保证数据线正常。以低电平表示开始传输数据。UART 在接受完成后,将设置标记表示数据可用( 中断处理函数中常作检验 ),并产生一个处理器中断。使用 UART
时会有一个 Hard Ware Control Flow
选项,对应是 RTS
与 CTS
管脚,用以辅助数据传输。相应的在 HAL 库中读取寄存器并与标志比较,判断是否下一次传输。(函数 UART_WaitOnFlagUntilTimeout
)在 minicom
中同样需要配置Hardware control flow
选项。
CTS <---> RTS
RTS <---> CTS
CAN
CAN 协议通过以下五种数据帧通讯。
chip Reg
CLOCK
RCC (Reset Clock Control)
AHB (Advanced High performance Bus)
GPIO
MODER (mode register)
OTYPER (output type register)
IDE
Program
stmf4xx.h has defines about registers
RCC -> AHBENR |= RCC_AHBENR_GPIOCEN ; // or (1 << 19) specify the bits
// set zero
GPIOC -> OTYPER &= ~(...)
ASSEMBLY CODE
eg. inline assembly code
int x = 1, y = 2 ;
int res = 0;
__asm ("ADD %[result], %[input_x], %[input_y]"
: [result] "=r" (res)
: [input_x] "r" (x), [input_j] "r" (y)
)
格式为
stem Type > STM32 Peripheral Support 中确定使用的外设
> System Type > Alternate Pin Mapping 中确定重映射关系
PWM
在 boards 下 stm32f103-minimum config 中配置 pwm Timer 和 output channel 。在 stm32f103-minimum.h 中确认定义的通道和定时器与 config 中一致
> System Type > Timer Configuration 配置定时器的使用模式,输出通道