GPIO输出操作—使用固件库点亮LED--- 调试总结

来源:互联网 发布:3g软件开发了解 编辑:程序博客网 时间:2024/06/07 13:32

 GPIO输出操作—使用固件库点亮LED--- 调试总结

       --------【王晓南于2016年11月12日下午编写此调试笔记】

1.代码写完毕后,keil5(MDK-ARM)编译通过,".\Objects\Gokit V2.axf" - 0 Error(s), 0 Warning(s).



2.通过STMFlashLoader Demo.exe(,ST官方ISP下载最新工具),Cortex-M3串口对STM32【Gokit v2.1开发板(stm32F103c8t6)】下载提示成功。



3.Gokit v2.1板子上电,将system开关拨至flash;按下复位按键,开始运行板子,GPIOB_Pin_11引脚连接的LED3灯没被点亮。给板子断电,上电复位,依然如此。



4.检查代码,由于使用库函数写的代码,依次检查main.c、bsp_LED.h和bsp_LED.c三个文件代码是否存在错误,发现main函数中已初始化GPIO口,已使用置位函数将GPIOx_Pin置位;main函数应该没什么问题;检查bsp_LED.c代码,只有一个GPIO口初始化函数,先定义了一个GPIO口初始化结构体/结构体成员赋值/调用库函数将初始化GPIO目标引脚为推免输出模式/,检查bsp_LED.h头文件宏定义和函数的声明都正确;代码核查后未找出BUG;


5.使用Keil(MDK-ARM)在线调试,发现问题*** error 65: access violation at 0x40021000 : no 'read' permission。且代码执行部分后,相应寄存器值未发生改变,设置默认的复位值都不正确。



6.在STM32F10x系列参考手册查询该地址对应为何地址空间,查询到为闪存存储器接口地址空间。



7.现在已经明白了,代码无法读写此地址空间内的存储器。查询工程模板设置是否存在问题,查询opitons for Target魔术选项卡是否设置错误。


8.设置好Debug选项卡里的Dialog DLL和Parameter

因为Gokit v2.1板子上使用的是STM32F103C8芯片,所以Dialog DLL设置为DARMSTM.DLL ;Parameter设置为-pSTM32F103C8


9.再次编译,keil5(MDK-ARM)编译通过,".\Objects\Gokit V2.axf" - 0 Error(s), 0 Warning(s).使用Keil(MDK-ARM)在线调试,command窗口无读写错误提示,设置断点全速运行代码,相应寄存器值监控发生改变。已按代码执行到目标值配置好相应的寄存器。



10.编译生产hex文件,保存工程,使用STMFlashLoader Demo将代码烧录到Gokit v2.1板子上,Gokit v2.1板子上电,将system开关拨至flash;按下复位按键,开始运行板子,GPIOB_Pin_11引脚连接的LED3灯没被点亮。给板子断电,上电复位,依然未点亮LED3。

。。。说明只解决了部分问题,依然存在其他bug!


11.返回工程,检查代码,因为在线调试过程中相应寄存器都已按代码执行,写入正确值。但下载到板子中LED3却未被点亮,怀疑灯点亮时间太短,肉眼未识别出来,断点代码单步执行,发现最终代码执行到库函数中while(1)就停止了,猜想正确,代码未在main函数体中自动循环,加上while大循环,问题解决。下载到板子中LED3成功点亮。



12.此次代码bug调整花了2个小时左右,前期反复查看代码,并未找出bug,后期直接在线调试监控寄存器状态和监控变量值发现存在问题;网上查询此问题产生原因,找到使用模拟器仿真时,debug选项卡参数设置存在问题,修改参数,在线调试,可正常读写闪存,后面软件在线调试正确,下载板子后,LED3仍未点亮,代码未大循环,如有后期有条件,最好使用硬件仿真在线调试,查找故障bug速度应该更快。


13.使用固件库编程优点:

      a.无需直接操作寄存器,给寄存器一个个赋值操作,避免繁琐赋值,写代码效率低;

      b.使用固件库编写的代码可读性非常好;

      c.可移植性非常好。

0 0