文章目录[隐藏]
环境
硬件环境:STM32F103ZET6(野火mini开发板)
软件环境:STM32Cube + Keil5
使用STM32Cube快速生成例程
先使用STM32Cube生成一个简单的led闪烁的例程,搭建未移植RT-Thread的环境。(STM32Cube的使用方式不在本文中详述)
当前开发板上,led部分的原理图如下:我们使用LED1,也就是PB0引脚。
在STM32Cube中,我们设置PB0为输出,并且定义名称为LED1。
在main函数的循环中添加LED亮灭延时的代码,其中Delay函数为阻塞软延时函数。
// An highlighted block
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
Delay(1000);
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);
Delay(1000);
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);
}
/* USER CODE END 3 */
编译通过,烧写到板子后,可以观察到LED循环亮灭。
至此,基本环境搭建完成,接下来就准备移植RT-Thread到基本环境中了。
获取RT-Thread源码
获取RT-Thread源码的方式有很多
1.可以通过去RT-Thread官网下载源码;
2.Keil5支持RT-Thread的pack,pack可以在Keil的官网下载;
3. …
本此使用第二种方法,即使用RT-Thread的pack。
将pack安装好后,在Keil里点击Manage Run-Time Environment后查询是否生效并配置
如下图证明pack有效,此次简单移植,只需勾选kernel即可
确认后,会发现在工程里多了个RTOS。
移植
RTOS目录结构
首先来看生成的RTOS目录中的文件都有哪些。我们会发现好多文件都有上锁图标,应该是只读,不允许修改,挺人性化的。所以移植修改的目标就很明确了,修改board.c和rtconfig.h。
板级修改
修改board.c,先看这个文件里有啥,提炼下,移植工作主要是下面两个函数。
void rt_os_tick_callback(void)
{
rt_interrupt_enter();
rt_tick_increase();
rt_interrupt_leave();
}
/**
* This function will initial your board.
*/
void rt_hw_board_init(void)
{
#error "TODO 1: OS Tick Configuration."
/*
* TODO 1: OS Tick Configuration
* Enable the hardware timer and call the rt_os_tick_callback function
* periodically with the frequency RT_TICK_PER_SECOND.
*/
/* Call components board initial (use INIT_BOARD_EXPORT()) */
#ifdef RT_USING_COMPONENTS_INIT
rt_components_board_init();
#endif
#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
#endif
}
顾名思义,rt_os_tick_callback()是系统依赖的systick的回调函数,那我们就需要将其放在systick的中断服务函数中运行。
- 将rt_os_tick_callback在rtconfig.h中对外声明
extern void rt_os_tick_callback(void);
- 打开处于Core目录下的stm32f1xx_it.c文件,找到systick的中断服务函数,发现我们生成的代码中有调用HAL库的接口,此时只需将其屏蔽,替换成RT-Thread提供的板级移植函数rt_os_tick_callback即可。
/* USER CODE BEGIN Includes */
#include "rtconfig.h"
/* USER CODE END Includes */
/**
1. @brief This function handles System tick timer.
*/
void SysTick_Handler(void)
{
/* USER CODE BEGIN SysTick_IRQn 0 */
#if 0
/* USER CODE END SysTick_IRQn 0 */
HAL_IncTick();
/* USER CODE BEGIN SysTick_IRQn 1 */
#endif
rt_os_tick_callback();
/* USER CODE END SysTick_IRQn 1 */
}
- 修改rt_hw_board_init,将硬件初始化放至其中
void rt_hw_board_init(void)
{
//#error "TODO 1: OS Tick Configuration."
/*
* TODO 1: OS Tick Configuration
* Enable the hardware timer and call the rt_os_tick_callback function
* periodically with the frequency RT_TICK_PER_SECOND.
*/
/* Call components board initial (use INIT_BOARD_EXPORT()) */
#ifdef RT_USING_COMPONENTS_INIT
rt_components_board_init();
#endif
#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
#endif
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
}
- 修改编译错误。此时编译会发现HardFault和PendSV报错,注释掉即可。
- 修改led闪烁的操作。原先代码使用软件阻塞延时实现,由于阻塞会对任务调度造成影响,且会一直处于运行态,导致任务无法切换,对应延时函数RT-Thread也提供了,所以这里我们使用RT-Thread提供的接口-rt_thread_mdelay,一个提供ms级别延时的接口。
int main(void)
{
/* USER CODE BEGIN 1 */
#if 0
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
#endif
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
rt_thread_mdelay(1000);//Delay(1000);
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);
rt_thread_mdelay(1000);//Delay(1000);
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);
}
/* USER CODE END 3 */
}
烧写,发现LED能正常按照亮灭各1s的周期去闪烁,移植成功。
遇到的问题
- J-LINK烧写失败:
排除J-LINK本身以及驱动问题后,有可能是使用Cube生成项目时,没有正确配置JTAG相关IO导致,配置可以参考下图:
版权声明:本文为CSDN博主「0xA5」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43200906/article/details/122030116
暂无评论