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