文章目录
一.中断方式阐述
1.中断方式
中断方式属于处理器和外设传输数据方式的一种。
2.简要过程
中断发生
:当cpu正在处理A事件,收到了B事件的处理请求
中断处理
:cpu暂停对A的处理,转向处理B事件
中断完成
:cpu处理完B事件,返回继续处理A事件
需要注意:当cpu在处理B时,如果接到C事件的中断请求,则需判断中断请求的优先级,决定是否暂停对B的处理,转去处理C事件,若有更多中断请求,以此类推,此为中断嵌套。
中断优先级
:不同的中断有不同的优先级
处理原则
:高级中断可以打断低级中断;低级中断不能打断高级中断
HAL 库初始化函数 HAL_Init 将优先级分组设置为第4组,即有0~15,共16级抢占优先级,没有子优先级。编号越小的优先级越高:0号为最高,15号为最低。
二.中断方式开关灯
1.按键电路
(图片源自网络)
实际电路中我们采用用杜邦线的连接模拟代替按键的开关
上拉式按键
:
按键按下(接低电平),引脚 PB15 读到低电平
按键释放(接高电平),引脚 PB15 读到高电平
触发方式
:
按键按下瞬间,形成下降沿
按键释放瞬间,形成上升沿
2.STM32建立工程
1.配置SYS
2.GPIO 配置
选择PA6引脚连接LED灯(GPIO-output)
选择PB15作为外部中断引脚(GPIO-EXTI15)
外设配置
① 将 GPIO_PA6 命名为 LED
② 将 GPIO_PB15 命令为EXTI ,触发方式选择下降沿触发
③ 使能引脚对应的外部中断线 EXTI line[15:10]
④ 配置中断优先级
3.生成keil工程
4.添加代码
将下面代码写入图中 main.c 的对应位置处
/*
* @brief EXTI line detection callbacks.
* @param GPIO_Pin: Specifies the pins connected EXTI line,
* @retval None
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if( GPIO_Pin == EXTI_Pin ) // 判断外部中断源
{
HAL_GPIO_TogglePin(LD1_GPIO_Port, LED_Pin); // 翻转LED状态
}
}
5.编译烧录
中断开关灯
从实际效果可以看到:
GPIO_PB15 接高电平时,LED 亮;接低电平时,LED 灭
三.中断方式实现串口通信
1.STM32配置
1.配置SYS
2.配置RCC
3.配置UART
4.配置NVIC
5.生成keil工程
2.添加代码
1.定义全局变量
char c;//指令:s:停止;t:开始
char message[]="hello Windows\n";//输出信息
char tips[]="输入错误\n";//提示1
char tips1[]="go stm32!\n";//提示2
char tips2[]="stop stm32!\n";//提示3
int flag=0;//标志 0:停止发送 1.开始发送
2.在main函数中设置接收中断
函数原型
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
UART_HandleTypeDef *huart UATR的别名
huart1 *pData 接收到的数据存放地址
Size 接收的字节数
修改后:
HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
main函数中的while循环里面添加传输代码
if(flag==1){
//发送信息
HAL_UART_Transmit(&huart1, (uint8_t *)&message, strlen(message),0xFFFF);
//延时
HAL_Delay(1000);
}
3.生成hex文件并烧录
4.效果展示
四.DMA方式向上位机连续发送数据
1.DMA介绍
DMA
,全称Direct Memory Access,即直接存储器访问。
DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。
DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。
DMA所需要的核心参数:
1
数据的源地址
2
数据传输位置的目标地址
3
传递数据多少的数据传输量
4
进行多少次传输的传输模式
DMA特征
在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推);
每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求;
存储器和存储器间的传输、外设和存储器、存储器和外设之间的传输;
可编程的数据传输数目:最大为65535
DMA传输方式
方法1
:DMA_Mode_Normal,正常模式,
当一次DMA数据传输完后,停止DMA传送 ,也就是只传输一次
方法2:
DMA_Mode_Circular ,循环传输模式
当传输结束时,硬件自动会将传输数据量寄存器进行重装,进行下一轮的数据传输。 也就是多次传输模式
2.STM32建立工程
1.配置SYS
2.配置RCC
3.配置USART
设置MODE为异步通信(Asynchronous)
NVIC Settings 一栏使能接收中断
4.DMA设置
右侧点击System Core 点击DMA
右侧点击System Core 点击DMA
在DMA设置界面添加DMA 而没有开启对应外设的话 ,默认为MENTOMEN
5.时钟源设置
3.生成keil工程
4.添加代码
在main.c中添加:
uint8_t Senbuff[] = "Hello world!"; //定义数据发送数组
while循环:
while (1)
{
/* USER CODE END WHILE */
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff));
HAL_Delay(1000);
/* USER CODE BEGIN 3 */
}
5.编译烧录
发现程序成功写入,但单片机接收不到数据
经过多次对比发现,是在烧录过程中选择了使用Ramisp
关于“使用Ramisp”的介绍
修改烧录选项,再次实验
可以看到实验成功
五.总结
本次实验,通过学习中断模式相关知识,掌握了其基本运行流程,实验过程中也参考了诸多学长学姐的实验过程,发现同样的问题可能由不同原因引起,通过查阅资料,不断试错,最终解决了问题。这使我学会在解决问题的过程中,要多方面去考虑问题的病因,同时要有一个强大的内心,要有接受 失败的能力,希望在以后的学习中能保持这一点,这样事情才会更加顺利。
六.参考资料
https://blog.csdn.net/qq_47281915/article/details/121053903
https://blog.csdn.net/as480133937/article/details/104827639/
https://blog.csdn.net/qq_46467126/article/details/121076618?spm=1001.2014.3001.5502
https://blog.csdn.net/m0_58892312/article/details/121004248