STM32
直播中

硕达科讯

8年用户 895经验值
私信 关注
[问答]

STM32 USART的寄存器操作技巧分享

STM32 USART的寄存器操作技巧分享

回帖(1)

毕凯

2021-12-15 11:23:16
不晓得是不是自己用寄存器操作习惯了,总是用不习惯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进行寄存器配置操作。对应的中断函数,也需要额外的处理流程
举报

更多回帖

发帖
×
20
完善资料,
赚取积分