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

一.问题描述

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

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

  3. 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工程设置

  1. 新建工程,点击框住部分在这里插入图片描述 2. 搜索目的芯片,并双击在这里插入图片描述
    3.管脚设置

管脚定义界面

设置指示灯LED引脚PB5,设置引脚模式为输出模式GPIO_Output
设置按键引脚PA1,设置引脚为外部中断功能,PA1与外部中断线EXIT1连接GPIO_EXIT1
在这里插入图片描述
PB5保持默认设置,命名为LED在这里插入图片描述PA1触发方式为上升沿触发,命名为 A1_EXTI在这里插入图片描述使能对应外部中断线在这里插入图片描述
配置中断优先级
在这里插入图片描述

4.时钟配置
在这里插入图片描述

5.生成工程
在这里插入图片描述
注意文件路径不能含有中文
在这里插入图片描述

(三)代码编写

  1. 打开上部生成的工程文件
    在Keil文件中的gpio.c文件可以找到中断服务函数

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)

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

然后就会执行HAL_GPIO_EXTI_Callback(GPIO_Pin)函数,此函数为回调函数,我们打开可以发现前面有个weak。
前面的 __weak 表示此函数为虚函数,需要用户重写的。

  1. 打开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

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

(一)新建工程文件

  1. 如上STM32CubeMX工程设置1-2
  2. 外设设置
    设置RCC
    在这里插入图片描述
    设置SYS
    在这里插入图片描述
    设置USART1
    在这里插入图片描述
    设置NVIC
    在这里插入图片描述
    3.生成工程在这里插入图片描述
    在这里插入图片描述

(二)代码编写

1.打开工程在这里插入图片描述
2.main.c下定义全局变量

char c;//指令 s:停止  t:开始
char message[]="hello Windows\n";//输出信息
char tips[]="CommandError\n";//提示1
char tips1[]="Start.....\n";//提示2
char tips2[]="Stop......\n";//提示3
int 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时,发送提示并改变flag
	if(c=='s'){
		flag=0;
		HAL_UART_Transmit(&huart1, (uint8_t *)&tips2, strlen(tips2),0xFFFF); 
	}
	
	//当输入的指令为t时,发送提示并改变flag
	else if(c=='t'){
		flag=1;
		HAL_UART_Transmit(&huart1, (uint8_t *)&tips1, strlen(tips1),0xFFFF); 
	}
	
	//当输入不存在指令时,发送提示并改变flag
	else {
		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 的控制和两类串口通信方式,此次实验对现阶段的我还存在难度,需要参考大量资料,实现结果也有所偏差。

七.参考连接

https://blog.youkuaiyun.com/weixin_46129506/article/details/121164797?spm=1001.2014.3001.5502
https://blog.youkuaiyun.com/qq_46467126/article/details/121076618?spm=1001.2014.3001.5502
https://blog.youkuaiyun.com/qq_46467126/article/details/121055475?spm=1001.2014.3001.5502
https://mooc1.chaoxing.com/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
https://mooc1.chaoxing.com/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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值