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进行寄存器配置操作。对应的中断函数,也需要额外的处理流程。

你可能感兴趣的:(STM32,代码)