1. 工程可以正常运行,部分模块运行不正常,比如串口。
解决方法:工程的时钟配置不对,对于工程的时钟树的理解,时钟源可以分为外部晶振和内部晶振,一般选择外部晶振然后需要对时钟源进行倍频和分频,验证时钟的方法可以是观察对应时钟寄存器的值,然后主时钟对了之后在对外设时钟进行检查,其中有一个外部时钟源的宏定义只会影响到串口和iis,需要特别注意。
2. 串口配置不对的问题,以及串口配置需要注意的问题。
注意事项:串口配置一般分为四个步骤,引脚初始化,时钟初始化,串口发送接收配置,最后是中断配置。一般来说,中断配置发送的话是可以不用配置的,如果串口发送不成功,先检查引脚配置,检查下引脚配置是否相匹配,模式是否正确。特别注明:引脚需要AF配置,不然会造成串口发送不成功的情况。在检查时钟配置,时钟配置可以检查串口的时钟和引脚的时钟是否正确打开,最后检查下波特率的问题。一般来说,串口配置不对,不是引脚就是时钟。最后需要注意,中断入口地址。
3. 全局变量输出乱码问题。
问题描述:初始化一个全局变量,输出全局变量到上位机,上位机出现乱码。
解决方法:单步运行,发现全局变量初始化完成以后存在没有清零的内存,导致输出乱码。但是从语言的角度来看,全局变量初始化完成以后,有初值的全局变量应该是赋初值,剩余部分清零,所以不存在说没有清零的问题。之后从程序开始的地方单步运行,观察全局变量内存地址,发现全局变量是正确初始化的,但是执行一次赋值语句的时候指针越界,导致内存溢出,影响了全局变量的值,最后检查指针的范围解决问题。更加坚信,指针操作需要注意不能越界。收获:重新理解全局变量的初始化。
4. iic读写问题。
问题描述:iic驱动自己写的,读写iic设备的时候奇数地址的寄存器可以读到数值,偶数地址的寄存器无法读到正确的数值。
解决方法:开始怀疑硬件问题,因为同一个驱动不应该存在这种问题,后检查发现时序存在问题,没有在结束位做相应的拉低拉高操作,奇数寄存器可以只是因为最后一位是奇数会拉高总线,所以可以成功。所以这种类似的问题只有可能是软件问题,不可能是硬件问题。
发现问题的方法:使用逻辑分析仪抓时序,对照数据手册检查时序。
5.SDIO读写sd卡与flash写入冲突问题
问题描述:SD卡可以正常操作,可以使用DMA读或者写入。同时单独写入flash也是可以正常工作,俩个结合在一起的时候,SD卡仍然可以正常操作,此时flash读取正常,flash写入错误。
解决方法:此问题没有深入研究,项目被中断,初步怀疑是flash写入被dma中断,导致写入失败。
6. STM32f413下载程序失败
问题描述:新画的板子,刚到手下载程序运行,第一次下载成功,成功后程序运行不正常。继续下载debug,发现下载失败,flash擦除失败,更换第二块板子,情况相同。
解决方法:检查外部晶振与倍频系数,发现芯片最高工作时钟为100M,倍频系数没有修改,外部晶振为24M,发生倍频现象导致芯片不能正常工作。后尝试跟换外部晶振,使用低频率的外部晶振,程序下载成功。后修改倍频系数。程序正常工作。
7. STM32f4执行擦除flash操作是,debug时直接退出debug模式
问题描述:执行flash读写操作的时候,写入flash数据需要先擦除flash,当时为检查读写是否正确,打开memory窗口观察flash数据,后擦除flash一直失败,执行到FLASH->CR |= FLASH_CR_STRT时,程序跳出debug模式。尝试注释掉FLASH->CR |= FLASH_CR_STRT时,程序正常,但不能正常实现功能,FLASH->CR |= FLASH_CR_STRT为擦除flash操作。
解决方法:查找原因,在程序擦除flash的时候,不能有其他读写flash的操作,特别此处,mdk的memory窗口是读写的芯片flash并显示。于是关闭memory窗口,程序正常运行。在flash操作后,打开memory窗口,一切正常。
8. 从keil移植boot程序到iar平台
问题描述:keil平台的芯片是stm32f405,移植到iar下的stm32f103。新建工程后(iar和keil下的驱动文件不一样,需要新建工程),编译通过没有问题。移植过程中发现,flash可以正常擦除读写,但是每次写完flash之后总是出现段错误。
解决方法:查看flash内容,内容正常的,是正常写入的数据。在看map文件,写入数据地址为程序段地址,所以导致新写入的数据覆盖了boot程序内容,以致于发生段错误。验证问题,更改app程序偏移地址,问题得到解决。编写boot程序的时候,需要注意boot的程序大小,不能让app的偏移地址出现在程序所占用的内存段。