本文主要介绍中断原理及相关的编程方法,使用stm32tubemx和HAL库实现用stm32F103核心板的GPIOA端一管脚接一个LED,GPIOB端口一引脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED亮灯;接低电平时,LED灭灯。串口中断方式做串口通信
目录
一、中断
1.什么是中断
中断是指计算机运行过程中,出现某些意外情况或非预期的急需处理事件,cpu能停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行或调度新的进程执行的过程。
中断分为同步中断和异步中断。
- 同步中断——同步中断是当指令执行时由 控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后 CPU 才会发出中断
- 异步中断——异步中断是由其他硬件设备依照 CPU 时钟信号随机产生的。
2 中断的作用
①提高计算机系统效率。计算机系统中处理机的工作速度远高于外围设备的工作速度。通过中断可以协调它们之间的工作。当外围设备需要与处理机交换信息时,由外围设备向处理机发出中断请求,处理机及时响应并作相应处理。不交换信息时,处理机和外围设备处于各自独立的并行工作状态。
②维持系统可靠正常工作。现代计算机中,程序员不能直接干预和操纵机器,必须通过中断系统向操作系统发出请求,由操作系统来实现人为干预。主存储器中往往有多道程序和各自的存储空间。在程序运行过程中,如出现越界访问,有可能引起程序混乱或相互破坏信息。为避免这类事件的发生,由存储管理部件进行监测,一旦发生越界访问,向处理机发出中断请求,处理机立即采取保护措施。
③满足实时处理要求。在实时系统中,各种监测和控制装置随机地向处理机发出中断请求,处理机随时响应并进行处理。
④提供故障现场处理手段。处理机中设有各种故障检测和错误诊断的部件,一旦发现故障或错误,立即发出中断请求,进行故障现场记录和隔离,为进一步处理提供必要的依据。
3 中断优先级
- 多个中断同时出现时,处理器先响应高优先级的中断
- 低优先级中断的ISR执行时,可以被高优先级中断再次打断
- ISR比App Code拥有更高的执行优先级
二、CubeMX以中断方式点灯
1 工程建立与环境配置
建立工程我就不多赘述了 如果需要教程可以看本人前面写的博客
(嵌入式系统开发)stm32CubeMX环境配置,配合keil使用寄存器点灯_我想恰鱼的博客-优快云博客
本人用的是STM32F103RC芯片
配置RCC使用外部时钟源,选择 HSE(外部高速时钟) 为 Crystal/Ceramic Resonator(晶振/陶瓷谐振器)
点击SYS选择Serial Wire
2 管脚,时钟设置
点击GPIO,选择自己用到的管脚,这里我的LED是连在PB5管脚,按键是连在PB6管脚
连接LED的管脚选择GPIO_Output
按键所连的管脚选择GPIO_EXIT user label 改为led
对于开关对应管脚PB6,设置其触发方式为上升沿触发
External Interrupt Mode with Rising edge trigger detection上升沿
External Interrupt Mode with Falling edge trigger detection下降沿
External Interrupt Mode with Rising/Falling edge trigger detection上升沿和下降沿
user label 改为key
选择pull down
使能对应的外部中断线,点击Enabled
调整时钟如图
完成工程名,IDE 设置
之后生成工程文件即可
3 代码编写
打开工程在mian.c里面添加代码
(已经简化)
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
for(long i = 1;i<72000;i++){}; //????
if(HAL_GPIO_ReadPin(key_GPIO_Port,key_Pin)==1)
{
HAL_GPIO_TogglePin(led_GPIO_Port,led_Pin);
}
}
编译无错即可
将代码烧录到stm32中
4 电路连接
本人使用的是正点原子ministm32开发板 连接如下:LED短脚接地,长脚接PB5,按键一端接3.3V,一端接PB6
5 结果展示
三、STM32CUBEMX生成中断通信代码
1工程设置
新建一个STM32CUBEMX工程,因为大部分配置与上面相同,下面只列举不同的地方
USART1中的Mode选择Asynchronous
NVIC Settings 一栏使能接收中断
之后导出Keil文件并打开。
2 代码编写
添加存放数据的数组
uint8_t a[]="Hello windows!\n";
添加回转函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Transmit_IT(&huart1, a, sizeof(a));
}
添加中断调用
HAL_UART_Transmit_IT(&huart1, a, sizeof(a));
编译烧录运行,成功以中断方式实现串口通信输出hello world!