stm32f103c8t6 hal iap例程
时间: 2025-02-22 08:29:57 浏览: 78
### STM32F103C8T6 使用 HAL 库实现 IAP 功能
为了在 STM32F103C8T6 上使用 HAL 库实现 IAP (In Application Programming),可以按照如下方式编写代码。此方法允许应用程序更新其自身的固件而无需外部编程器。
#### 主要概念
IAP 是一种使微控制器能够在运行时重新编程其内部闪存的技术[^1]。对于基于 HAL 的项目,主要涉及初始化、擦除扇区、写入数据到指定地址以及读取验证等功能。
#### 初始化配置
确保已经正确设置了系统时钟并启用了必要的外设时钟。还需要设置 USART 或其他通信接口用于接收新固件的数据流。
```c
#include "stm32f1xx_hal.h"
// 定义一些全局变量来保存接收到的新固件数据
uint8_t new_firmware_data[FLASH_PAGE_SIZE];
uint32_t firmware_address = APPLICATION_ADDRESS;
```
#### 函数定义
下面是一些关键函数的实现:
- **Flash_Erase()**: 按页或按扇区清除 Flash 存储区域。
- **Flash_Write():** 将给定缓冲区中的字节序列写入特定位置。
- **Verify_Flash():** 验证已烧录的内容是否与预期一致。
##### 清楚目标页面上的现有内容
```c
static void Flash_Erase(uint32_t address, uint32_t length){
FLASH_EraseInitTypeDef EraseInitStruct;
uint32_t PageError;
/* Unlock the Flash to enable the flash control register access */
HAL_FLASH_Unlock();
/* Fill EraseInit structure*/
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
EraseInitStruct.PageAddress = address;
EraseInitStruct.NbPages = (length + FLASH_PAGE_SIZE - 1) / FLASH_PAGE_SIZE;
if(HAL_OK != HAL_FLASHEx_Erase(&EraseInitStruct, &PageError)){
// Handle error here...
}
/* Lock the Flash to disable the flash control register access */
HAL_FLASH_Lock();
}
```
##### 向 Flash 中写入新的二进制文件
```c
static HAL_StatusTypeDef Flash_Write(uint32_t addr, const uint8_t *data, size_t len){
HAL_StatusTypeDef status;
while(len--){
if((addr % sizeof(uint32_t)) == 0 && ((len+1)%sizeof(uint32_t))==0){
uint32_t wordData = *(const uint32_t*)data;
status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr, wordData);
data += sizeof(uint32_t);
addr += sizeof(uint32_t);
}else{
uint8_t byteData = *data++;
status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, addr++, byteData);
}
if(status != HAL_OK){
break;
}
}
return status;
}
```
##### 校验刚刚写入的数据
```c
static bool Verify_Flash(const uint8_t* src, uint32_t dst_addr, size_t len){
volatile uint8_t* pDst = (volatile uint8_t*)dst_addr;
for(size_t i=0 ;i<len;i++){
if(*src++ != *pDst++) {
return false;
}
}
return true;
}
```
#### 接收并通过串口上传新固件
当通过 UART 收集到来自 PC 端发送过来的新固件包之后,调用上述三个辅助函数完成实际的操作过程。
```c
void Start_IAP_Process(void){
// 假设我们已经有了一个完整的firmware image存储于new_firmware_data[]数组内
// Step 1: Clear existing content at target location.
Flash_Erase(firmware_address, sizeof(new_firmware_data));
// Step 2: Write received binary into internal flash memory.
if(HAL_OK == Flash_Write(firmware_address, new_firmware_data, sizeof(new_firmware_data))){
// Step 3: Validate written data against original source.
if(!Verify_Flash(new_firmware_data, firmware_address, sizeof(new_firmware_data))){
// Error handling goes here...
} else {
// Success! Reset system or jump directly to application entry point as needed.
}
} else {
// Error occurred during writing process...
}
}
```
以上就是利用 HAL 库为 STM32F103C8T6 添加基本 IAP 能力的一个简单例子。
阅读全文
相关推荐














