记录学习过程中遇到的问题
/* 程序跳转函数 */
typedef void (*Jump_Fun)(void);
void IAP_ExecuteApp (uint32_t App_Addr)
{
Jump_Fun JumpToApp;
if ( ( ( * ( __IO uint32_t * ) App_Addr ) & 0x2FFE0000 ) == 0x20000000 ) //检查栈顶地址是否合法.
{
JumpToApp = (Jump_Fun) * ( __IO uint32_t *)(App_Addr + 4); //用户代码区第二个字为程序开始地址(复位地址)
MSR_MSP( * ( __IO uint32_t * ) App_Addr ); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
JumpToApp(); //跳转到APP.
}
}
-
函数指针类型
2020.11.26
------------------------------------------------------------------------------------------------------------------ -
bootlodar程序和app程序烧入单片机但是app程序不运行。
-
keil生成bin文件的方法,在user,after build,那里填入
-
fromelf.exe --bin -o "$L@L.bin" "#L"
2020.11.27
------------------------------------------------------------------------------------------------------------------- -
利用上面链接 的教程实现了bootloader向app跳转。接下来flash的操作与片外flash的操作,实现app1与app2的转换。
-
参照b站up的历程进行
2020.12.01
-------------------------------------------------------------------------------------------------------------------- -
今天看了下读取片内flash的数据,有个疑惑如下图
大致是读到的数据和内存里面存储的高低位不一致,(根据手册内存与地址分配,每一地址有一字节的数据)通过查找,stm32数据低地址数据在前,连续读两位数据就会出现这种看似不对照的现象,通过读一个字节可以验证
-
以及这篇写的很详细这个还有这个
2020.12.02
------------------------------------------------------------------------------------------------------------------- -
下面这句的作用是读取app程序执行程序地址的前四位,这个数据代表的是栈的顶地址,通过判断栈顶地址值是否正确来判断是否已经下载用户应用程序。因为用户程序的启动文件开始会初始化栈空间,如果栈顶地址正确,说明用户程序已经下载。
if ( ( ( * ( __IO uint32_t * ) App_Addr ) & 0x2FFE0000 ) == 0x20000000 ) //检查栈顶地址是否合法.