1. IAP(bootloader)程序
1.1 内部Flash地址分配
/* Start of the Flash address */ #define STM32_FLASH_BASE 0x08000000 /* End of the Flash address */ #define STM32_FLASH_END_ADDRESS 0x081FFFFF //Flash Size 2MB /* Define the IAP application size */ #define IAP_FLASH_SIZE 0x8000 //bootloader size 32KB /* Define the address from where user application will be loaded. */ #define FLASH_APP_ADDR (uint32_t)(STM32_FLASH_BASE+IAP_FLASH_SIZE) /* Define the user application size */ #define FLASH_APP_SIZE (STM32_FLASH_END_ADDRESS - FLASH_APP_ADDR + 1)
1)设置内部Flash起始地址(STM32_FLASH_BASE):固定值0x0800 0000
2)设置内部Flash结束地址(STM32_FLASH_END_ADDRESS):根据实际使用的芯片闪存大小进行设置,因为我使用的是STM32F429ZIT6,其闪存大小为2MB,这里设置为0x081F FFFF
3)设置IAP程序Size(IAP_FLASH_SIZE):一般为16Kb左右(0x4000)。这里设置为0x8000即32KB(0x0800 0000~0x0800 7FFF),占用扇区0和扇区1。
4)设置APP程序起始地址(FLASH_APP_ADDR):STM32F4内部Flash起始地址 + IAP程序Size=0x0800 8000
5)设置APP程序Size(FLASH_APP_SIZE):内部Flash结束地址 - APP程序起始地址 + 1
1.2 MDK编译器中设置IAP程序下载起始地址与大小
这里设置将IAP程序下载到STM32_FLASH_BASE = 0x0800 0000,大小IAP_FLASH_SIZE = 0x8000(这里设置和IAP_FLASH_SIZE值一致,可以保证当IAP程序大于32KB时,编译器会报错,这时你需要考虑修改IAP_FLASH_SIZE的值,或者精简代码)
1.3 设置中断向量表起始地址
在main()函数开始的位置加入以下代码,设置中断向量表存放在SCB->VTOR + 4 = 0x0800 0004起始的地址:
SCB->VTOR = FLASH_BASE | 0x00;//设置中断向量表偏移量. 也可以在SystemInit() 里设置VECT_TAB_OFFSET
2. APP应用程序
2.1 MDK编译器中设置APP程序下载起始地址与大小
APP起始地址和上面1.1.4)中FLASH_APP_ADDR的值一致,Size设置为0x0020 0000,即2MB。
2.2 设置中断向量表起始地址
在main()函数开始的位置加入以下代码,设置中断向量表存放在SCB->VTOR + 4 = 0x0800 8004起始的地址:
#define IAP_FLASH_SIZE 0x8000 //bootloader size 32KB SCB->VTOR = FLASH_BASE | IAP_FLASH_SIZE;//设置偏移量 FLASH_BASE | 0x8000
这里请注意:中断向量表存放的位置必须是0x200的倍数,因此,这里IAP_FLASH_SIZE 也必须是0x200的倍数,即0x00, 0x200, 0x400 ...
3. 在MDK生成.bin文件
D:keil5ARMARMCCinfromelf.exe --bin --output ../OBJ/PWM.bin ../OBJ/PWM.axf
fromelf: D:keil5ARMARMCCinfromelf.exe
MDK自带工具路径,笔者的路径如上所示,请修改为自己的路径(或者点击右边的文件夹小图标,找到该工具)。
[options]: --bin --output ../OBJ/PWM.bin
生成bin文件命令,想把生成的bin文件放在什么地方(记住路径最前面是 ../(两个点),而不是 ./(一个点),之前就被坑了)。
input_file: ../OBJ/PWM.axf
输入文件,这里是用axf格式的文件转换为bin文件,找到你工程里的axf文件所在位置,填上去就可以了。