第一部:STM32启动过程
启动模式:
1.从地址0X0000 0000 处取出堆栈指针MSP的初始值=栈顶地址
2.从地址0x0000 0004处取出程序计数器指针PC的初始值=复位向量(单片机是32位,每8位就是4个字节,所以地址+4)
以F1/F4系列:(F4第三种模式和F1有区别,但是不常用,需要请自己去看)
在系统复位后,SYSCLK的第4个上升沿,BOOT引脚的值将被说存(后面该引脚可以被用来做其他的)

基本都是前两者
启动过程: 以内部FLASH启动为例

需要查看启动文件:

只要定义main()函数,编译器会自动定义__main
Reset_Handle函数介绍:
Reset_Handler PROC //Reset_Handler 函数名
EXPORT Reset_Handler [WEAK] //表面全局属性,可被外部调用 [WEAK] 如果外部定义,则下面的程序作废,和#ifdenf endif功能差不多
IMPORT __main // 声明来之外部文件,类extern
IMPORT Systemlinit
LDR R0,=Systemlinit //调用Systemlinit ,这是非必须得,如果外部没有使用,可以屏蔽掉
BLX R0
LDR R0=__main
BX R0
ENDP

第二部分:IAP部分:
STM32三种烧录方式:
ISP 在系统编程:执行厂商的Bootloader程序进入ISP模式后,选择官方提供的烧录通信接口配置ISP编程工具对闪存进行烧录---需要进入启动模式中的模式二-系统寄存器
ICP在线编程:使用IDE并用过JTAG/SWD接口对闪存进行烧录
IAP在应用编程:使用用户的应用程序(Bootloader程序)对闪存进行烧录。将应用程序通过通信接口对闪存进行烧录----常被用做远程升级的手段
ISP和ICP都是程序hex文件,IAP生成bin文件
APP应用程序存放在Bootloader后预留(用作升级程序空间)后的位置
APP程序的生成步骤---以FLASH为例子
1. 设置APP程序的程序起始地址和存储空间大小
根据APP的程序设置
前面大小改进了,后面的位置也要更新变小,前面偏移64K,后面也要减小64K??
------------------------------插入如何看Bootloader程序大小------------------------------------------
双击工程名就会跳出.map文件
拉到最下面:可以看到 31.21K*1024=8800 设定的值要比这个大
--------------------------------------------------------------------------------------------------------------------------
APP要在Bootloader后, 内存不能出现重叠,偏移量是0x200的倍数
工程中预留了10000
FLASH_APP的运行内容是可以共享的;
如果是SRAM_APP程序的话,需要修改内存大小-
2:设置中断向量表的偏移量
/*** @brief 设置中断向量表偏移地址* @param baseaddr: 基址* @param offset: 偏移量* @retval 无在sys.c中提供*/void sys_nvic_set_vector_table(uint32_t baseaddr, uint32_t offset){/* 设置 NVIC 的向量表偏移寄存器,VTOR 低 9 位保留,即[8:0]保留 */SCB->VTOR = baseaddr | (offset & (uint32_t)0xFFFFFE00);}/* 设置中断向量表偏移量为 0x10000 */sys_nvic_set_vector_table(FLASH_BASE, 0x10000);
3.设置MDK编译后的运行fromelf.exe,生成.bin文件
指令:fromelf --bin -o ..\..\Output\@L.bin ..\..\Output\%L,
4.已经生成.bin文件进行烧录
1.使用串口接收,因为接收数组的大小需要大于APP的程序大小
2.通过串口助手发送,点击发送文件,选择全部文件,找到.bin发送过去
3.将接收后的数据写入FLASH,起始地址需要正确---APP的偏移地址
4.设置条件运行APP地址---从FLASH中读取







3805

被折叠的 条评论
为什么被折叠?



