×
单片机 > 单片机程序设计 > 详情

Stm32编译自己总结的技巧(可能适应于任何keil编译)

发布时间:2020-05-30 发布时间:
|
1.定义的函数名字和数组名字不能相同,否则报错
2.定义无参函数的时候要加void  否则加上函数声明的时候在编译的时候会出现警告
3.任何函数  必须首先进行变量声明,然后才能是可执行的语句(declaration may not appear after       executable statement in block)
4.内核中断可以硬件自己清标志位,外设中断必须手动(软件)清标志位
5.定义变量的时候,如果不预先赋初值,则初始值就不一定是0;对于初值有要求的,一定要定义的时候赋值,切记!
6.同一中断线上的中断口只能用一个,比如PA1和PB1只能用一个但是可以选择进中断后判断电平来计算
7.keil工程路径不能太深,而且名字(每一层文件夹名字)不能过长,否则不能进入debug或者进入之后不能正常调试。
8.如果可以进debug。但是不能打断点,尝试将工程配置恢复默认(下面的default),同时删除自动生成的所有文件,重新试一下,曾经这样成功过(用st—link2),具体原因不明。(后发现是接触不良)
9.中断初始化的时候如果出现死在NVIC_Init(&NVIC_InitStructure);这一句上面,很有可能是无限进中断,因为第一次进中断貌似和配置没有关系,而且有些中断如果不清中断标志位,则会一直进,所以一定在中断服务函数里面清中断标志位。特别是TIM定时器。
10.预处理指令中使用了反斜杠,这里解释一下:每一条预处理语句总是以"#"字符开始,并且不能超过一行,一旦遇到换行符语句就被当做结束,唯一的一种能将预处理语句扩展到多行的办法就是在换行符之前加一个反斜杠('')。

11.定义指针,一定要先初始化,否则意想不到的后果。

12.stm32 spi1和spi的通用的配置函数,spi1比spi2快一倍,因此可能影响传输距离和速度(测试于sd卡通信得知)

13.keil如果无法打断点,而且是全部不能打断点,可能是勾选了Download to Flash;(位置:Debug—》setting--》(debug选项卡右下角))

14.stm32在系统初始化之前最好加个延时,否则可能会出错(一般都是电源不稳定,复位电路不稳定造成的),这个延时只能是for循环延时,在系统做任何操作之前,此只是为解决办法,并不是根本原因。原则上讲,电路应该做一个RC复位电路,上电之前复位。

15. 如果出现编译不报错,但是就是有个红X提醒,可以把C99模式去掉编译下,再改回来就好了

16.KEIL MDK  中是否勾选使用 micro lib,可能会影响时序。调试RC522时候,模拟spi,其他通讯正常,在使用读写卡两个函数的时候,必须勾选才可以

17.STM32F0系列的对于stlink的线要求不能过长,可能驱动不起来,能检测到不代表就能用.

18.目前测试串口收发测试的时候,如果打个断点(keil中),到了断点暂停之后,如果串口在暂停状态下接收数据,那么继续运行之后将会死在串口接收中断里面,而且还查不到中断标识,传说是stm32的bug,在此标记(用的芯片stm32f030f4p6)

19.今天调试51的程序的时候,发现串口中断里面不要加入发送中断的判断和设置,否则,至少现在发现定时器和串口不能同时使用的问题.

20.同上,也是串口的问题,半个月之后发现新问题,因为这个串口协议时序要求比较强,一直会偶尔出现接收到错误的数据,后来在串口发送之前加上ES=0;发送完后ES=1;就ok了,意思就是发送过程中禁止串口中断;

21.在485总线上,任何时刻都只能有一个主机发送数据,而且其他485芯片必须处于接收状态,即使处于发送状态但是不发送数据也不行,否则会造成数据错误!

22.在进行判断语句的时候,c语言中==是比|(或),&(与)这些优先级高的,所以if(0==a&b)和if(0==(a&b))这两个是不一样的.



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会