1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > HAL库实验中断开关点灯及串口通信

HAL库实验中断开关点灯及串口通信

时间:2018-08-21 12:27:17

相关推荐

HAL库实验中断开关点灯及串口通信

本文主要介绍stm32、DMA通信原理和编程方法,使用stm32tubemx和HAL库分别完成下面两个编程练习。

文章目录

一、中断介绍1.中断的定义2.中断的作用3.中断的类型及优先级二、CubeMX中断方式点灯1.题目要求2.实物准备3.工程设置4.代码调试5.电路连接6.效果演示三、中断方式串口通信1.题目要求2.工程设置3. 代码测试4.效果演示四、串口DMA连续向上位机连续发送数据1.DMA基本介绍2.题目要求3.工程设置4.代码调试5.串口调试四、总结参考

一、中断介绍

1.中断的定义

中断是指计算机在执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的.。事件处理程序,待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程。

中断分为同步中断和异步中断。

同步中断——同步中断是当指令执行时由 控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后 CPU 才会发出中断

异步中断——异步中断是由其他硬件设备依照 CPU 时钟信号随机产生的。

2.中断的作用

当中断信号达到肘, CPU 必须停止它当前正在做的事情,并且切换到一个另一个活动。为了做到这就要在内核态堆钱保存程序计数器的当前值 (寄存器的内容) ,并把与中断类型相关的地址放进程序计数量。

中断处理是指CPU响应中断,转入中断处理程序,系统开始处理中断。

中断响应是指CPU收到中断请求后转向相应的事件处理程序。

开中断后,系统就可以响应其他的中断了,关中断后,系统不响应其他的中断除非优先级高的中断。

中断屏蔽是指在中断请求产生后,系统用软件方式有选择地封锁部分中断而允许其余部分中断仍能得到响应。

3.中断的类型及优先级

中断的类型

硬中断:通过处理器中断信号线产生的中断

软中断:通过非法指令或特殊指令触发的中断

中断优先级

1.多个中断同时出现时,处理器先响应高优先级的中断

2.低优先级中断的ISR执行时,可以被高优先级中断再次打断

3.ISR比App Code拥有更高的执行优先级

二、CubeMX中断方式点灯

1.题目要求

用stm32F103核心板的GPIOA端一管脚接一个LED,GPIOB端口一引脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED亮灯;接低电平时,LED灭灯。

2.实物准备

STM32F103C8T6最小核心板

设置PB5端接开关,PA2接LED

LED灯的触发方式

按键按下瞬间,形成下降沿

按键释放瞬间,形成上升沿

3.工程设置

1.设置PA2接LED,PB5接开关

按键按下,引脚PB5读到低电平

按键释放,引脚PB5读到高电平

对于开关对应管脚PB5,设置其触发方式为上升沿触发

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处设置名字为A1_EXTI

使能对应的外部中断线,点击Enabled

2.配置中断优先级

3.时钟设置

之后生成工程文件即可

4.代码调试

在Keil文件中的gpio.c文件可以找到中断服务函数

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)

当捕获到上升沿,触发中断,就会进入到这个函数里面

然后就会执行HAL_GPIO_EXTI_Callback(GPIO_Pin)函数,此函数为回调函数,我们打开可以发现前面有个weak。

前面的 __weak 表示此函数为虚函数,需要用户重写的。

在main.c文件中找个地方重新写一下,在main函数下方插入下面代码。

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){if( GPIO_Pin == A1_EXTI_Pin)//判断外部中断源{HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);//翻转LED状态}}

编译

烧录

5.电路连接

GPIO默认是3.3V高电平,当按下按键,GPIO变为低电平,此过程是下降沿。松开按键,GPIO又变为高电平,此过程为上升沿。因为设置的是上升沿中断,也就是松开按键的时候,灯会变化。

LED长脚——3V3

LED短脚——PA2

PB5——3V3——亮灯

PB5——GND——熄灯

6.效果演示

演示

三、中断方式串口通信

1.题目要求

采用串口中断方式重做上周的串口通信作业,分别实现:

1)当stm32接收到字符“s”时,停止持续发送“hello windows!”; 当接收到字符“t”时,持续发送“hello windows!”;

2)当stm32接收到字符“stop stm32!”时,停止持续发送“hello windows!”; 当接收到字符“go stm32!”时,持续发送“hello windows!”

2.工程设置

设置RCC和SYS

设置USART

设置NVIC

3. 代码测试

在main函数前定义全局变量

char tips[]="go stm32";char c;//指令 s:停止 t:开始char message[]="hello Windows\r\n";//输出信息char sp[]="stop stm32";char g[]="go stm32\r\n";char *tt="go stm32";char *gg="stop stm32";int flag=0;//标志 0:停止发送 1.开始发送

在main函数中设置接收中断

HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

函数功能

功能:串口中断接收,以中断方式接收指定长度数据。

大致过程是,设置数据存放位置,接收数据长度,然后使能串口接收中断。

接收到数据时,会触发串口中断。

再然后,串口中断函数处理,直到接收到指定长度数据

而后关闭中断,进入中断接收回调函数,不再触发接收中断。(只触发一次中断)

本次实验设置接收中断

HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1); //接收字符中断

HAL_UART_Receive_IT(&huart1, (uint8_t *)&tips, strlen(tips)); //接收字符串中断

main函数中的while循环里面添加传输代码

if(flag==1){//发送信息HAL_UART_Transmit(&huart1, (uint8_t *)&message, strlen(message),0xFFFF); //延时HAL_Delay(1000);}

在main函数下面重写中断处理函数

接收字符时的中断处理函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){//当输入的指令为0时,发送提示并改变flagif(c=='s'){flag=0;}//当输入的指令为1时,发送提示并改变flagelse if(c=='t'){flag=1;}//重新设置中断HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1); }

接收字符串时的中断处理函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){//当输入的指令为1时,发送提示并改变flagif(strcmp(tips,tt)==0){flag=1;HAL_UART_Transmit(&huart1, (uint8_t *)&g, strlen(g),0xFFFF);}//当输入的指令为0时,发送提示并改变flagelse{flag=0;HAL_UART_Transmit(&huart1, (uint8_t *)&sp, strlen(sp),0xFFFF); }//重新设置中断HAL_UART_Receive_IT(&huart1, (uint8_t *)&tips, strlen(tips)); }

4.效果演示

四、串口DMA连续向上位机连续发送数据

1.DMA基本介绍

DMA,全称Direct Memory Access,即直接存储器访问。

DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。

DMA传输参数

当用户将参数设置好,主要涉及源地址、目标地址、传输数据量这三个,DMA控制器就会启动数据传输,当剩余传输数据量为0时 达到传输终点,结束DMA传输 ,当然,DMA 还有循环传输模式 当到达传输终点时会重新启动DMA传输。

也就是说只要剩余传输数据量不是0,而且DMA是启动状态,那么就会发生数据传输。

2.题目要求

STM32采用串口DMA方式,用115200bps或更高速率向上位机连续发送数据。

3.工程设置

设置RCC

设置串口

中断

DMA设置

选择DMA

时钟设置

之后导出Keil工程文件即可

4.代码调试

在main.c文件添加代码

uint8_t Senbuff[] = “Hello world!”; //定义数据发送数组

HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff));

HAL_Delay(1000);

5.串口调试

四、总结

通过本次学习,了解了中断的相关知识,并实操了点灯和串口通信。中断方式不必等待数据的传输过程,只需要在每字节数据收发完成后,由中断标志位触发中断,在中断服务程序中放入新的一字节数据或者读取接收到的一字节数据。DMA传输过程不占用CPU资源,可以边传输边运行其他任务,更加高效。

参考

l/qq_46467126/article/details/121055475

/qq_3867/article/details/72236576

/qq_44918248/article/details/114579472

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。