【STM32】STM32F429 HAL库开发注意事项
正点原子F429开发板,HAL库
注意
1、如果将全部库文件都引入,会出现error: l6200e: symbol hal_mspdeinit multiply defined,此处是stm32f1xx_hal_msp_template.c和stm32f1xx_hal_msp.c重复定义了HAL_MspDeInit和HAL_MspInit 函数,此时要么不引入,要么把其中一个的注释掉
2、编译后报warning,stm32f4xx_ll_usb.c(785): warning: #3108-d,点Option for target / C/C++ ,将C99 Mode和GNU extensions取消勾选即可解决
3、用CubeMX生成模板,首先注意CubeMX版本和固件版本,如果CubeMX版本比固件版本新太多可能会编译报错,所以建议直接最新。。。生成以后编译通过了,Download到板子上,却发现程序并没有运行,查了半天错,翻腾版本,排除各方原因后才发现终端没有弹出application running ...,CubeMX生成的Keil模板似乎没有默认将Target Option-Debug-Settings-Flash Download的Download Function(即Download键的功能)中Reset and Run勾上。。。所以其实要么勾上这个,要么重启板子,就可以看到运行结果
4、按键下降沿触发外部中断,记得设置GPIO上拉。。。
5、当需要引用.lib文件时,注意勾选Option/Target/Use MicroLIB,否则将找不到.lib文件
6、针对正点原子的sys.c,在将代码移植到非keil的ide,如IAR或者基于arm-gcc-none-eabi交叉编译器的环境时,第九十行开始会报错
//THUMB指令不支持汇编内联 //采用如下方法实现执行汇编指令WFI __asm void WFI_SET(void) { WFI; } //关闭所有中断(但是不包括fault和NMI中断) __asm void INTX_DISABLE(void) { CPSID I BX LR } //开启所有中断 __asm void INTX_ENABLE(void) { CPSIE I BX LR } //设置栈顶地址 //addr:栈顶地址 __asm void MSR_MSP(u32 addr) { MSR MSP, r0 //set Main Stack value BX r14 }
这是针对于keil不支持汇编内联做出的修改,但这么写在其他地方会报错,改为如下代码即可
//THUMB指令不支持汇编内联 //采用如下方法实现执行汇编指令WFI void WFI_SET(void) { asm("WFI"); } //关闭所有中断(但是不包括fault和NMI中断) void INTX_DISABLE(void) { asm("CPSID I"); asm("BX LR"); } //开启所有中断 void INTX_ENABLE(void) { asm("CPSIE I"); asm("BX LR"); } //设置栈顶地址 //addr:栈顶地址 void MSR_MSP(u32 addr) { asm("MSR MSP, r0"); //set Main Stack value asm("BX r14"); }
7、使用CubeMX生成TIM的PWM Channel时注意,先指定IO,再配置通道,且生成后MspInit里GPIO特性需要按需修改
8、切记切记,使用DMA方式的ADC时,注意要先调用DMA的Init,后调用ADC的Init!!!否则程序将卡死
9、标准库移植到HAL库时,有很多需要注意的地方,例如GPIO的配置,标准库Init中并没有Pull这一成员,而是将Pull归入Mode,故移植到HAL要注意加上Pull的配置