左左右学堂 · 课程目录

第20期 一节课讲明白usart中断

观看B站原视频 · 文稿与高清画面

helllo,小伙伴们,大家好。这里是左左右。前面中断那期视频我们讲过,stm32的中断种类有很多。其中USART串口通信也是支持中断功能的。打开cubeide,把之前串口屏那期视频的项目复制一份出来。前面讲USART串口通信那期,我们并没有使用其中断功能,而是直接将接收和发送函数放在主程序中的while循环中,而按下串口屏中的按钮是一个随机且短暂动作。

当stm32接收不到串口屏发送过来的数据时,接收函数只能停在那里一直等。这样主程序就不能执行其他任务了,就会造成主程序的阻塞。所以,开启USART串口通信的中断功能就可以完美的解决这个问题。

视频画面 01:38.4
视频画面 01:38.4 · 1080P 原图 · 查看对应视频

好的,我们来实操一下。打开ioc文件,找到NVIC。开启USART1的中断,并设置抢占优先级。同时,设置一下让它自动生成单独的.c和.h文件。打开main.c文件,将之前写好的UART接收数据的函数写到while循环外面。这时只要在原来函数后面加一个下划线IT就能使用USART的中断功能了。

接着,打开it.c这个文件找到我们熟悉的USART1_IRQHandler,也就是USART1发生中断时由硬件自动跳转到这个函数。这里和EXTI外部中断的跳转函数还是有一定区别的。由于数据的接收是有个过程的,我们直接把程序写在这里就可能会发生数据还没接收完成。你就直接开始判断接收到的内容了。

所以,这里我们就要引入回调函数这个概念了。它的核心作用是,让开发者自定义特定事件发生时的处理逻辑。这里我们就要写一个数据接收完成的回调函数,也就是说数据一旦接收完成,就自动执行我们写好的这个回调函数。其实,这个函数cubeide已经自动生成了。我们只需要重写一下就可以了。

视频画面 03:33.5
视频画面 03:33.5 · 1080P 原图 · 查看对应视频

按下ctrl,鼠标单击这个函数就跳到定义这个函数的地方。在这里我们找到这个函数,其中cplt就是complete的缩写。前面的下划线weak代表这是一个弱函数。就是说这个函数的允许重写。我们将它复制到main.c这个文件中,删掉前面的下划线weak。这时我们只需要将进入中断并完成数据接收任务后。

将要执行的代码写到这里就可以了。接着,在函数末尾加上前面的中断函数。这是因为如果不加这行代码,中断执行一次就结束了。所以,我们要在末尾重新开启中断。由于这个回调函数用到receive data这个变量,我们要把main函数中定义的receive data放到外面,让它成为一个全局变量,这样main.c中的其他函数才能使用它。

同时,主程序中while循环也不能让他闲着。还是让它每隔一秒执行i++的操作。好的,我们点击编译,是不是没有问题?如果前面视频听明白 了,这期应该是很容易理解的。由于这期视频相对容易,我们在这里补充一个知识点,其实,我们一直在cubeide中写的代码都是用串口屏的模拟器进行通信的。

那么,接下来讲一下如何将?串口屏上位机做好的UI界面下载到串口屏实物。并通过stm32与串口屏实物连接进行通信。由于串口屏模拟器和stm32通信用到的是uasrt1,而串口屏模实物和stm32通信用到的是uasrt2。所以,我们要在cubeide中设置一下。接着,回到main.c将之前用到的huart1全部改成huart2。

视频画面 05:28.7
视频画面 05:28.7 · 1080P 原图 · 查看对应视频
视频画面 06:26.3
视频画面 06:26.3 · 1080P 原图 · 查看对应视频

一共三处需要修改。接着,我们点击运行将程序下载到stm32中。接着,将学习板按视频中这样连接。点击下载就可以下载到串口屏实物了。然后,将串口屏与学习板另一个接口连在一起。就能实现串口屏实物与stm32通信了。接着,我将最小系统板接线图也放到这里供大家参考。回到刚才的cubeide中,大家有没有思考过这样一个问题:前面我们将3个huart1改成huart2。

如果这里我们有100个huart1需要修改,我们是不是也要改100遍?万一改的过程中还漏掉一两个该怎么办呢?其实,这里是有其他解决办法的,这时我们就要引入一个新的概念叫宏定义。他的写法是这样的,这里的ss_huart就是huart2的别名。就像高启强人们又叫他强哥是一个道理。

视频画面 08:21.4
视频画面 08:21.4 · 1080P 原图 · 查看对应视频

接着,我们将刚才那三个huart2都改成ss_huart。这样写的好处是,当我们要用串口屏模拟器和stm32通信时,就不用将文件中的所有huart2改回huart1了。我们只需要将宏定义这一个huart2改成huart1就行了。这样写是不是节约了很多时间,而且不还不容易出错?

点击编译试一下,是不是也没有问题?好的,今天的视频就到这里了。您的关注,点赞和收藏是我持续更新下去的最大动力。我们下期见。