概述:本程序上电等3秒种,期间每隔10ms检测一次串口是否收到握手指令(0x7F),若收到则跳转到isp程序执行。可以用mcuisp软件通过串口1直接升级程序。是一种简单的iap程序。初次下载需要手动让mcu进入isp模式。
1先看看最终效果:成功!
2.实现isp跳转
stm32的isp程序在系统存储区,可以通过boot0,boot1引脚选择,也可以通过程序直接跳转,isp程序的入口地址为 0x1FFFF000
跳转函数如下:
#define ISP_ADDR 0x1FFFF000
void IspProgramRun(void)
{
u32 IspSpInitVal; //IAP程序的SP初值.
u32 IspJumpAddr; //IAP程序的跳转地址.即,IAP程序的入口.
void (*pIspFun)(void); //定义一个函数指针.用于指向APP程序入口.
// NVIC_DeInit (); //恢复NVIC为复位状态.使中断不再发生.
IspSpInitVal = *(u32 *)ISP_ADDR; //取APP的SP初值.
IspJumpAddr = *(u32 *)(ISP_ADDR + 4); //取程序入口.
__set_MSP(IspSpInitVal); //设置SP.
pIspFun = (void (*)(void))IspJumpAddr; //生成跳转函数.
(*pIspFun) (); //跳转.不再返回.
}
3.主函数代码如下:
int main(void)
{
SystemInit();//初始化RCC 设置系统主频为72MHZ
delay_init(72); //延时初始化
Usart_Init(115200);
for(bootcount = 0;bootcount < 300;bootcount++)
{
if(USART1_RX_BUF[0] == 0x7F) IspProgramRun();
delay_ms(10);
}
LED_Init();
KEY_Init();
while(1)
{
keynum = KEY_Scan();
if(keynum == 1)
{
if(RESET == GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_8)) LED0_OFF();
else LED0_ON();
}
if(keynum == 2)
{
if(RESET == GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_2)) LED1_OFF();
else LED1_ON();
}
keynum = 0;
};
}
上一篇:stm32的两种固件下载模式:JTAG和SWD
下一篇:STM32F103关闭SWD/JTAG功能无法烧录时处理方法
推荐阅读最新更新时间:2024-03-16 16:22