历史上的今天
今天是:2025年01月16日(星期四)
2019年01月16日 | stm32 iap跳转isp实现上电isp下载
2019-01-16 来源:eefocus
概述:本程序上电等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;
};
}
史海拾趣
|
TH58NVG6D2ETA20 的nand flash要求1KB 24 bit ECC,如果我用512B 12 bit ECC代替是否会有风险,谢谢~~ nand flash的bit error rate跟那些因素相关?… 查看全部问答> |
|
高级硬件工程师,年薪最低10万,根据个人能力而定: 1 熟悉单片机,数字电路,熟悉VC/C++,Protel99,USB及NT下的编程 2 有32位单片机应用开发经验者优先 3 电子,通讯类相关专业,有大型嵌入式开发经验者优先 硬件开发部经理,年薪最低12万,根据个人能力 ...… 查看全部问答> |
|
STM32的数据手册是根据2007年11月英文第四版翻译而成。英文原文下载地址:http://www.st.com/stonline/products/literature/ds/13586.pdfSTM32的技术参考手册是根据2007年11月英文第二版翻译而成。英文原文下载地址:http://www.st.com/stonli ...… 查看全部问答> |
|
用ST触摸库做了几款产品了, 在办公室测试没有问题, 但是到车间生产的时候灵敏度就明显下降 目前总出货量已经超过8K了,也没有接到相关投诉,所以我想是不是我们车间特有的什么干扰造成的 想问问其他TX有没有这样的问题??怎么解决的?? 谢谢!… 查看全部问答> |
|
现在只是在论坛上看到了FPGA的板子,可是要到哪里才能弄到仿真器呢? 希望论坛能够开展一个“USB接口的FPGA仿真器”的DIY活动, 谢谢… 查看全部问答> |
|
【我给XILINX资源中心做贡献】EEWORD史上最全的FPGA论文集 EEWORD史上最全的FPGA论文集 大小 200M 传上来不容易呀 [ 本帖最后由 wanghongyang 于 2011-4-27 12:18 编辑 ]… 查看全部问答> |




