我是个菜鸟,请问什么情况会引起串口中断,比如是否只要SBUF有数据就会引发串口中断,还是设置ES=1就会引起一次串口中断,还是TI或RI=1引发串口中断,不要复制别人答案,谢谢!
SBUF中的数据发送完毕,TI传送结束标志置1,如果设置了ES=1(串口中断是允许的),就进入串口中断服务程序。解决方法如下:
1、首先打开Cube工程,在Pinout页使能需要使用的串口。
2、切换到“Configuration”页,找到并点击需要使用的串口,比如之前选择的USART2。
3、在弹出的“xxx Configuration”对话框中选择“NVIC Settings”,勾选“xxx global interrupt”的Enabled,其中xxx为目标串口名称。
4、回到“Configuration”页,在“NVIC Configuration”对话框点击“Code generation”,勾选“xxx global interrupt”的Generate IRQ handler和“Select for init sequence ord...”。
5、点击“Project ->Generate Code”生成代码。
6、重写HAL_UART_RxCpltCallback回调函数,这里的代码通过判断huart ->Instance是否为USART2,然后将接收的data使用阻塞方式发送出去,接着再启动接收就可以了。
我遇到了跟题主一样的问题,我感觉题主跟我的疑惑是一样的,下面来说说我的看法。(51系列,因为我也是刚接触,遇到很多问题,搜索的答案大多没有讲解这些很模糊的概念。希望大家能够共同进步吧)
首先ES = 1是串口中断的必要不充分条件,即想要发生串口中断ES必须置1,但是除此之外,串口中断还需要其它的条件才能触发。
其实TI与RI什么时候置一STC芯片上说得很清楚
主要关注方式1,其它方式基本用不到(可直接搜索所用芯片的芯片手册,如STC89C52)
其实到这里题主的问题已经解决了:串口中断的条件是TI/RI置1。
除此之外我想补充一下回答
以单片机接收数据为例,在电脑上输入1点击【发送数据】,单片机就开始接收数据了,这是由单片机硬件决定的(了解IO口模拟通信或许可以帮助理解),当数据接收到停止位1的中间位置时(怎么一位一位接收自行搜索……),RI由硬件置1,这时进入串口中断,你可以对接收的数据做出相应的操作。