STM32L010で9600bpsのLPUART1のライブラリ化(PA_4)



x Mbed2


目的
LPUART1のテスト
シリアルの出力先は、PA_4


![o_con310.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/45dda348-af07-a870-de42-a062c77b945e.jpeg)



プログラム


```c++


//LP_SER_9600_010_1

#include "mbed.h"

#include "LP_9600_010_1.h"

//メイン関数
int main()
{

    pc.baudNS(9600);
    
    //無限ループ
    while(1) {

        //文字列の表示
        pc.printNS("HELLO WORLD\r\n");
        
        //4桁の値の表示
        pc.printNS(  1234  );
        //リターン
        pc.printNS("\r\n");

        //1秒の待ち
        wait_ms(1000);

    } //while

} //main

//容量削減
void error(const char* format, ...) {}





```


のプログラム


```c++


//LP_9600_010_1.h

//10の割り算 0から1028までは、正しい。主に0から999
#define DIV10(n) ((n*205)>>11)

char ch_hex_a_b[16];
char *ch_hex_a(int x)
{

    ch_hex_a_b[4] = 0;

    if       ( x >= 9000 ) {x = x - 9000; ch_hex_a_b[0] = '9';
    } else if( x >= 8000 ) {x = x - 8000; ch_hex_a_b[0] = '8';
    } else if( x >= 7000 ) {x = x - 7000; ch_hex_a_b[0] = '7';
    } else if( x >= 6000 ) {x = x - 6000; ch_hex_a_b[0] = '6';
    } else if( x >= 5000 ) {x = x - 5000; ch_hex_a_b[0] = '5';
    } else if( x >= 4000 ) {x = x - 4000; ch_hex_a_b[0] = '4';
    } else if( x >= 3000 ) {x = x - 3000; ch_hex_a_b[0] = '3';
    } else if( x >= 2000 ) {x = x - 2000; ch_hex_a_b[0] = '2';
    } else if( x >= 1000 ) {x = x - 1000; ch_hex_a_b[0] = '1';
    } else                 {              ch_hex_a_b[0] = '0';
    }//if

    ch_hex_a_b[3] = '0' + (  x - (DIV10(x) * 10)  );  // 3  <- 120 - 123
    x = DIV10(x);                                     // 12 <= 123 / 10
    ch_hex_a_b[2] = '0' + (  x - (DIV10(x) * 10)  );  // 2  <- 12 - 10
    ch_hex_a_b[1] = '0' +  DIV10(x);                  // 1  <- 12 / 10

    return(ch_hex_a_b);

} //ch_hex_a




//クラスの定義
struct _pc
{
  void baudNS(int sp);      //メソッドの宣言
  int  putcNS(char ch);      //メソッドの宣言
  int  printNS(char *str1);  //メソッドの宣言
  int  printNS(int num);     //メソッドの宣言 オーバーロード
};


//シリアルの構造体の定義
UART_HandleTypeDef hlpuart1;


//ポートをhiにする 初期化
//メソッドの定義
void _pc::baudNS(int sp)
{
    wait_ms(2); //HAL_Delayが失敗する為


    //シリアルへのクロックの選択
    RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_LPUART1;
    PeriphClkInit.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
    HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);

    //シリアルへクロックの供給
    __HAL_RCC_LPUART1_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();

    //シリアル用のGPIOの設定
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = GPIO_PIN_4;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF6_LPUART1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    //シリアルの設定
    hlpuart1.Instance = LPUART1;
    hlpuart1.Init.BaudRate = 9600;
    hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
    hlpuart1.Init.StopBits = UART_STOPBITS_1;
    hlpuart1.Init.Parity = UART_PARITY_NONE;
    hlpuart1.Init.Mode = UART_MODE_TX_RX;
    hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
    hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
    HAL_HalfDuplex_Init(&hlpuart1);
}//baudNS


//仮想シリアルへの一文字出力 9600bps
//メソッドの定義
int _pc::putcNS(char ch)
{

    HAL_UART_Transmit(&hlpuart1, (uint8_t *)(&ch), 1 , 10);

    return(0);
}//putcNS


//文字列の表示
//メソッドの定義
int _pc::printNS(char *str1)
{
    //文字の中身がゼロか
    while(*str1) {

        //一文字出力
        putcNS(*str1 ++);

    } //while

    //戻り値
    return(0);  
}//printNS


//文字列の表示 オーバーロード 4桁
//メソッドの定義
int _pc::printNS(int num)
{
    if(num < 0) { putcNS('-'); num = 0 - num;   }
    
    char *str1 = ch_hex_a(num);
    
    //文字の中身がゼロか
    while(*str1) {

        //一文字出力
        putcNS(*str1 ++);

    } //while

    //戻り値
    return(0);  
}//printNS


//実体の作成
_pc pc;





```