100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > STM32F103中断方式实现led灯的控制和串口通信 DMA通信原理及给上位机发送数据

STM32F103中断方式实现led灯的控制和串口通信 DMA通信原理及给上位机发送数据

时间:2018-09-11 19:38:04

相关推荐

STM32F103中断方式实现led灯的控制和串口通信 DMA通信原理及给上位机发送数据

目录

一.问题描述二.中断介绍(一)什么是中断(二)中断的作用(三)中断优先级及类型三.中断控制LED灯(一)题目分析(二)STM32CubeMX工程设置(三)代码编写(四)实验效果1.线路连接2.烧录3.效果展示四.中断方式实现串口通信(一)新建工程文件(二)代码编写(三)实验效果1.线路连接2.烧录3.效果展示五.DMA通信及向上位机连续发送数据(一)什么是DMA1.DMA概念2.DMA数据传输方式3.DMA接口函数(二)DMA方式给上位机发送数据1. 新建工程2.代码编写3.烧录4.效果展示六.总结七.参考连接

一.问题描述

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

采用串口中断方式重做上周的串口通信作业,分别实现:1)当stm32接收到字符“s”时,停止持续发送“hello windows!”; 当接收到字符“t”时,持续发送“hello windows!”(提示:采用一个全局标量做信号灯);2)当stm32接收到字符“stop stm32!”时,停止持续发送“hello windows!”; 当接收到字符“go stm32!”时,持续发送“hello windows!”(提示:要将接收到的连续字符保存到一个字符数组里,进行判别匹配。写一个接收字符串的函数。

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

二.中断介绍

(一)什么是中断

中断通常被定义为一个事件,该事件能够改变处理器执行指令的顺序。这样的事件与 CPU 芯片内外部硬件电路产生的电信号相对应。

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

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

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

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

通常我们所说的中断指的是异步中断,我们将同步中断称为异常。(异常是由程序的错误产生的,或者是由内核必须处理的异常条件产生的)

(二)中断的作用

(三)中断优先级及类型

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

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

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

中断的类型

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

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

三.中断控制LED灯

(一)题目分析

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

此文章选用的核心板为STM32F103C8T6最小核心板

设置PA1端接开关,PB5接LED

对于按键电路,设置上拉式按键

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

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

LED灯的触发方式

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

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

因此这里设置上升沿触发,即松开按键时灯亮,因为题目要求为开关接高高电平亮灯。

(二)STM32CubeMX工程设置

新建工程,点击框住部分 2. 搜索目的芯片,并双击

3.管脚设置

管脚定义界面

设置指示灯LED引脚PB5,设置引脚模式为输出模式GPIO_Output

设置按键引脚PA1,设置引脚为外部中断功能,PA1与外部中断线EXIT1连接GPIO_EXIT1

PB5保持默认设置,命名为LEDPA1触发方式为上升沿触发,命名为 A1_EXTI使能对应外部中断线

配置中断优先级

4.时钟配置

5.生成工程

注意文件路径不能含有中文

(三)代码编写

打开上部生成的工程文件

在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状态}}

3.编译并生成hex文件

(四)实验效果

1.线路连接

USB TO TTL——STM32F103

3V3——3V3

GND——GND

TXD——A10

RXD——A9

STM32F103 ——LED

3.3——LED长脚

B5——LED短脚

A1——3V3——亮灯

A1——GND——熄灯

面包板地接STM32地

2.烧录

boot1为0,boot0为1

3.效果展示

LED

四.中断方式实现串口通信

(一)新建工程文件

如上STM32CubeMX工程设置1-2外设设置

设置RCC

设置SYS

设置USART1

设置NVIC

3.生成工程

(二)代码编写

1.打开工程

2.main.c下定义全局变量

char c;//指令 s:停止 t:开始char message[]="hello Windows\n";//输出信息char tips[]="CommandError\n";//提示1char tips1[]="Start.....\n";//提示2char tips2[]="Stop......\n";//提示3int flag=0;//标志 s:停止发送 t:开始发送

2.main函数中设置接收中断

HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);

3.while循环添加代码

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

4.main函数下重写中断处理函数

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

5.编译结果

(三)实验效果

1.线路连接

USB TO TTL——STM32F103

3V3——3V3

GND——GND

TXD——A10

2.烧录

芯片boot1为0,boot0为1

3.效果展示

打开野火串口助手,选择com5

串口通信

五.DMA通信及向上位机连续发送数据

(一)什么是DMA

1.DMA概念

直接存储器访问 (DMA)

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

DMA传输过程的初始化和启动由CPU完成,传输过程由DMA控制器来执行,无需CPU参与,从而节省CPU资源,提高利用率。

2.DMA数据传输方式

3.DMA接口函数

(二)DMA方式给上位机发送数据

1. 新建工程

搜索目的芯片,双击

设置RCC

设置串口USART1

使能中断

设置DMA

点击DMA Settings的Add添加通道,传输速率设置为中速Medium

模式设置为Normal,右侧选择Memory

在System view下选择DMA

设置时钟

命名选择路径,生成工程文件

2.代码编写

打开上部生成的文件

在main中添加代码

uint8_t Senbuff[] = "Hello windows"; //定义数据发送数组

在while中添加代码

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

编译

3.烧录

芯片boot1为0,boot0为1

4.效果展示

六.总结

本文章介绍中断及DMA 简单概念,实现了LED 的控制和两类串口通信方式,此次实验对现阶段的我还存在难度,需要参考大量资料,实现结果也有所偏差。

七.参考连接

/weixin_46129506/article/details/121164797?spm=1001..3001.5502

/qq_46467126/article/details/121076618?spm=1001..3001.5502

/qq_46467126/article/details/121055475?spm=1001..3001.5502

/ueditorupload/read?objectId=38f0edb7f0eeac3b7ebc6a7100d536b7&fileOriName=%25E7%25AC%25AC%25E4%25B8%2583%25E7%25AB%25A0__%25E4%25B8%25AD%25E6%2596%25AD%25E7%25B3%25BB%25E7%25BB%259F(new).pdf

/ueditorupload/read?objectId=05868bc268f33bd95dd854dbdaf4cd23&fileOriName=%25E7%25AC%25AC%25E4%25B9%259D%25E7%25AB%25A0__%25E4%25B8%25B2%25E5%258F%25A3%25E9%2580%259A%25E4%25BF%25A1(new).pdf

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