赞
踩
一、中断模式简介
这一部分内容在之前的博客中,已经进行过介绍,这里就不再赘述,可自行前往进行学习:
https://blog.csdn.net/qq_53112972/article/details/127397133
二、实例演训
1. 实验一
1.1 题目要求
当stm32接收到字符“s”时,停止持续发送“hello windows!”;当接收到字符“t”时,持续发送“hello windows!”
1.2 实验工具
硬件:
STM32F103C8T(核心开发板)
usb to ttl(转接口)
软件:
STM32CubeMX(工程创建)
KEIl C51(代码编写)
FlyMcu(代码烧录)
Sscom(串口通信助手)
1.3 工程创建
1.3.1 STM32CubeMX工程创建
可以通过下面两种方式创建基础工程:
2.4.1 在main函数前定义全局变量
点击Part Number,选择对应开发板(这里选择的STM32F103C8):
然后点击Start .....:
1.3.2 工程外设设置
设置RCC:
设置SYS:
设置串口USART1,同时可查看波特率等设置是否正确:
设置NVIC:
1.3.3 工程文件配置
Project配置:
Code Generator配置:
Open Project:
1.4 Keil代码配置
1.4.1 在main函数前定义全局变量
代码如下:
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:开始发送
1.4.2 在main函数中设置接收中断
代码如下:
HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
1.4.3 while循环添加传输代码
代码如下:
if(flag==1){
//发送信息
HAL_UART_Transmit(&huart1, (uint8_t *)&message, strlen(message),0xFFFF);
//延时
HAL_Delay(1000);
}
1.4.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);
}
1.4.5 工程编译
编译结果如下:
1.5 实验展示
1.5.1 线路连接与烧录
usb to ttl ----> STM32F103C8T6核心开发板
3V3 —> 3V3
GND —> GND
RXD —> A9
TXD —> A10
核心板boot0接1
核心板boot1接0
代码烧录
打开FlyMcu
搜索串口,选择工程文件的hex文件,开始烧录:
1.5.2 串口助手实验演示
打开串口助手
当发送"t"后可以看到不断输出“hello Windows”:当输入"s"后端口停止输出:
2. 实验二
2.1 题目要求
当stm32接收到字符“stop stm32!”时,停止持续发送“hello windows!”;当接收到字符“go stm32!”时,持续发送“hello windows!”
2.2 实验工具
硬件:
STM32F103C8T(核心开发板)
usb to ttl(转接口)
软件:
STM32CubeMX(工程创建)
KEIl C51(代码编写)
FlyMcu(代码烧录)
Sscom(串口通信助手)
2.3 工程创建(与实验一较为雷同)
可以通过下面两种方式创建基础工程:
点击Part Number,选择对应开发板(这里选择的STM32F103C8):
然后点击Start .....:
设置RCC:
配置SYS:
设置串口USART1的MODE为异步通信Asynchronous,基础参数(波特率为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1,接收和发送都使能)和GPIO引脚设置( USART1_RX/USART_TX)使用默认即可:
设置NVIC:
使能中断:
时钟树设置:
Project配置:
Code Generator配置:
Open Project:
2.4 Keil代码配置
接收到字符“stop stm32!”和“go stm32!”与接收到字符“s”和“t”的区别在于要将接收到的连续字符保存到一个字符数组里,进行判别匹配。
所以要写一个接收字符串的函数
添加如下代码:
char c;//指令 0:停止 1:开始
char message[]="hello Windows\n";//输出信息
char tips[]="CommandError\n";//提示1
char tips1[]="go stm32\n";//提示2
char tips2[]="stop stm32\n";//提示3
int flag=0;//标志 0:停止发送 1.开始发送
2.4.2 在main函数中设置接收中断
函数原型:
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
功能:
串口中断接收,以中断方式接收指定长度数据。
大致过程是,设置数据存放位置,接收数据长度,然后使能串口接收中断。
接收到数据时,会触发串口中断。
再然后,串口中断函数处理,直到接收到指定长度数据
而后关闭中断,进入中断接收回调函数,不再触发接收中断。(只触发一次中断)
参数:
UART_HandleTypeDef *huart UATR的别名
huart1 *pData 接收到的数据存放地址
Size 接收的字节数
HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
2.4.3 在while循环里添加传输代码
代码如下:(注意添加头文件:#include <string.h>)
if(flag==1){
//发送信息
HAL_UART_Transmit(&huart1, (uint8_t *)&message, strlen(message),0xFFFF);
//延时
HAL_Delay(1000);
}
2.4.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);
}
1.5 实验展示
1.5.1 代码编译
编译结果:
1.5.2 线路连接与烧录
usb to ttl ----> STM32F103C8T6核心开发板
3V3 —> 3V3
GND —> GND
RXD —> A9
TXD —> A10
核心板boot0接1
核心板boot1接0
代码烧录
打开FlyMcu
搜索串口,选择工程文件的hex文件,开始烧录:
1.5.3 串口助手实验演示
打开串口助手
当串口接收到"go stm32"后可以看到不断输出“hello Windows”:
当接收到"stop stm32"后端口停止输出:
总结
中断方式不必等待数据的传输过程,只需要在每字节数据收发完成后,由中断标志位触发中断,在中断服务程序中放入新的一字节数据或者读取接收到的一字节数据;
通过本次学习,希望大家能够掌握在STM32F103C8T6核心开发板下,通过串口中断方式实现多形式的“hello windows!”通信输出的操作步骤;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。