uC-OS2 V2.93 STM32L476 移植: シリアル ポート印刷

序文

  • 前回の記事では、STM32L476RGのベアメタルプロジェクトをビルドし、uC-OS2 V2.93のソースコードをダウンロードし、Keil MDK5プロジェクトにuC-OS2のソースファイルを追加し、Systickシステムタイマーを適応させてタスクスケジューリングを実現しましたSTM32CubeMXNUCLEO-L476RG最初に 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、グローバル バッファが定義されています。

  • 新しい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

メイン関数呼び出し

  • 最初に をインクルードし#include "uart2.h"、次にシリアル ポートを初期化します。uart2_init(UART2_BAUD_RATE);その後、os_printfを使用してフォーマットして印刷できます。

  • フォーマットされた印刷とは、printf のように 10 進数、16 進数などの値を印刷できることを意味します。また、%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のシリアルポートシェルなどの機能を引き続き学習し、uC-OS2の各モジュールに慣れていきます。

おすすめ

転載: blog.csdn.net/tcjy1000/article/details/132092239