stm32 常见问题汇总.md

  1. 1. Q:使用 j-link 仿真mdk 不识别出现”No ST-LINK detected”!
  2. 2. Q:PA13 、 PA14 、 PA15、PB3、PB4 无法作为 GPIO 使用 !
  3. 3. Q: 什么时候需要用到 AFIO
  4. 4. Q: BOOT0 、 BOOT1(PB2) 的使用
  5. 5. Q: stm32f4 discovery 开发板 USART1 输出乱码
  6. 6. Q: Keil 编译出错:xxx declaration may not appear after executable statement in block
  7. 7. Q: 定义 bool 类型变量报错.
  • 
    A:MDK 中j-link 的配置项错误导致。
  1. Options for Tartet .. -> Debug ==J-LINK/J-TRACE Cortex –> Settings –> ort == JTAG/SW
  2. Options for Tartet .. -> Utilities –>Use Tarte Driver for Flash Programming == J-LINK/J-TRACE Cortex

  • Q:PA13 、 PA14 、 PA15、PB3、PB4 无法作为 GPIO 使用 !

A: stm32 上电后这几个管脚默认作为 jtag 功能脚.
jtag

想要释放这几个管脚作为普通 GPIO 使用,必须切换此脚的功能.否则对管脚的所有 GPIO 操作都不会生效.
需要配置的寄存器为:
AFIO_MAPR[26:24] –> SWJ_CFG(Serial Wire JTAG Configuration)
jtag_pin

注: 1.需要特别注意的是,在操作 AFIO_MAPR 寄存器之前必须先打开 AFIO 时钟.
2.在使用 jtag 调试代码时,如果代码操作 AFIO_MAPR 寄存器来禁止 SWJ 功能 会报错.


  • Q: 什么时候需要用到 AFIO

A: 对寄存器 AFIO_EVCRAFIO_MAPRAFIO_EXTICRX 进行读写操作前,应当首先打开 AFIO的时钟。


  • Q: BOOT0 、 BOOT1(PB2) 的使用

A: STM32中文参考手册:2.4[P33]
STM32有三种启动模式,如下表:
image

1.ST公司在出厂时给 MCU 的 ROM 中固化了一段启动代码(类似 bootloader,并且无法修改/删除)
用于 ISP (In-system programming).所以想要使用 串口进行 ISP 烧录程序必须从表中 模式2 启动!

注: 因此在使用 ISP 烧录程序时后需要把,BOOT0置 0 ,否者导致程序不运行.

2.BOOT1 即管脚 PB2,只在系统上电后 第4个上升沿时钟 用于控制启动模式。之后就被释放,可用于正常的 GPIO。
所以一般 PB2 管脚的硬件电路设计都连接一下拉电阻接地.


  • Q: stm32f4 discovery 开发板 USART1 输出乱码

A: 由于 开发板把 PA9 、PA10 两个管脚用于 usb otg 功能,所以需要使用 USART1 需要把对应引脚复用到 PD6、PD7


  • Q: Keil 编译出错:xxx declaration may not appear after executable statement in block

A: 这是由于变量声明在语句之后,c++里面是正常的,现在的很多c编译器也允许。但是最早的c是不许这么写的,keil 也要求所有的局部变量必须在函数开头声明。

int main(void)
{

PLLCON = 1; // 这个(以及下面若干行)就是所谓的“executable statement ”
......
uint8 sec; // 这就是“declaration ”,会在此处报错


  • Q: 定义 bool 类型变量报错.

A: 默认情况下 stm32 库是不支持 bool 类型的.需要包含头文件: stdbool.h