实验要求
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、环境配置
首先,打开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博客