STM32CUBEIDE平台使用标准库移植问题记录
移植FreeRTOS过程中无法进入任务调度,卡在HardFault_Handler
函数中
1
2
3
4
5
6
7
8
9
/**
* @brief This function handles Hard Fault exception.
* @param None
* @retval None
*/
void HardFault_Handler(void)
{
LED_SF_ENABLE();
}
问题原因有多种 网上有很多是因为堆栈溢出或者分配导致得原因,对于该原因不过多概述,本次遇到得问题是因为没用找到对应中断函数而导致进`HardFault_Handler`函数,这个问题来源于一次调试中发现设备跳到对应得port.c的中断函数导致的进`HardFault_Handler`中断异常
解决方式:打开portmacro.h
文件 在文件中加入对应如下的FreeRTOS系统中断函数的宏定义,让系统找到该函数解决
1
2
3
timertest.c
报错
include "stm32f10x_lib.h"
文件找不到
`stm32f10x_lib.h`,`stm32f10x_tim.h`,`stm32f10x_map.h`是ST公司V2.0版本的库函数使用的头文件,在V3.5版本的库函数中已经将这三个头文件更换为`stm32f10x.h`文件,所以将这三个文件注释掉直接引用`stm32f10x.h`,更改timertest.c文件定义的TIM2中断中的中断通道
在STM32CUBEIDE中将变量存放在指定的地址中
因为STM32CUBEIDE使用的是GCC编译器,之前在Keil上的语法不再适用
首先定义需要存放在指定地址的变量
1
2
3
const uint8_t Fill_blank[50] __attribute__((section(".ROM2")))={"填写需要放的数据或者值或者结构体信息"};
//其中Fill_blank[50]是自己定义的一个字符串数组,我们将这个数据存放在ROM2这个地址上
//ROM2:存放的地址
进入GCC的linker文件:`STM32F103XXXX_FLASH.ld`,中,定义ROM2的地址:
1
2
3
4
5
6
7
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K
ROM (rx) : ORIGIN = 0x8010000, LENGTH = 444K
ROM2 (rx) : ORIGIN = 0x807f000, LENGTH = 4K
//我使用的平台是STM32F103RET6 flash的容量是512K,使用0x10000用于IAP部分,我们将ROM2放在0x807f000的位置上,一定要计算清除地址和大小
}
在SECTIONS中使用该地址
1
2
3
4
5.ROM2 : ALIGN(4)
{
FILL(0xff)
KEEP(*(.ROM2))
} > ROM2