<C语言>从零开始手写BootLoader--STM32L073/IAR/HAL库

本文详细介绍了如何从零开始使用STM32L073单片机的BootLoader,包括使用IAR和HAL库烧录App程序,设置中断向量,以及通过串口传输并执行。重点讲解了程序空间分配、代码迁移和跳转过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从零开始手写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空间的最大值,需要再查具体芯片的型号规格,如果意外写入到错误的地址࿰

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值