keil5 RTE stm32 hal库 RTX5操作系统闪灯和串口测试 CubeMX初始化

一、引言

在前两篇文章里面,讲述了如何利用keil RTE创建闪灯程序和如何利用CubeMX实现串口通信。本篇文章主要讲解RTE、RTX5和CubeMX的结合问题。

Keil RTE 闪灯程序: https://blog.csdn.net/zzlwl/article/details/115394066

keil RTE HAL库 STM32CubeMX 串口收发: https://blog.csdn.net/zzlwl/article/details/115431728

二、主要思路和流程

(1)使用CubeMX创建串口初始化代码

采用CubeMX的原因主要是该工具生成的代码完全是基于hal库的,可以较好的和keil 的RTE工具对接。代码生成完后项目保留备用,后面要粘贴到keil RTE创建的项目内。

(2)创建基于RTOS2 的keil RTX5项目。

主要选择如下(其他的让系统自动选择依赖):

(3)创建RTOS2的main文件和中断处理文件

利用模板创建main文件和中断处理文件的过程请查看前面文章。

(4)更改相关设置

(4.1)加入宏定义HSE_VALUE=8000000和C99模式选择

(4.2)配置串口相关的IO口

(4.3)确认下系统节拍频率

(5)更改main文件:

#include "hal_init.h" //需要声明的在CubeMx创建的初始化函数

extern UART_HandleTypeDef huart1;//串口
/*----------------------------------------------------------------------------
 * Application main thread
 *---------------------------------------------------------------------------*/
void app_main (void *argument) {
 
  // ...
  for (;;) {//自己添加的测试代码
		HAL_GPIO_TogglePin(GPIOG,GPIO_PIN_3);
		osDelay(1000);
		HAL_UART_Transmit(&huart1,"hello haha jin tian hao\r\n",sizeof("hello haha jin tian hao\r\n")-1,20);
		
	}
}
 
int main (void) {
 
  // System Initialization
	//HAL_Init();
	LED_Initialize();
  SystemClock_Config();
	MX_GPIO_Init();
  MX_USART1_UART_Init();

  /* Initialize interrupts */
  MX_NVIC_Init();
  // ...
   HAL_UART_Transmit(&huart1,"start--------------\r\n",sizeof("start--------------\r\n")-1,5);
  //上面为CubeMx创建的初始化代码
  osKernelInitialize();                 // Initialize CMSIS-RTOS
  osThreadNew(app_main, NULL, NULL);    // Create application main thread
  osKernelStart();                      // Start thread execution
  for (;;) {}
}

在主程序中osKernelInitialize上面的代码均为CubeMx创建,其中HAL_Init主要任务是systick的初始化和中断设置。此任务已经由操作系统接管,其中断处理函数也被重载。故得到系统当前节拍值的函数需要重新实现。具体如下:

uint32_t HAL_GetTick(void)
{
  return osKernelGetTickCount();
}

如显示编译出错,则应引入相应的包含文件(#include "cmsis_os2.h")

 hal_init.h和 hal_init.c文件为main调用函数的实现和声明代码,其来自CubeMX系统初始化部分,直接复制粘贴即可。不再累述。

系统运行结果如下:

由于设置的波特率为9600bps,每个字符的时间为1ms,故初始化显示了6个字符;小灯每过1s状态改变1次,每次串口显示20多个字符,由于已经超时,故不能进行回车换行。

三、结论

为方便对比,我把手头的正点原子的stm32 ucos2.91的代码和这里的代码分别重新编译了一遍,结果如下:(左RTX5  右ucos )

   

从该结果可以看出,rtx5程序占据22k空间。查看代码可以看出,RTX5没有条件编译控制,故代码量远远多于ucos。由于RTX的依赖库也特别多,故编译速度也远远落后于正点原子提供的模板。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

健忘的松鼠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值