uC-OS2 V2.93 STM32L476 移植:串口打印篇

前言

  • 前几篇已经 通过 STM32CubeMX 搭建了 NUCLEO-L476RG 的 STM32L476RG 的 裸机工程,下载了 uC-OS2 V2.93 的源码,并把 uC-OS2 的源文件加入 Keil MDK5 工程,通过适配 Systick 系统定时器与 PendSV 实现任务调度,初步让 uC-OS2 运行起来

  • 本篇适配 uC-OS2 的 串口驱动,实现 类似于 printf 的打印功能,让 uC-OS2 有串口运行信息

开发环境

  • win10 64位

  • Keil uVision5,MDK 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.h"

static 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.h>

int uart2_init(uint32_t baud_rate);
int os_printf(const char *fmt, ...);

#endif

main 函数调用

  • 首先包含 #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.h"

void 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 的各个模块

猜你喜欢

转载自blog.csdn.net/tcjy1000/article/details/132092239