为了调试下载方便,个人整理了一份IAP_BOOT下载引导代码。在STM32F103上使用。
下载波特率可以设置2MHz的速度,下载程序超级快,使用341 USB转串口已经在使用。
(1),IAP_BOOT使用STM32串口下载软件下载到STM32芯片里。
(2),进入烧写条件
1、第一烧写,应用程序为空,自动进入程序下载状态。
2,上电PA2管脚判断进入。
3,应用程序跳转进入。(思维为向内存写人某个值,然后软件复位,boot检测内存值)
单片机源程序如下:
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "stmflash.h"
- #include "iap.h"
- #include "key.h"
- int main(void)
- {
- u16 oldcount=0; //老的串口接收数据值
- u16 applenth=0; //接收到的app代码长度
- char ready = 0;
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
- delay_init(168); //初始化延时函数
- // USART3_Init(115200); //初始化串口波特率为460800
- USART6_Init(115200);
- // KEY_Init();
-
- while(1)
- {
- if(ready == 0)
- {
- printf("等待接收bin文件......\n");
- ready = 1;
- }
- if(USART_RX_CNT)
- {
- delay_ms(10);
- if(oldcount==USART_RX_CNT)//新周期内,没有收到任何数据,认为本次数据接收完成.
- {
- applenth=USART_RX_CNT;
- oldcount=0;
- USART_RX_CNT=0;
- printf("用户程序接收完成!\r\n");
- printf("代码长度:%dBytes\r\n",applenth);
- if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
- {
- printf("开始更新固件...\r\n");
- iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,applenth);//更新FLASH代码
- printf("固件更新完成!\r\n");
- if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
- {
- while(KEY == 0)
- {
- iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
- }
- }
- else
- printf("非FLASH应用程序,无法执行!\r\n");
- }
- else
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
IAP_Bootloader.rar
(3.75 MB, 下载次数: 130)
|