通过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,如下图所示

 时钟RCC配置

将HSE选为外部晶振模式;

管脚配置

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

sys配置

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

 GPIO配置

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

 NVIC配置

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

 时钟树配置

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

2、导出工程 

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

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

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

工程打开后如下图所示:

同时,对工程进行编译 

 没有出现问题

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

 3、连接烧录

电路连接

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

mcuisp烧录

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

4、 效果演示

在这里插入图片描述

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

 1、环境配置

 RCC

HSE那里设为Crystal/Ceramic Resonator

 引脚设置

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

 

 PLLCLK

晶振频率最大值改为72MHz

GPIO 

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

二、导出工程 

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

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

工程打开后如下图所示:

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

NVIC

设置优先级为1

 DMA

点击Add添加RX和TX

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

2、导出工程 

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

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

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

工程打开后如下图所示:

这一步的程序编写和上述中断通信的基本相似,因为我们用的是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博客

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值