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()関数でシリアルポート初期化関数を呼び出します。
次に、コンパイルしてダウンロードすると、値のシフトが成功します。