[应用相关] 关于STM32 IAP

[复制链接]
2418|53
monitoring 发表于 2020-5-17 11:26 | 显示全部楼层
毕竟是用户程序,串口1可能要参与别的通信,,,所以自己加了一个判断是否是要更新程序的数据,,,是的话才往Flash里面写

自己的源码

链接:http://pan.baidu.com/s/1bJtc78密码:nobu
monitoring 发表于 2020-5-17 11:27 | 显示全部楼层
这两天发现了自己程序的Bug

1,如果用户程序主函数加入延时,那么程序就来不及读出然后写到Flash里面,串口却不停的往环形队列里面写,从而造成环形队列溢出....

再者如果写入的时候,设置的串口助手的波特率太快,,,,同样也会造成环形队列溢出(就是往环形队列写的太快了)....

自己把写Flash的程序放在了定时器里面,50Us进入一次的定时器,看着网上说往Flash写一个字节大约16Us,,,,加上其余的程序整体应该不会超过50Us
monitoring 发表于 2020-5-17 11:28 | 显示全部楼层
如果有溢出程序不在往环形队列里面写了
  1. voidUSART1_IRQHandler(void)//串口1中断服务程序
  2. {
  3. u8 Res;if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//接收中断(接收到的数据必须是0x0d 0x0a结尾)
  4. {
  5. Res=USART_ReceiveData(USART1);//读取接收到的数据
  6. if(Overflow==0)

  7. {
  8. if(PutData(&Res,1) == -1)

  9. {

  10. Overflow=1;

  11. }

  12. }

  13. Usart1RecCnt++;

  14. }

  15. }
monitoring 发表于 2020-5-17 11:29 | 显示全部楼层
最后接收完如果判断溢出过,直接复位重启,复位重启更方便直接...

  1. if(Usart1Flage ==1)//串口1接收完成
  2. {

  3. addr2=FLASH_APP2_ADDR;

  4. Usart1Flage=0;if(Overflow==1)//如果中途溢出了
  5. {

  6. printf("程序中途溢出,准备复位重启!!\r\n");

  7. Reset_MCU();//复位重启CPU
  8. }
monitoring 发表于 2020-5-17 11:30 | 显示全部楼层
2,如果写了一些后,突然因为某些原因停止了写入,,,,,本想在程序中观察末尾有什么固定的数据没有,,,,或者自己最后加一些标志位

但是这个现在程序好像能判断出来....但是自己一直没有明白程序为什么可以判断出来............应该判断不出来的......

后来一想现在反正是自己去更新程序,真不行可以直接烧,,,,就先放一放,,,,
monitoring 发表于 2020-5-17 11:30 | 显示全部楼层
更改后的

链接:http://pan.baidu.com/s/1slnWFVJ密码:mts7
monitoring 发表于 2020-5-17 11:31 | 显示全部楼层

作者:杨奉武
链接:https://www.jianshu.com/p/8eb8465d5dee
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
henglin 发表于 2020-5-24 22:44 | 显示全部楼层
磨砂 发表于 2020-6-5 16:41 | 显示全部楼层
非常感谢楼主分享
晓伍 发表于 2020-6-5 16:41 | 显示全部楼层
这也太有文采了
八层楼 发表于 2020-6-5 16:41 | 显示全部楼层
内容很不错啊
观海 发表于 2020-6-5 16:42 | 显示全部楼层
楼主辛苦了
guanjiaer 发表于 2020-6-5 16:42 | 显示全部楼层
非常不错 很有用
5574293 发表于 2020-7-1 15:29 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部