IAP升级程序中Bootloader和APP程序中断复用的解决办法

菜鸟级别(像我这样的),高手可以给予我们菜鸟一族指点指点或者点击叉叉离开


相信大家在实现了
STM32USB_DFU或者原子的串口升级APP程序,因为Bootloader程序中用到了USB的相关中断,在APP程序中同样也用到了相同的中断,这时是不是就乱套了呢?

的确是乱套了,不过还是有解决办法的。下面为大家演示一下:(可以用我这个DFU功能http://www.openedv.com/posts/list/28532.htm或者原子战舰光盘的例程:实验48 串口IAP实验)
使用的资源:

1、ST官方库函数V3.5

2、两个LED灯,一个红色LED0,一个蓝色LED1

红色LED指示的是进入DFU模式的USB中断唤醒点亮

蓝色LED指示的是进入USB读卡器模式的USB唤醒点亮

3、前面的STM32_DFU_Bootloader程序,STM32读卡器程序

第一、在正常的DFU移植的时候做法在APP程序中的main函数开头加入修改中断向量表地址的语句
      
SCB->VTOR = FLASH_BASE | 0X30000;(偏移值视情况而定,不一定按这个参数

第二、假设APP程序中没有用到和Bootloader中的中断服务函数的时候,一切运行正常,当用上的时候             呢???

第三、通过前面的方法,在USB读卡器实验程序中的main函数开头增加
            SCB->VTOR = FLASH_BASE | 0X30000;语句,编译后DFU下载到板子上复位运行,这时可以进入板子       可以进入USB读卡器模式。
      
但是,当你插上USB线连接电脑的时候,问题来了,电脑弹出提示框提示无法识别的USB设备。是不是       意味着就不能这样用了呢??


第四、这时我们就看看STM32程序执行的流程怎么走的(参考原子的《STM32开发指南-库函数版                 本 V1.2 .pdf》中的APP程序执行图)


      具体解说这个流程图请参考原子《STM32开发指南-库函数版本 V1.2 .pdf》第700页开头的解说。

      图中知道这么一个消息,在执行APP程序中发生了中断请求,程序仍然跳转到了0x0800 0004这个中断向       量表地址去提取相关的中断服务函数执行,问题就来了,在这个地址存放的是BootloaderUSB中断服       务函数,读取了,USB枚举的时候就来了,因为DFUUSB枚举参数和USB读卡器枚举的参数不一样,       所以就发生了电脑无法识别的USB设备的错误提示框。是不是蒙了呢???【具体可以对照代             码usb_desc.c中的字符串描述内容等】

第五、不用怕,看到图53.1.2中的第步跳转,下面编辑代码验证一下。

A、USB读卡器中也用到了USB的相关中断,有两个还是和Bootloader中的USB中断服务函数一样的调用。
   具体可以参考我这个帖子
http://www.openedv.com/posts/list/27484.htm或者原子战舰光盘里面的例    程:实验50 USB读卡器实验
   都用到的函数是:USB_LP_CAN1_RX0_IRQHandler()USBWakeUp_IRQHandler()

B、
Bootloader程序中,USB唤醒中断服务函数增加LED0红色LED指示(试过想在LCD上显示字符来的,加   了LCD显示字符语句电脑识别设备失败,具体原因可能显示字符时间太长了)


C、 编译成功后下载到板子上,按住 Bootloader 程序中设定的按键后复位开发板,显示 DFU 模式界面时插          上 USB 连接电脑。

      图中红色框框中显示的是进入了DFU模式
      
图中蓝色框框红色LED点亮,说明进入的是Bootloader中的USB唤醒中断服务函数。

第六、USB读卡器程序中,USB唤醒中断服务函数增加LED1蓝色LED指示


第七、这时我不在main函数开头处加写中断向量表地址重设代码,我直接修改“system_stm32f10x.c”文件       中“void SystemInit (void)”函数末尾的代码,修改如下


第八、编译成功后通过DFU下载到板子上,复位进入如下界面


      图中红色框框显示了USB读卡器实验
      
图中蓝色框框是读取到了TF卡(我用的)的容量信息

第九、这时插上USB线连接电脑,板子上显示如下界面


      图中红色框框显示USB读卡器模式,已经连接上电脑

      图中蓝色框框显示的蓝色LED点亮,说明已经进入USB读卡器的USB唤醒中断服务函数了。(前面我       的Bootloader程序中的USB唤醒中断也点了灯的,红色不亮

第十、电脑上已经正常识别到了STM32开发板上的USB读卡器了,电脑进去,双击打开可移动磁盘,里面内容


第十一、看到TF的内容了,说明已经成功了,可以进行读、写、删除等操作尝试。

第十二、不相信的话可以用读卡器将你开发板上的TF卡在电脑上看下里面的内容


最后,至于为什么这样改就可以了呢?打开我们程序中的启动文件代码看下,有这么一段


然后再看下面的代码


完全汇编,是不是看不懂呢???结合前面的图53.1.2来看下就知道什么意思了,呵呵,自己琢磨一下吧。

至于寄存器操作的没试过,大家自己依葫芦画瓢吧。。。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于STM32 IAP串口升级bootloader程序案例,我可以给您提供一些参考信息。 首先,IAP(In-Application Programming)是指在应用程序运行时,通过编程方式对内部Flash进行编程的技术。而bootloader程序则是一种特殊的应用程序,它可以在系统启动时运行,用于升级或者恢复系统。 在STM32使用IAP实现串口升级的过程一般如下: 1. 编写bootloader程序,该程序需要实现串口通信、Flash编程、跳转等功能。 2. 在应用程序加入升级代码,当需要升级时,将控制权交给bootloader程序。 3. bootloader程序通过串口接收新固件数据,将数据写入Flash。 4. 升级完成后,跳转回应用程序,完成升级。 以下是一个简单的bootloader程序的示例代码,仅供参考: ``` #include "stm32f10x.h" #define APP_ADDRESS 0x08008000 typedef void (*pFunction)(void); int main(void) { // 初始化串口、GPIO等 // ... // 判断是否需要升级 if (need_upgrade()) { // 进入升级模式 upgrade_mode(); } else { // 跳转到应用程序 jump_to_app(); } while (1) { // 等待升级或者运行应用程序 } } void upgrade_mode(void) { // 初始化Flash编程 // ... // 接收新固件数据,并写入Flash while (1) { // 接收数据 // ... // 写入Flash // ... if (upgrade_complete()) { // 升级完成,跳转到应用程序 jump_to_app(); } } } void jump_to_app(void) { pFunction app_entry = (pFunction)APP_ADDRESS; __set_MSP(*(__IO uint32_t*)APP_ADDRESS); app_entry(); } ``` 需要注意的是,实现IAP串口升级需要对STM32的Flash编程、串口通信、跳转等方面有一定的了解,同时还需要考虑固件的安全性和稳定性,因此建议在实际应用谨慎使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值