串口与中断的小结合
通过上一篇的讲解,我们下面来实现每按一下灯实现计数,并且从串口输入数字改变计数值,然后接着串口输入的值来继续往后计数实现一下要求:
(1)记录开发板上按键KEY1的闭合次数,即每按一次按键,计数加1。
(2)要求具有按键防抖功能,通过中断方式实现按键计数;
(3)能够把计数值通过串口显示到PC上;
(4)能够通过PC串口发送数据给开发板修改计数值,要求串口利用中断方式接收数据;
(5)同时要求LED1灯进行闪烁变化,要求每按一次按键灯的状态与前一次相反,
例如第一按键LED1点亮,第二次按键LED1熄灭,第三次点亮,第四次熄灭。
首先我们看到要求提到要用key1来控制小灯的亮灭,我之前的篇章中已经讲到任何查看按键,所以我们可以知道stm32F103是GPIOE3控制key1,
其次我们看到要求通过中断方式实现防抖和按键计数,并且把计数值通过串口显示到PC上
(1)我们需要在led.c的文件中初始化GPIOE3的按键
(2)我们需要将防抖和按键计数放在中断中
extern是可以在整个项目中可以使用的,而static是局部静态变量,因为我们要实现之后的从串口接收数据并且改变值,
所以我们需要在串口的文件中调用,需要在main函数的开始声明,才可以在整个文件中使用
画线的为关键的语句,实现检测GPIOE3是否按下,以及LED1的反置,计数值的增加,最为重要的是需要清除中断标志位,不然会进入中断循环
(3)从串口接收数据并实现并且改变计数值,然后继续计数
改变以上数值即可实现led计数并且从PC输出,从串口接收数据,然后改变计数值,继续计数
以下为硬件连接图:
前面三根线和之前跑马灯的线连接是一样的,因为我们需要运用到led1灯,后面橙色的线连接RXD连接第二图的3位置PA10(TXD),
黄色的线TXD连接第二图的2位置PA9(RXD),绿色接GND的线接到板子任意的接地就好了,在图二中的1位置GND
当硬件连接好时,将程序下到板子里后打开串口工具就可以看见下图,当选择串口号COM3(在计算机的设备管理器中查看串口号),
波特9600,并且打开后,连续按下key1时便会显示出(由于我在打开串口前按了一下按键,所以数字从2开始)02,03,04,05,然后
我往下面窗口输入10之后,按发送,它最左下角出现发送成功,说明串口已经接收数据,最后再继续按按键时,计数就从10开始往后
加一(别忘记,给串口发送东西时要以16进制发送)
因为在程序里面你从串口获取数据是用USART_ReceiveData()的函数,而它的返回值便是与16进制的01FF相与,
所以我们要用16进制数来发送。