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))这两个是不一样的.
23.如果程序调试的时候点运行就闪一下,死到systemint里面,应该是断点打太多了;
24.一旦出现下载失败,异常的情况,优先检查复位电路!
25.485收发测试的时候一定要注意A,B线上的电容,千万不能过大;
26.STM32F030系列RTC没有后备电池供应引脚,即VBAT引脚.
27.STM32因为时钟问题,在修改比较低的波特率的时候要特别注意(比如本次要修改usart1的波特率为600,那么就
要将apb2的分别多设置一点,降低总线频率,才能设置成功,RCC_PCLK2Config(RCC_HCLK_Div4);)
28.TTL转485电路,记得要在TXD加上上拉电阻!否则调试的时候收到数据可能全为0(测试芯片MAX13487,其他应该类似);
29.Flash等待周期对于Stm32芯片,不同的运行频率可能影响性能,之前有文章测试因为没有规范设计等待周期,导
致芯片高温情况下死机的现象!
30.STM32usb接口在使用的时候切记加入ESD防护,
31.写程序的时候要特别注意内存溢出的问题,否则可能导致数据错乱;
上面这段程序TpicData[]只定义到TpicData[9],而实际运算过程中却可能多出来,如果不加if(temp1小于lowfloor)
continue;这个数组里面某个元素值会变化,但是实际却没有给它赋值;加上这个判断后,异常消失;
32.mfrc522调试过程中发现,当使用单天线的时候,软件配置成单天线方案,即SetBitMask(TxControlReg,0x02);相对较明显的提高读写卡效果;
33.在串口接收中断里判断当前接收的数据量是否超过缓存的最大值,之前的程序没有做这个处理,极容易出现数组溢出的问题(此次造成其他数组里的值错误);
34.MDK中 sprintf 输出浮点数据出错,很有可能是使用uscosii操作系统中没有做
8字节对齐是原因,解决办法就是堆栈数组强制为8字节对齐:
__align(8)
static OS_STK
AppTaskStartStk[APP_TASK_START_STK_SIZE];
详细解释参考:https://www.amobbs.com/thread-3258924-1-1.html