STM32 USART的寄存器操作

不曉得是不是自己用寄存器操作習慣了,總是用不習慣STM32的HAL庫,效率實在是有些低。特別是用到多個串口進行高速傳輸的應用,就一個入口函數,然後一個一個的callback調用,效率上講,實在是有些差。於是自己嘗試了一下,在基於STM32cube的基礎上(借用一下Cube生成的初始化函數,還是有必要的),改成了寄存器操作版本。這樣,GPIO口的初始化,時鐘的初始化之類的操作,就利用了cube。。偷個懶吧。

我還是使用了STM32G070的開發板,利用板載的USART2。RX使用中斷來接收,Tx爲polling的方式。FIFO的閾值爲1/8(沒記錯的話)。

MX_USART2_UART_Init(void)修改如下:

static void MX_USART2_UART_Init(void)
{
  ... ... ...
  /* USER CODE BEGIN USART2_Init 2 */
  
  //啓動單字節接收,實際上直接使用USART2->CR1這樣調用也可以
  huart2.Instance->CR1 |= USART_CR1_RE | USART_CR1_RXNEIE_RXFNEIE;
  huart2.Instance->CR1 |= USART_CR1_PEIE;

  /* USER CODE END USART2_Init 2 */

}

在中斷函數USART2_IRQHandler修改爲:

unsigned char RxData[256];//用來測試接收的情況
unsigned char RxIndex;
void USART2_IRQHandler(void)
{
    if(USART2->ISR & USART_ISR_RXNE_RXFNE) //接收數據寄存器非空
    {
        RxData[RxIndex++] = USART2->RDR;
    }
}

main函數中,進行循環發送測試:

//在主循環中不停的發,來測試
unsigned int Delay = 60000;
while(Delay--);
      
USART2->TDR = 'a';
while(!(USART2->ISR & USART_ISR_TC));
USART2->TDR = '1';
while(!(USART2->ISR & USART_ISR_TC));
USART2->TDR = '3';
while(!(USART2->ISR & USART_ISR_TC));
USART2->TDR = '9';
while(!(USART2->ISR & USART_ISR_TC));

以上只是個簡單的例程,不涉及到錯誤的處理,例如幀錯誤,溢出錯誤等。如果要加這些功能,就需要額外對USART2進行寄存器配置操作。對應的中斷函數,也需要額外的處理流程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章