【RT-Thread】学习笔记

环境

		硬件环境: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的中断服务函数中运行。

  1. 将rt_os_tick_callback在rtconfig.h中对外声明
extern void rt_os_tick_callback(void);
  1. 打开处于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 */
}
  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();
}
  1. 修改编译错误。此时编译会发现HardFault和PendSV报错,注释掉即可。
  2. 修改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的周期去闪烁,移植成功。

遇到的问题

  1. J-LINK烧写失败:
    排除J-LINK本身以及驱动问题后,有可能是使用Cube生成项目时,没有正确配置JTAG相关IO导致,配置可以参考下图:
    在这里插入图片描述

版权声明:本文为CSDN博主「0xA5」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43200906/article/details/122030116

生成海报
点赞 0

0xA5

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

rt_thread hc32f460开发四:pwm驱动移植

RT-Thread 驱动开发简介 RT-Thread驱动开发最开始应该是要阅读官方的文档,理解驱动的运行原理和使用方法。PWM部分的文档在这里https://www.rt-thread.org/document/site/#/rt

4路红外循迹模块使用教程

4路红外循迹模块使用教程 个人原创博客:点击浏览模块详细信息: 工作电压:DC 3.3V~5V 工作电流:尽量选择1A以上电源供电 工作温度:-10℃~50℃ 安装孔

拉绳位移传感器在接线时需要注意哪几点?

拉绳位移传感器在接线时需要注意哪几点? 1、拉绳位移传感器在接线时务必确认在电源关闭的情况下进行接线,接线应采用锡焊工艺,各引脚应焊接牢固,避免虚焊情况发生。焊接各引脚时应严格按照传感器厂