裕顺网站建设,快看看小程序入口,中企动力企业邮箱怎么样,网页设计六安模板前言 前几篇已经 通过 STM32CubeMX 搭建了 NUCLEO-L476RG 的 STM32L476RG 的 裸机工程#xff0c;下载了 uC-OS2 V2.93 的源码#xff0c;并把 uC-OS2 的源文件加入 Keil MDK5 工程#xff0c;通过适配 Systick 系统定时器与 PendSV 实现任务调度#xff0c;初步让 uC-OS2 …前言 前几篇已经 通过 STM32CubeMX 搭建了 NUCLEO-L476RG 的 STM32L476RG 的 裸机工程下载了 uC-OS2 V2.93 的源码并把 uC-OS2 的源文件加入 Keil MDK5 工程通过适配 Systick 系统定时器与 PendSV 实现任务调度初步让 uC-OS2 运行起来 本篇适配 uC-OS2 的 串口驱动实现 类似于 printf 的打印功能让 uC-OS2 有串口运行信息
开发环境 win10 64位 Keil uVision5MDK V5.36 uC-OS2 V2.93 开发板NUCLEO-L476RG MCU 为 STM32L476RG STM32CubeMX 6.9.1用于生成 STM32的裸机工程
串口驱动 通过 STM32CubeMX已经配置了串口的驱动默认串口的波特率是 115200 bps不过没有串口输出的接口需要自己完善一下 新建 uart.c驱动如下
#include uart2.h
#include stdio.h
#include stdarg.h
#include string.h
#include stm32l4xx_hal.hstatic UART_HandleTypeDef huart2;#define DBG_BUFF_MAX_LEN 256
static char rt_log_buf[DBG_BUFF_MAX_LEN] { 0 };void uart2_put(const char *fmt)
{HAL_UART_Transmit(huart2, (uint8_t *)fmt, strlen(fmt), 0xFFFF);
}/* debug print */
int os_printf(const char *fmt, ...)
{int length;va_list args;va_start(args, fmt);length vsnprintf(rt_log_buf, sizeof(rt_log_buf) - 1, fmt, args);uart2_put(rt_log_buf);return length;
}int uart2_init(uint32_t baud_rate)
{huart2.Instance USART2;huart2.Init.BaudRate baud_rate;huart2.Init.WordLength UART_WORDLENGTH_8B;huart2.Init.StopBits UART_STOPBITS_1;huart2.Init.Parity UART_PARITY_NONE;huart2.Init.Mode UART_MODE_TX_RX;huart2.Init.HwFlowCtl UART_HWCONTROL_NONE;huart2.Init.OverSampling UART_OVERSAMPLING_16;huart2.Init.OneBitSampling UART_ONE_BIT_SAMPLE_DISABLE;huart2.AdvancedInit.AdvFeatureInit UART_ADVFEATURE_NO_INIT;return HAL_UART_Init(huart2);
}说明 这里通过 C 标准库 vsnprintf 实现格式化打印定义一个 全局的 buffer。 新建 uart2.h 头文件
#ifndef __UART2_H__
#define __UART2_H__#include stdint.hint uart2_init(uint32_t baud_rate);
int os_printf(const char *fmt, ...);#endifmain 函数调用 首先包含 #include uart2.h然后 初始化串口uart2_init(UART2_BAUD_RATE);然后就可以使用 os_printf 格式化打印了 格式化打印的意思就是可以像 printf 那样把一个数值 打印输出 十进制、十六进制等工程也可以 %s 输出一个字符串 修改后的 main.c 如下
#include main.h
#include led.h
#include app_cfg.h
#include os.h
#include uart2.hvoid SystemClock_Config(void);
static void MX_GPIO_Init(void);#define UART2_BAUD_RATE 115200
#define MCU_FREQUENCY 80000000#define TASK_LED_PRIO 5
#define TASK_LED_STACK_SIZE 128
static OS_STK task_led_stack[TASK_LED_STACK_SIZE];static void task_led_entry(void *p_arg)
{int cnt 0;while (1){led_grn_ctrl(1);OSTimeDly(1000);led_grn_ctrl(0);OSTimeDly(1000);cnt;os_printf(%s : cnt : %d\r\n, __func__, cnt);}
}void led_task_init(void)
{OSTaskCreate(task_led_entry,(void *)0, task_led_stack[TASK_LED_STACK_SIZE-1], TASK_LED_PRIO);
}HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{return HAL_OK;
}/*** brief The application entry point.* retval int*/
int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();uart2_init(UART2_BAUD_RATE);os_printf(%s : uC-OS2 Starting...\r\n, __func__);OSInit();led_task_init();OS_CPU_SysTickInitFreq(MCU_FREQUENCY);OSStart();return 0;
}串口信息 编译、烧写到开发板查看 串口的信息当前配置的串口波特率是 115200 bps 当前串口打印信息正常 小结 本篇主要在 uC-OS2 上实现 类似于 printf 的串口格式化打印输出功能适配串口驱动 接下来继续研究 uC-OS2 上实现串口的 shell 等功能不断的深入熟悉 uC-OS2 的各个模块