今天继续学习stm32的串口编程(利用库函数)。上次我们说了串口的发送,这次我们说接收。

接收可以用查询的方法,也可以用中断。显然,工程中多用中断的方式,那么就来看看中断接收。

代码其实很简单,基本的配置不变,在上次的基础上加一点(优先级的配置和接收中断的使能)就可以了。

        //Usart1 NVIC 配置
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ; //抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启接收中断,这句话是关键

既然开启了接收中断,就有对应的中断服务函数。

void USART1_IRQHandler(void)  //串口1中断服务程序
{
u8 rx_data = 0; //用来保存接收到的字节 if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断
{
rx_data = USART_ReceiveData(USART1);//读取接收寄存器,自动清除中断位RXNE
++rx_data;//方便调试,可以在这里打个断点
}
}

这样就实现了最最基本的功能:用键盘发送一个字节,就会进入中断,从寄存器取出这个字节。

需要说明的是:

1.  STM32 的发送与接收是通过数据寄存器 USART_DR 来实现的,这是一个双寄存器,包含了TDR和 RDR。当向该寄存器写数据的时候,串口就会自动发送,当收到数据的时候,也是存在该寄存器内。

2.  RXNE(接收数据寄存器非空),当该位被置 1 的时候,就是提示已经有数据被接收到了,并且可以读出来了。这时候我们要做的就是尽快去读取 USART_DR,通过读 USART_DR 可以将该位清零,也可以向该位写 0,直接清除。

最新文章

  1. Unity自动寻路Navmesh之高级
  2. twrp编译步骤 (CWM也差不多)
  3. Frogger(floyd变形)
  4. C# 理解泛型
  5. Playing with ptrace, Part II
  6. creating normals from alpha/heightmap inside a shader
  7. CSDN被黑几年后 我决定继续blogs
  8. MVC3中 ViewBag、ViewData和TempData的使用和区别(转发:汴蓝)
  9. 通过 Xshell 5 连接 centOS 7 服务器
  10. swift笔记06
  11. 关于 java.io.IOException: open failed: EACCES (Permission denied)
  12. C# 对xml进行操作
  13. 团队作业4——第一次项目冲刺(Alpha版本) Day2
  14. 漫淡面向对象——POJO对象
  15. Python学习日记 --day3
  16. .NET CORE迁移踩坑
  17. python中字典的操作
  18. springboot(二十):数据库连接池介绍
  19. Spring ApplicationListener使用方法及问题
  20. winform 批量控件取值赋值

热门文章

  1. python:格式化输出整数
  2. java 学习第三篇if判断
  3. Django之博客系统:自定义模板标签
  4. Harbor安装 -- 企业级Registry仓库
  5. Java框架之spring 项目 附加之noteresult(status msg data uuid MD5)
  6. asp遍历前端的所有控件
  7. 【转】HTTP协议/IIS 原理及ASP.NET运行机制浅析【图解】
  8. Task4
  9. 解决织梦手机网站M文件夹动态游览不生成html
  10. RouteSelector的初始化