STM32F103シフト値RT-ThreadNanoは、コンソールとFinSH標準ライブラリプログラムのソースコードを追加します

STM32F103シフト値RT-ThreadNanoは、コンソールとFinSH標準ライブラリプログラムのソースコードを追加します

RT-Threadは、HALライブラリのソースコードを公式に提供していますが、これはまだ標準ライブラリ関数とは異なります。ここで、必要な人のために標準ライブラリの下での移行を完了しました。

 

 

#include "sys.h"
#include "usart.h"
#include "rtthread.h"

#define rt_ringbuffer_space_len(rb)((rb)-> buffer_size-rt_ringbuffer_data_len(rb))


struct rt_ringbuffer
{     rt_uint8_t * buffer_ptr;

    rt_uint16_t read_mirror:1;
    rt_uint16_t read_index:15;
    rt_uint16_t write_mirror:1;
    rt_uint16_t write_index:15;

    rt_int16_t buffer_size;
};

enum rt_ringbuffer_state
{     RT_RINGBUFFER_EMPTY、     RT_RINGBUFFER_FULL、     / *半分がいっぱいでも空でもない* /     RT_RINGBUFFER_HALFFULL、};




rt_inline enum rt_ringbuffer_state rt_ringbuffer_status(struct rt_ringbuffer * rb)
{     if(rb-> read_index == rb-> write_index)     {         if(rb-> read_mirror == rb-> write_mirror)             return RT_RINGBUFFER_EMPTY;         それ以外の場合は             RT_RINGBUFFER_FULLを返します。     }     return RT_RINGBUFFER_HALFFULL; } / **   * rbでデータのサイズを取得します   * / rt_size_t rt_ringbuffer_data_len(struct rt_ringbuffer * rb){     switch(rt_ringbuffer_status(rb))     {     case RT_RINGBUFFER_EMPTY:         return 0;     ケースRT_RINGBUFFER_FULL:



















        rb-> buffer_sizeを返す;
    case RT_RINGBUFFER_HALFFULL:
    デフォルト:
        if(rb-> write_index> rb-> read_index)
            return rb-> write_index --rb-> read_index;
        それ以外の場合は、
            rb-> buffer_size-(rb-> read_index --rb-> write_index);を返します。
    };
}

void rt_ringbuffer_init(struct rt_ringbuffer * rb、
                        rt_uint8_t * pool、
                        rt_int16_t size)
{     RT_ASSERT(rb!= RT_NULL);     RT_ASSERT(サイズ> 0);

    / *読み取りおよび書き込みインデックスを初期化します* /
    rb-> read_mirror = rb-> read_index = 0;
    rb-> write_mirror = rb-> write_index = 0;

    / *バッファプールとサイズを設定します* /
    rb-> buffer_ptr = pool;
    rb-> buffer_size = RT_ALIGN_DOWN(size、RT_ALIGN_SIZE);
}

/ ***
 文字をリングバッファに入れます
 * /
rt_size_t rt_ringbuffer_putchar(struct rt_ringbuffer * rb、const rt_uint8_t ch)
{     RT_ASSERT(rb!= RT_NULL);

    / *十分なスペースがあるかどうか* /
    if(!rt_ringbuffer_space_len(rb))
        return 0;

    rb-> buffer_ptr [rb-> write_index] = ch;

    / *フリップミラー* /
    if(rb-> write_index == rb-> buffer_size-1)
    {         rb-> write_mirror = 〜rb-> write_mirror;         rb-> write_index = 0;     }     else     {         rb-> write_index ++;     }






    1を返します。
}
/
 ***リングバッファから文字を取得します
 * /
rt_size_t rt_ringbuffer_getchar(struct rt_ringbuffer * rb、rt_uint8_t * ch)
{     RT_ASSERT(rb!= RT_NULL);

    / *リングバッファが空です* /
    if(!rt_ringbuffer_data_len(rb))
        return 0;

    / *文字を入力* /
    * ch = rb-> buffer_ptr [rb-> read_index];

    if(rb-> read_index == rb-> buffer_size-1)
    {         rb-> read_mirror = 〜rb-> read_mirror;         rb-> read_index = 0;     }     else     {         rb-> read_index ++;     }






    1を返す;
}
 / ********************************************* **** **********************************
*関数名:uart_init
*説明: 
*入力:なし
*出力:なし
*戻り値:なし
****************************************** **** ********************************* / 
/ *パート2:フィンシュポーティングおよびドッキングパート* /
#define UART_RX_BUF_LEN 16
rt_uint8_t uart_rx_buf [UART_RX_BUF_LEN] = {0};
struct rt_ringbuffer uart_rxcb; / *リングバッファcbを定義* /
// static UART_HandleTypeDef UartHandle;
static struct rt_semaphore shell_rx

void USART1_Init(u32 bound)
{   GPIO_InitTypeDef GPIO_InitStructure;     USART_InitTypeDef USART_InitStructure;     NVIC_InitTypeDef NVIC_InitStructure;     / *初期初期化串口接収リングバッファ* /     rt_ringbuffer_init(&uart_rxcb、uart_rx_buf、UART_RX_BUF_LEN);



    

    / *初期化データを受信するためのシリアルポートのセマフォ* /
    rt_sem_init(&(shell_rx_sem)、 "shell_rx"、0、0);
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA、ENABLE); //クロックUSART1を有効にし、GPIO
  
    / A
  = GPIO_Pin_9 GPIO_InitStructure.GPIO_Pin; //PA.9
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //多重化プッシュプル出力
  GPIO_Init(GPIOA、&GPIO_InitStructureを); //初期化GPIOA.9
   
  //初期化USART1_RX GPIOA.10
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // PA10
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //フローティング入力
  GPIO_Init(GPIOA、&GPIO_InitStructure); //GPIOA.10を初期化します  

  // Usart1NVICアレンジ
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =。3; //プリエンプション優先度
    。3NVIC_InitStructure.NVIC_IRQChannelSubPriority=。3; //子優先度
    。3NVIC_InitStructure
    NVIC_Init(&NVIC_InitStructure); //指定されたパラメータに従ってVICレジスタを初期化します
  
    USART_InitStructure.USART_BaudRate = bound; //シリアルポートボーレート
    USART_InitStructure.USART_WordLength = USART_WordLength_8b; //ワード長は8ビットデータ形式
    USART_InitStr =
    USART_StopBits_1 .USART_Parity = USART_Parity_No; //パリティビットなし
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //ハードウェアデータフロー制御なし
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //收发模式

  USART_Init(USART1、&USART_InitStructure); //シリアルポート1を初期化します
  USART_ITConfig(USART1、USART_IT_RXNE、ENABLE); //シリアルポートを開いて割り込みを受け入れます
  USART_Cmd(USART1、ENABLE); //シリアルポート1を有効にします 
}
/ ***** *** *********************************************** *** *********************
*関数名:uart_send_byte
*説明: 
*入力:なし
*出力:なし
*戻り値:なし
****** *** *********************************************** *** ******************** /
void uart_send_byte(u8 data)
{     while((USART1-> SR&0X40)== 0);     USART1-> DR = data; } / *コンソールの移植、コンソール出力の実現、rt_hw_console_outputとのドッキング* /




void rt_hw_console_output(const char * str)
{     rt_size_t i = 0、size = 0;     char a = '\ r';

    size = rt_strlen(str);
    for(i = 0; i <size; i ++)
    {         if(*(str + i)== '\ n')         {                     uart_send_byte(a);         }                 uart_send_byte(str [i]);     } } / * FinSHを移植してコマンドラインの相互作用を実現するには、FinSHソースコードを追加してから、rt_hw_console_getcharに接続する必要があります* / / *割り込みメソッド* / char rt_hw_console_getchar(void){     char ch = 0;     / *からデータを取得しますringbuffer * /     while(rt_ringbuffer_getchar(&uart_rxcb、(rt_uint8_t *)&ch)!= 1)     {         rt_sem_take(&shell_rx_sem、RT_WAITING_FOREVER);     }      return ch;    }



















    

/ ************************************************* ******************************
*関数名:USART1_IRQHandler
*説明: 
*入力:なし
*出力:なし
*戻り値:なし
************************************************** ***************************** /
void USART1_IRQHandler(void)
{         int ch = -1;     / *割り込みを入力* /     rt_interrupt_enter( ); //割り込みを入力するには、この関数のペアを割り込みで呼び出す必要があります


    if((USART_GetFlagStatus(USART1、USART_FLAG_RXNE)!= RESET)&&
        (USART_GetITStatus(USART1、USART_IT_RXNE)!= RESET))
    {         while(1)         {             ch = -1;             if(USART_GetFlagStatus(USART1、USART_FLAG_RXNE)!= RESET)             {                 ch = USART1-> DR&0xff;             }             if(ch == -1)             {                 ブレーク;             }               / *读取到数量、将数データ存入リングバッファ* /             rt_ringbuffer_putchar(&uart_rxcb、ch);         }                 rt_sem_release(&shell_rx_sem);     }     / *割り込みを残す* /

















    rt_interrupt_leave(); //必ず割り込みでこの関数のペアを呼び出し、割り込みを残してください
}


次に、board.cファイルのvoid rt_hw_board_init()関数でシリアルポート初期化関数を呼び出します。

次に、コンパイルしてダウンロードすると、値のシフトが成功します。

おすすめ

転載: blog.csdn.net/qq_25186745/article/details/105946825