UART (STM32)

(2016.2.20 Created) 

 このページではUARTクラスのSTM32実装に関する差分だけ記載しています。派生元の基底クラスの情報はこちらに記載しています。また、ファイルはこちらからダウンロードしていただけます。

STM32 UART sub class is explained in this page. Information about super class (base class ) is explained here. And these classes can download here.

 

 STM32のHALドライバではUART通信用にポーリング、割り込み、DMAを用いたそれぞれの関数が準備されています。しかしここで公開しているクラスはこの中の割り込み関数を使用したものになります。DMAを使用したものが最も効率はいいと思われるのですが、メリットも多い半面、制約が多く汎用性に欠けるためこのようにしています。

There are some UART functions (Polling, Interrupt and DMA) in the STM32 HAL library. In the class provided here is using interrupt function. Surely the function using DMA is much better performance, but they have some limitations and difficulty to general usage.

 

 合計何バイト受信するか事前にわからないことが多いので、1バイトごとに割り込みが発生する実装を行っています。具体的には1バイト受信する毎にCircular Bufferにデータを順次格納してゆきます。バッファサイズを超えて連続して受信すると古いデータから上書きされるのでご注意ください。

Each time to receive a byte, the interrupt will be generated. Because the number of bytes to receive are unknown in advance. After one byte received, the data will be copied to circular buffer. When received data size is more than the buffer size, the older data will be overwritten.

  STM32ではこの割り込みを受ける関数が決められているので、人力で追加する必要があります。F303xCとF401xEの場合の関数名は以下の通りですが、別の型番でもstartup_stm32f***.sファイルの中を見に記載があります。

Interrupt handler have to prepare manually since it is predefined in STM32. The handler of F303xC and F401xE are listed below, and in case of others they are listed in "startup_stm32***.s".

 

F303xC

(F3Disco)

F401xE

(Nucleo)

UART1 USART1_IRQHandler USART1_IRQHandler
UART2 USART2_IRQHandler USART2_IRQHandler
UART3  USART3_IRQHandler  
UART4  UART4_IRQHandler  
UART5  UART5_IRQHandler  
UART6    USART6_IRQHandler

Command Reference

コンストラクタ / Constructor

Declaration

UART( USART_TypeDef *USARTx,

           const uint8_t &PinTx,

           const uint8_t &PinRx);

Return

None

Parameter UART

USART1, UART2, ...

PinTx, PinRx

ピン設定 / Pin Settings

備考

どのピンが有効になるかはパラメータの組み合わせによります。詳細はソースコードを参照してください。

Which pin are used is depend on the combination of the parameters. (UARTx, pinTx and pinRx). Refer to the source code for a detail.

割り込み処理 / Interrupt handler

Declaration

void InterruptHandler();

Return

None

Parameter None
備考

UARTx_IRQHandlerから呼び出してください。

Call this from UARTx_IRQHandler

Please refer to sample code.

Sample Code

 STM32F3Discoveryでのサンプルコードを下に示します。

The sample code on STM32F3Discovery is shown below.

#include "DKS_UART_F303xC.h"
#include "DKS_Util_F303xC.h"
 
DKS::UART::UART *uart;

int main(void)
{
    DKS::InitSystem();
    
    // Tx=PC4, Rx=PC5
    uart = new DKS::UART::UART(USART1, 1, 1);
    const uint32_t BaudRate = 56300;
    uart->setFormat(BaudRate,
                       DKS::UART::Parity_None,
                       DKS::UART::StopBits_One);
    uart->startToRead();
    
    // write
    uint8_t SenData[]={0x01, 0x02, 0x03};
    uart->write(SendData, sizeof(SendData));
    uart->WaitUntilTransferCplt();

    // read
    uint8_t res[9];
    while (uart->BytesToRead() < 9)     Delay(1);
    uart->read(res, 9);
}

// Add interrupt handler manually.
extern "C" void USART1_IRQHandler(void)
{
    uart->InterruptHandler();
}