【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的配置

        

原文地址:https://www.cnblogs.com/ZYQS/p/14783426.html