实验要求
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接收通讯
四、总结
五、参考文献
首先,打开stm32CubeMX,选择芯片stm32F103C8,如下图所示
将HSE选为外部晶振模式;
根据题目中的功能,这里选择PA5作为LED灯的连接管脚,PB9 作为杜邦线(等价于开关)的连接管脚;
具体配置是:左击PA5端口选择GPIO_Output模式;
点击右侧“SYS”,在Debug调试界面下选择Serial Wire模式;
点击左侧GPIO,PA5是高电平触发,所以不需要改变设置,这里将该管脚的名字改成了“A5_LED”,但PB5需要重新配置;
首先,选中PB5,将GPIO Mode设置为下降沿触发外部中断;
将GPIO Pull-up/Pull-down设置为上拉电阻模式;
将User Label设置为B9_EXTI,如下图;
点击左侧NVIC,勾选EXTI line[9:5]interrupts,表示能够中断;
点击Clock Configuration,将时钟树配置为72MHZ,点击回车即可
点击Project Manager,首先设置工程名和路径以及导出方式;
然后点击右侧Code Generator,进行工程文件设置,具体勾选如下:
进行完上述步骤后,就可以进行上图的第四步导出工程了,导出后选择打开工程即可在Keil中打开该工程;
工程打开后如下图所示:
同时,对工程进行编译
没有出现问题
注意,记得生成hex文件用于后续的烧录
电路连接与之前博客的连接方式相同,只需要更改led灯的端口和杜邦线(代替开关)的端口即可;
首先,打开烧录软件mcuisp,将USB-TTL串口接入电脑,点击搜索串口即可看到接入的USB串口,然后将传输速率设置115200bit/s;
接下来,找到刚刚在keil中生成的HEX文件,点击“读器件信息”,右侧状态栏里显示一切正常后,就可以点击“开始编程”进行烧录了;
HSE那里设为Crystal/Ceramic Resonator
此次实验选PB0为外部中断触发器,点击相应的引脚设置选择为GPIO_EXTI0,PA1为控制LED灯,点击相应的引脚设置选择为GPIO_output
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文件
与上次作业没有区别STM32串口通信_weixin_45203491的博客-CSDN博客
与之前的步骤大同小异,注意不同的地方在
设置优先级为1
点击Add添加RX和TX
设置输入方向,最下方勾选Memory
点击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文件
与上次作业没有区别STM32串口通信_weixin_45203491的博客-CSDN博客
烧录完成后,选择串口工具,进行实验
本次实验我学习了Stm32中断、DMA通信原理和编程方法,,明白了如何用HAL库采用中断方式和DMA方式编程,同时加强了对Stm32tubemx软件和HAL库的使用理解体会到了两种方式独自的特点。
STM32中断与DMA通信编程_小王爱吃鱼的博客-CSDN博客
STM32CubeMX基于HAL库实现简单串口通信_Karmen_的博客-CSDN博客
基于Stm32tubemx用HAL库完成控制LED灯、串口通信以及采用串口DMA方式向上位机连续发送数据_迷信的兔子的博客-CSDN博客