从零开始手写BootLoader–STM32L073/IAR/HAL库
一、测试平台:
MCU:STM32L073V8T6(Cortex-M0+)
固件库:HAL+STM Cube
IDE:IAR For STM32
二、实验目的
使用BootLoader通过串口将程序bin文件烧录至单片机内,然后跳转到烧录位置运行程序。
三、基础知识
STM32L073V8T6的启动方式有三种:内置FLASH启动、内置SRAM启动、系统存储器ROM启动,通过BOOT0和BOOT1引脚的设置可以选择从哪中方式启动,这里选择内置的FLASH启动。
四、准备
1 基础功能代码:使用STMCube代码生成器生成,在本实验中开启按键输入、LED引脚与串口4,配置时钟为MSI(4.194MHz)。此部分代码不予演示。
2 App程序:用户最终使用的应用程序(以下用App代替),复位后LED点亮,在while中循环发送字符串。
#define CODE_OFFSET 0x8000
int main(void)
{
__disable_irq();
SCB->VTOR = FLASH_BASE | CODE_OFFSET ;
__enable_irq();
HAL_Init();
System_HSIClock_Config();
System_Port_Config();
HAL_UART_Receive_IT(&huart4,&Uart4_RX_Char,1);
while(1)
{
char str[] = "test\r\n";
HAL_UART_Transmit(&huart4,str,strlen(str),1000);
HAL_Delay(500);
LED_Pulse;
}
}
相较于普通程序,App程序需要做以下两点修改
(1)在程序的起始阶段重定位中断向量表
__disable_irq();//关闭全局中断,若未关闭,此时BootLoader程序仍可产生中断,会发生意想不到的错误
SCB->VTOR = FLASH_BASE | CODE_OFFSET ;//设置中断向量的偏移,使得中断能够跳转到正常的位置
__enable_irq();//开启全局中断
(2)在IAR中配置烧录位置
这里将烧录位置设置为0x0800 8000
编译生成bin文件
3 BootLoader程序:引导App程序运行。
五、BootLoader
1 分配程序空间
通过芯片手册得知STM32L073V8T6内部flash为64K
注意:这里的参考手册给出的是L0x3系列flash空间的最大值,需要再查具体芯片的型号规格,如果意外写入到错误的地址