电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
【小熊派BearPi-loT开发板连载】配置小熊派的串口(二)
分 享
扫描二维码分享
【小熊派BearPi-loT开发板连载】配置小熊派的串口(二)
小熊派
BearPi
串口
瑟寒凌风
关注
发布时间: 2021-03-30
丨
阅读: 502
# 中断 中断是计算机中的一个十分重要的概念,在现代计算机中毫无例外地都采用中断机制。在计算机执行程序的过程中,由于出现某个特殊情况(或称为"事件"),使得CPU中止现行程序,而转去执行处理该事件的处理程序(俗称中断处理或中断服务程序),待中断服务程序执行完毕,再返回断点继续执行原来的程序,这个过程称为中断。 中断通常被定义为一个事件,该事件能够改变处理器执行指令的顺序。这样的事件与 CPU 芯片内外部硬件电路产生的电信号相对应。 中断分为同步中断和异步中断。 同步中断——同步中断是当指令执行时由 控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后 CPU 才会发出中断。 异步中断——异步中 断是由其他硬件设备依照 CPU 时钟信号随机 产生的。 通常我们所说的中断指的是异步中断,我们将同步中断称为异常。(异常是由程序的错误产生的,或者是由内核必须处理的异常条件产生的) 中断处理是由内核执行的最敏感的任务之一,因为它必须满足下列约束: ```c 1)中断应该被尽可能快地处理完。 2)中断处理程序必须编成使相应的内核控制路径能以嵌套的方式执行。 3)内核在处理一个中断时,可接受新的中断。但存在一个临界区,中断必须被禁止。 ``` 出于1)和3)的约束,中断的设计一般将中断处理程序分为两部分执行(即上半部和下半部函数)。上半部为中断被禁止的临界区,执行关键而紧急的任务,如把接收到的帧拷贝到输入队列,以便下半部函数执行时能进行处理。 本次我们来配置串口接收中断,通过串口控制LED灯的亮灭。 # 程序编写 打开STM32CubeMX,配置LED引脚和UART引脚,如下图所示 ![](https://cf02.ickimg.com/bbsimages/202103/6b3f2d297dcd94b78434964e155a4b13.jpg) 时钟配置 ![](https://cf02.ickimg.com/bbsimages/202103/115ca35edda7c9b990c5fe7f1cdbfe55.jpg) LED引脚配置 ![](https://cf02.ickimg.com/bbsimages/202103/068669453dda3caf6af1207b62d1f9f4.jpg) 串口配置 ![](https://cf02.ickimg.com/bbsimages/202103/6746fa7f8bf0ef60495dd29e4ca6ce07.jpg) 配置串口中断,首先勾选串口全局中断,如下图 ![](https://cf02.ickimg.com/bbsimages/202103/14a535bf48b7752b85e06ffcd4abea4f.jpg) ![](https://cf02.ickimg.com/bbsimages/202103/cca8e6b19bf7489ffae0756eefa59860.jpg) 然后点击如下图标,生成代码 ![](https://cf02.ickimg.com/bbsimages/202103/9a569639faccb5f47e594405d30958c2.jpg) 首先,我们定义一个全局变量在main.h中,我们用这个变量来控制LED的亮灭,如下图 ![](https://cf02.ickimg.com/bbsimages/202103/621713e2736d7fd280ffd9423a0b6817.jpg) ```c extern volatile int irq_flag; ``` 在usart.c的后面添加中断处理回调函数,内容如下 ```c void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart == &huart2) { HAL_UART_Receive_IT(&huart2,(uint8_t *)&irq_flag,1); } } ``` 修改main.c中的main函数,内容如下 ```c #include "main.h" #include "stm32l4xx_hal.h" #include "usart.h" #include "gpio.h" void SystemClock_Config(void); static void MX_NVIC_Init(void); volatile int irq_flag = 0; int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART2_UART_Init(); MX_NVIC_Init(); HAL_UART_Receive_IT(&huart2,(uint8_t *)&irq_flag,1); while (1) { if(irq_flag == 0) HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); else HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); HAL_Delay(100); } } ``` 程序中通过我们自定义标志位判断irq_flag的值,如果这个值为0,熄灭LED等,如果这个值非零,开启LED,如下图 ![](https://cf02.ickimg.com/bbsimages/202103/dbdbc59bbffeacb3be843acb5e8bfe6e.jpg) ![](https://cf02.ickimg.com/bbsimages/202103/55db109bf0864cf7ecf235831b473841.jpg)
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
瑟寒凌风
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交