STM32F0 IAP编程说明
说明:我在选择全部选择,但是图片并没有出现在帖子中,在附件中有说明和测试代码。代码是直接中官网下载来的的,做了一点改动。
一、功能概述:
a)IAP编程是我们在方便后期维护升级而使用的一种手段,在没有IAP的情况下,我们需要使用SWD等编程工具来实现相关的代码编辑,在使用IAP后,我们可以让人带烧写一个IAP自举程序,而不是我们实际的全功能程序。在IC实际贴到PCB后然后使用一个串口工具来实现对单片机的升级操作。
二、具体实现方法说明:
a)在本文件中有两个程序,一个是bootloader ,另一个是APP程序。
i.对于bootload的说明:
1.这个代码是在官网上面直接down下来的,在STM32F051开发板上面跑,但是本人手里没有这个测试版,故对代码进行了一点修改,让其在上电的时候就进入到bootload 程序,在超级终端上面进行相关来实现功能选择。
ii.在把本程序下载到051的硬件板后,正确的链接到串口,要求使用的串口配置如图所示:。
iii.复位单片机后应该出现如下界面:
iv.在超级终端中输入“1”,将看到如下界面:
v.在这种情况下则表示可以进行相关程序下载了。点击传送将出现如下界面:
vi.选择你需要下载bin文件,选择Ymodem协议点击发送,将出现如下界面:
vii.在下载完成后将出现如下界面:
viii.
ix.出现上述界面,只是你的程序已经下载成功,但是还没有跳转到你的应用APP程序,需要将单片机重新启动,并输入3后即可看到你自己的APP程序在运行了。
b)对于App成的修改如下:
i.想尽各种办法出现如下界面:并将蓝 {MOD}区域的数值修改为0x08003000
ii.修改memory的数值如下图所示:
iii.对自己的应用程序添加如下代码:
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define APPLICATION_ADDRESS (uint32_t)0x08003000
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
static __IO uint32_t TimingDelay; //这个可以去掉
// 下边的宏编译好像和编译器有关系
#if (defined ( __CC_ARM ))
__IO uint32_t VectorTable[48] __attribute__((at(0x20000000)));
#elif (defined (__ICCARM__))
#pragma location = 0x20000000
__no_init __IO uint32_t VectorTable[48];
#elif defined ( __GNUC__ )
__IO uint32_t VectorTable[48] __attribute__((section(".RAMVectorTable")));
#elif defined ( __TASKING__ )
__IO uint32_t VectorTable[48] __at(0x20000000);
#endif
iv.在单片机初始化函数中加入如下代码: 这个按照英文解释好像是中断向量表的重映射。注意这个一定要初始化在你中断启动之前,否则将出现各种神坑。
/* Copy the vector table from the Flash (mapped at the base of the application
load address 0x08003000) to the base address of the SRAM at 0x20000000. */
for(i = 0; i < 48; i++)
{
VectorTable[i] = *(__IO uint32_t*)(APPLICATION_ADDRESS + (i<<2));
}
/* Enable the SYSCFG peripheral clock*/
RCC_APB2PeriphResetCmd(RCC_APB2Periph_SYSCFG, ENABLE);
/* Remap SRAM at 0x00000000 */
SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);
v.
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
不能用,F0的flash操作方法和F1的好像不一样,你可以在官网上面下一个dome 测试一下
/* Relocate by software the vector table to the internal SRAM at 0x20000000 ***/
/* Copy the vector table from the Flash (mapped at the base of the application
load address 0x08003000) to the base address of the SRAM at 0x20000000. */
for(i = 0; i < 48; i++)
{
VectorTable = *(__IO uint32_t*)(APPLICATION_ADDRESS + (i<<2));
}
/* Enable the SYSCFG peripheral clock*/
RCC_APB2PeriphResetCmd(RCC_APB2Periph_SYSCFG, ENABLE);
/* Remap SRAM at 0x00000000 */
SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);
应改为:RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
一周热门 更多>