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

目录

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

一.问题描述

  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暂时中断当前正在执行的程序而转去执行相应的事件处理程序,待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程。
STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第1张图片
STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第2张图片
中断分为同步中断和异步中断。

同步中断——同步中断是当指令执行时由 控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后 CPU 才会发出中断
异步中断——异步中断是由其他硬件设备依照 CPU 时钟信号随机产生的。
通常我们所说的中断指的是异步中断,我们将同步中断称为异常。(异常是由程序的错误产生的,或者是由内核必须处理的异常条件产生的)

(二)中断的作用

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

(三)中断优先级及类型

多个中断同时出现时,处理器先响应高优先级的中断
低优先级中断的ISR执行时,可以被高优先级中断再次打断
ISR比App Code拥有更高的执行优先级
STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第4张图片

中断的类型

硬中断:通过处理器中断信号线产生的中断
软中断:通过非法指令或特殊指令触发的中断

三.中断控制LED灯

(一)题目分析

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

此文章选用的核心板为STM32F103C8T6最小核心板
设置PA1端接开关,PB5接LED

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

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

LED灯的触发方式

按键按下瞬间,形成下降沿
按键释放瞬间,形成上升沿
因此这里设置上升沿触发,即松开按键时灯亮,因为题目要求为开关接高高电平亮灯。

(二)STM32CubeMX工程设置

  1. 新建工程,点击框住部分STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第5张图片 2. 搜索目的芯片,并双击STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第6张图片
    3.管脚设置

管脚定义界面

设置指示灯LED引脚PB5,设置引脚模式为输出模式GPIO_Output
设置按键引脚PA1,设置引脚为外部中断功能,PA1与外部中断线EXIT1连接GPIO_EXIT1
STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第7张图片
PB5保持默认设置,命名为LEDSTM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第8张图片PA1触发方式为上升沿触发,命名为 A1_EXTISTM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第9张图片使能对应外部中断线STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第10张图片
配置中断优先级
STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第11张图片

4.时钟配置
STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第12张图片

5.生成工程
STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第13张图片
注意文件路径不能含有中文
STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第14张图片

(三)代码编写

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


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

3.编译并生成hex文件
STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第16张图片

(四)实验效果

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
STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第17张图片

3.效果展示

LED

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

(一)新建工程文件

  1. 如上STM32CubeMX工程设置1-2
  2. 外设设置
    设置RCC
    STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第18张图片
    设置SYS
    STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第19张图片
    设置USART1
    STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第20张图片
    设置NVIC
    STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第21张图片
    3.生成工程STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第22张图片
    STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第23张图片

(二)代码编写

1.打开工程STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第24张图片
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:开始发送

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

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

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

STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第26张图片
3.while循环添加代码

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

STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第27张图片
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);  
}

STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第28张图片
5.编译结果STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第29张图片

(三)实验效果

1.线路连接

USB TO TTL——STM32F103
3V3——3V3
GND——GND
TXD——A10

2.烧录

芯片boot1为0,boot0为1
STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第30张图片

3.效果展示

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

串口通信

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

(一)什么是DMA

1.DMA概念

直接存储器访问 (DMA)
DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。
DMA传输过程的初始化和启动由CPU完成,传输过程由DMA控制器来执行,无需CPU参与,从而节省CPU资源,提高利用率。
STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第31张图片
STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第32张图片
STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第33张图片

2.DMA数据传输方式

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

3.DMA接口函数

STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第35张图片
STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第36张图片
STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第37张图片

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

1. 新建工程

搜索目的芯片,双击
STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第38张图片

设置RCCSTM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第39张图片
设置串口USART1STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第40张图片
使能中断
STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第41张图片
设置DMA
点击DMA Settings的Add添加通道,传输速率设置为中速Medium
STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第42张图片
模式设置为Normal,右侧选择Memory在这里插入图片描述
在System view下选择DMASTM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第43张图片
设置时钟STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第44张图片

命名选择路径,生成工程文件
STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第45张图片

2.代码编写

打开上部生成的文件
在main中添加代码

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

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

在while中添加代码

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

STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第47张图片
编译STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第48张图片

3.烧录

芯片boot1为0,boot0为1
STM32F103中断方式实现led灯的控制和串口通信,DMA通信原理及给上位机发送数据_第49张图片

4.效果展示

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

六.总结

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

七.参考连接

https://blog.csdn.net/weixin_46129506/article/details/121164797?spm=1001.2014.3001.5502
https://blog.csdn.net/qq_46467126/article/details/121076618?spm=1001.2014.3001.5502
https://blog.csdn.net/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

你可能感兴趣的:(笔记,stm32,单片机,arm)