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

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值