通过stm32tubemx和HAL库采用串口中断实现串口通信,串口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或更高速率向上位机连续发送数据。

目录

一、中断实例演示

1、环境配置

 时钟RCC配置

管脚配置

​编辑sys配置

 GPIO配置

 NVIC配置

 时钟树配置

2、导出工程 

 3、连接烧录

电路连接

mcuisp烧录

4、 效果演示

二、采用中断方式编程实现串口通信

 1、环境配置

 RCC

 引脚设置

 PLLCLK

二、导出工程 

3、连接烧录

4、接收通讯

三、 采用DMA方式编程实现串口通信

1、环境配置

Clock Configuration

NVIC

 DMA

2、导出工程 

3、连接烧录 

4接收通讯

四、总结 

五、参考文献


一、中断实例演示

1、环境配置

首先,打开stm32CubeMX,选择芯片stm32F103C8,如下图所示

通过stm32tubemx和HAL库采用串口中断实现串口通信,串口DMA向上位机连续发送数据_第1张图片

 时钟RCC配置

将HSE选为外部晶振模式;

通过stm32tubemx和HAL库采用串口中断实现串口通信,串口DMA向上位机连续发送数据_第2张图片

管脚配置

根据题目中的功能,这里选择PA5作为LED灯的连接管脚,PB9 作为杜邦线(等价于开关)的连接管脚;
具体配置是:左击PA5端口选择GPIO_Output模式;

通过stm32tubemx和HAL库采用串口中断实现串口通信,串口DMA向上位机连续发送数据_第3张图片sys配置

点击右侧“SYS”,在Debug调试界面下选择Serial Wire模式;

通过stm32tubemx和HAL库采用串口中断实现串口通信,串口DMA向上位机连续发送数据_第4张图片

 GPIO配置

点击左侧GPIO,PA5是高电平触发,所以不需要改变设置,这里将该管脚的名字改成了“A5_LED”,但PB5需要重新配置;
首先,选中PB5,将GPIO Mode设置为下降沿触发外部中断;
将GPIO Pull-up/Pull-down设置为上拉电阻模式;
将User Label设置为B9_EXTI,如下图;

通过stm32tubemx和HAL库采用串口中断实现串口通信,串口DMA向上位机连续发送数据_第5张图片

 NVIC配置

点击左侧NVIC,勾选EXTI line[9:5]interrupts,表示能够中断;

通过stm32tubemx和HAL库采用串口中断实现串口通信,串口DMA向上位机连续发送数据_第6张图片

 时钟树配置

点击Clock Configuration,将时钟树配置为72MHZ,点击回车即可

通过stm32tubemx和HAL库采用串口中断实现串口通信,串口DMA向上位机连续发送数据_第7张图片

2、导出工程 

点击Project Manager,首先设置工程名和路径以及导出方式;

通过stm32tubemx和HAL库采用串口中断实现串口通信,串口DMA向上位机连续发送数据_第8张图片

 然后点击右侧Code Generator,进行工程文件设置,具体勾选如下:

通过stm32tubemx和HAL库采用串口中断实现串口通信,串口DMA向上位机连续发送数据_第9张图片

进行完上述步骤后,就可以进行上图的第四步导出工程了,导出后选择打开工程即可在Keil中打开该工程;

工程打开后如下图所示:

通过stm32tubemx和HAL库采用串口中断实现串口通信,串口DMA向上位机连续发送数据_第10张图片

同时,对工程进行编译 

 没有出现问题

注意,记得生成hex文件用于后续的烧录

 3、连接烧录

电路连接

电路连接与之前博客的连接方式相同,只需要更改led灯的端口和杜邦线(代替开关)的端口即可;

mcuisp烧录

首先,打开烧录软件mcuisp,将USB-TTL串口接入电脑,点击搜索串口即可看到接入的USB串口,然后将传输速率设置115200bit/s;
接下来,找到刚刚在keil中生成的HEX文件,点击“读器件信息”,右侧状态栏里显示一切正常后,就可以点击“开始编程”进行烧录了;

通过stm32tubemx和HAL库采用串口中断实现串口通信,串口DMA向上位机连续发送数据_第11张图片

4、 效果演示

二、采用中断方式编程实现串口通信

 1、环境配置

通过stm32tubemx和HAL库采用串口中断实现串口通信,串口DMA向上位机连续发送数据_第12张图片

 RCC

HSE那里设为Crystal/Ceramic Resonator

通过stm32tubemx和HAL库采用串口中断实现串口通信,串口DMA向上位机连续发送数据_第13张图片

 引脚设置

此次实验选PB0为外部中断触发器,点击相应的引脚设置选择为GPIO_EXTI0,PA1为控制LED灯,点击相应的引脚设置选择为GPIO_output

通过stm32tubemx和HAL库采用串口中断实现串口通信,串口DMA向上位机连续发送数据_第14张图片

 通过stm32tubemx和HAL库采用串口中断实现串口通信,串口DMA向上位机连续发送数据_第15张图片

 PLLCLK

晶振频率最大值改为72MHz
通过stm32tubemx和HAL库采用串口中断实现串口通信,串口DMA向上位机连续发送数据_第16张图片

GPIO 

点击System core里的GPIO,把点击引脚名,把输出等级改为high

通过stm32tubemx和HAL库采用串口中断实现串口通信,串口DMA向上位机连续发送数据_第17张图片

二、导出工程 

通过stm32tubemx和HAL库采用串口中断实现串口通信,串口DMA向上位机连续发送数据_第18张图片右侧Code Generator,进行工程文件设置,具体勾选如下:

通过stm32tubemx和HAL库采用串口中断实现串口通信,串口DMA向上位机连续发送数据_第19张图片

导出后选择打开工程即可在Keil中打开该工程;

工程打开后如下图所示:

通过stm32tubemx和HAL库采用串口中断实现串口通信,串口DMA向上位机连续发送数据_第20张图片

main.c文件,在int main(void)中,加上如下代码(这是HAL库中的中断接收函数)

HAL_UART_Receive_IT(&huart1,A,15);

在int main(void)外,先定义一个全局变量,用于存储接收的字符

uint8_t A[15];

.然后编写一个中断回调函数,这是一个弱函数,直接对其进行编写

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	HAL_UART_Transmit_IT(&huart1,A,15);
	HAL_UART_Receive_IT(&huart1,A,15);
}

进行编译

同时生成hex文件

3、连接烧录

与上次作业没有区别STM32串口通信_weixin_45203491的博客-CSDN博客

4、接收通讯

三、 采用DMA方式编程实现串口通信

1、环境配置

与之前的步骤大同小异,注意不同的地方在

Clock Configuration

通过stm32tubemx和HAL库采用串口中断实现串口通信,串口DMA向上位机连续发送数据_第21张图片

NVIC

设置优先级为1

通过stm32tubemx和HAL库采用串口中断实现串口通信,串口DMA向上位机连续发送数据_第22张图片

 DMA

点击Add添加RX和TX

通过stm32tubemx和HAL库采用串口中断实现串口通信,串口DMA向上位机连续发送数据_第23张图片

 设置输入方向,最下方勾选Memory

通过stm32tubemx和HAL库采用串口中断实现串口通信,串口DMA向上位机连续发送数据_第24张图片

2、导出工程 

点击Project Manager,首先设置工程名和路径以及导出方式;

通过stm32tubemx和HAL库采用串口中断实现串口通信,串口DMA向上位机连续发送数据_第25张图片

 然后点击右侧Code Generator,进行工程文件设置,具体勾选如下:

通过stm32tubemx和HAL库采用串口中断实现串口通信,串口DMA向上位机连续发送数据_第26张图片

导出后选择打开工程即可在Keil中打开该工程;

工程打开后如下图所示:

通过stm32tubemx和HAL库采用串口中断实现串口通信,串口DMA向上位机连续发送数据_第27张图片

这一步的程序编写和上述中断通信的基本相似,因为我们用的是HAL库函数实现,只需要将库函数中TI改为DMA。
打开main.c文件,在int main(void)中加上如下代码(HAL库中的中断接收函数)

HAL_UART_Receive_DMA(&huart1,A,15);

 在int main(void)外,先定义一个全局变量,用于存储接收的字符

uint8_t A[15];

.然后编写一个中断回调函数,这是一个弱函数,直接对其进行编写

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	HAL_UART_Transmit_IT(&huart1,A,15);
	HAL_UART_Receive_IT(&huart1,A,15);
}

进行编译

同时生成hex文件

3、连接烧录 

与上次作业没有区别STM32串口通信_weixin_45203491的博客-CSDN博客

4接收通讯

烧录完成后,选择串口工具,进行实验

四、总结 

本次实验我学习了Stm32中断、DMA通信原理和编程方法,,明白了如何用HAL库采用中断方式和DMA方式编程,同时加强了对Stm32tubemx软件和HAL库的使用理解体会到了两种方式独自的特点。

五、参考文献

STM32中断与DMA通信编程_小王爱吃鱼的博客-CSDN博客

STM32CubeMX基于HAL库实现简单串口通信_Karmen_的博客-CSDN博客

基于Stm32tubemx用HAL库完成控制LED灯、串口通信以及采用串口DMA方式向上位机连续发送数据_迷信的兔子的博客-CSDN博客

你可能感兴趣的:(串口通信,stm32)