网上好多初学者 都想知道如何更好的用IAP,BOOTLOADER 功能
我给大家一个我自己的基于Xmodem的例子,
开发环境 KEIL 5.14 + STD标准库
芯片 STM32F103ZET6 外部晶振8MHz
用串口1通讯,通讯收发都用查询方式,没有用中断
另外用了systick 来做固定时间的延时程序
下面直接上代码
延时程序部分,
其实这个代码我也是从网上摘录的,不过希望大家好好理解一下
udelay.c
1 #include "stm32f10x.h" 2 3 static u8 fac_us=0;//us延时倍乘数 4 static u16 fac_ms=0;//ms延时倍乘数 5 6 7 //初始化延迟函数 8 //SYSTICK的时钟固定为HCLK时钟的1/8 9 //SYSCLK:系统时钟 10 11 void uDelay_SysTick_init(u8 SYSCLK) 12 { 13 SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟 HCLK/8 //b->1011 14 fac_us=SYSCLK/8; 15 fac_ms=(u16)fac_us*1000; 16 } 17 18 19 //延时nms 20 //注意nms的范围 21 //SysTick->LOAD为24位寄存器,所以,最大延时为: 22 //nms<=0xffffff*8*1000/SYSCLK 23 //SYSCLK单位为Hz,nms单位为ms 24 //对72M条件下,nms<=1864 25 26 27 void uDelay_SysTick_ms(u16 nms) 28 { 29 u32 temp; 30 31 SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit) 32 33 SysTick->VAL =0x00; //清空计数器 34 SysTick->CTRL=0x01 ; //开始倒数 35 36 do 37 { 38 temp=SysTick->CTRL; 39 } 40 while(temp&0x01&&!(temp&(1<<16)));//等待时间到达 41 42 SysTick->CTRL=0x00; //关闭计数器 43 SysTick->VAL =0X00; //清空计数器 44 } 45 46 //延时nus 47 //nus为要延时的us数. 48 49 void uDelay_SysTick_us(u32 nus) 50 { 51 u32 temp; 52 SysTick->LOAD=nus*fac_us; //时间加载 53 54 SysTick->VAL=0x00; //清空计数器 55 SysTick->CTRL=0x01 ; //开始倒数 56 57 do 58 { 59 temp=SysTick->CTRL; 60 } 61 while(temp&0x01&&!(temp&(1<<16)));//等待时间到达 62 63 SysTick->CTRL=0x00; //关闭计数器 64 SysTick->VAL =0X00; //清空计数器 65 }