赞
踩
一、中断模式简介
这一部分内容在之前的博客中,已经进行过介绍,这里就不再赘述,可自行前往进行学习:
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工程创建
可以通过下面两种方式创建基础工程:
Part Number
,选择对应开发板(这里选择的STM32F103C8):Start .....
:设置RCC:
设置SYS:
设置串口USART1,同时可查看波特率等设置是否正确:
设置NVIC:
Project配置:
Code Generator配置:
Open Project:
- 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:开始发送
HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
- if(flag==1){
- //发送信息
- HAL_UART_Transmit(&huart1, (uint8_t *)&message, strlen(message),0xFFFF);
-
- //延时
- HAL_Delay(1000);
- }
- 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);
- }
打开串口助手
"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 .....
:USART1
的MODE为异步通信Asynchronous
,基础参数(波特率为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1,接收和发送都使能)和GPIO引脚设置( USART1_RX/USART_TX)使用默认即可:要将接收到的连续字符保存到一个字符数组里,进行判别匹配
。接收字符串的函数
- 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.开始发送
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);
#include <string.h>
) - if(flag==1){
- //发送信息
- HAL_UART_Transmit(&huart1, (uint8_t *)&message, strlen(message),0xFFFF);
-
- //延时
- HAL_Delay(1000);
- }
- 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);
- }
-
打开串口助手
"go stm32"
后可以看到不断输出“hello Windows”:"stop stm32"
后端口停止输出:总结
中断方式不必等待数据的传输过程,只需要在每字节数据收发完成后,由中断标志位触发中断,在中断服务程序中放入新的一字节数据或者读取接收到的一字节数据;
通过本次学习,希望大家能够掌握在STM32F103C8T6核心开发板下,通过串口中断方式实现多形式的“hello windows!”通信输出的操作步骤;
同时也期待大家能够积极留言,指出我存在的问题,谢谢!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。