1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > HAL库中断方式实现串口通信操作

HAL库中断方式实现串口通信操作

时间:2018-12-18 22:46:29

相关推荐

HAL库中断方式实现串口通信操作

文章目录

一、实验工具二、CubeMX配置项目1.引脚配置2、RCC设置3.SYS设置4.USART设置5.NVIC设置6.创建项目三、keil中配置代码1.main函数前定义全局变量2.main函数中设置接收中断3.在main函数中的while循环里面添加传输代码4.在main函数下面重写中断处理函数5.main函数全部代码四、编译烧录五、实验结果六、拓展实验:go stm32!为发送,stop stm32!为停止1.修改mian.c主函数代码2.拓展实验结果六、总结七、参考资料

一、实验工具

软件版本:

STM32CubeMX:6.30

KEIl:5.31

mcuisp

SSCOM: 5.13.1

硬件:

STM32F103C8T

二、CubeMX配置项目

1.引脚配置

2、RCC设置

3.SYS设置

4.USART设置

5.NVIC设置

6.创建项目

三、keil中配置代码

1.main函数前定义全局变量

char c;//指令 0:停止 1:开始char message[]="hello Windows\n";//输出信息char tips[]="CommandError\n";//提示1char tips1[]="Start.....\n";//提示2char tips2[]="Stop......\n";//提示3int flag=0;//标志 0:停止发送 1.开始发送

2.main函数中设置接收中断

函数原型:

HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

功能:

功能:串口中断接收,以中断方式接收指定长度数据。大致过程是,设置数据存放位置,接收数据长度,然后使能串口接收中断。接收到数据时,会触发串口中断。再然后,串口中断函数处理,直到接收到指定长度数据而后关闭中断,进入中断接收回调函数,不再触发接收中断。(只触发一次中断)

参数:

UART_HandleTypeDef *huartUATR的别名 huart1 *pData接收到的数据存放地址Size 接收的字节数

HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);

3.在main函数中的while循环里面添加传输代码

if(flag==1){//发送信息HAL_UART_Transmit(&huart1, (uint8_t *)&message, strlen(message),0xFFFF); //延时HAL_Delay(1000);}

4.在main函数下面重写中断处理函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){//当输入的指令为0时,发送提示并改变flagif(c=='0'){flag=0;HAL_UART_Transmit(&huart1, (uint8_t *)&tips2, strlen(tips2),0xFFFF); }//当输入的指令为1时,发送提示并改变flagelse if(c=='1'){flag=1;HAL_UART_Transmit(&huart1, (uint8_t *)&tips1, strlen(tips1),0xFFFF); }//当输入不存在指令时,发送提示并改变flagelse {flag=0;HAL_UART_Transmit(&huart1, (uint8_t *)&tips, strlen(tips),0xFFFF); }//重新设置中断HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1); }

5.main函数全部代码

#include "main.h"#include "usart.h"#include "gpio.h"#include <string.h>void SystemClock_Config(void);char c;//指令 0:停止 1:开始char message[]="hello Windows\n";//输出信息char tips[]="CommandError\n";//提示1char tips1[]="Start.....\n";//提示2char tips2[]="Stop......\n";//提示3int flag=0;//标志 0:停止发送 1.开始发送int main(void){HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();//设置接受中断HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);//当flag为1时,每秒发送一次信息//当flag为0时,停止while (1){if(flag==1){//发送信息HAL_UART_Transmit(&huart1, (uint8_t *)&message, strlen(message),0xFFFF); //延时HAL_Delay(1000);}}}void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){//当输入的指令为0时,发送提示并改变flagif(c=='0'){flag=0;HAL_UART_Transmit(&huart1, (uint8_t *)&tips2, strlen(tips2),0xFFFF); }//当输入的指令为1时,发送提示并改变flagelse if(c=='1'){flag=1;HAL_UART_Transmit(&huart1, (uint8_t *)&tips1, strlen(tips1),0xFFFF); }//当输入不存在指令时,发送提示并改变flagelse {flag=0;HAL_UART_Transmit(&huart1, (uint8_t *)&tips, strlen(tips),0xFFFF); }//重新设置中断HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1); }/* USER CODE END 4 *//*** @brief System Clock Configuration* @retval None*/void SystemClock_Config(void){RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK){Error_Handler();}}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** @brief This function is executed in case of error occurrence.* @retval None*/void Error_Handler(void){/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */}

四、编译烧录

五、实验结果

注:‘s’字符开始,'t’结束

VID_1023_011622

六、拓展实验:go stm32!为发送,stop stm32!为停止

1.修改mian.c主函数代码

#include "stm32f10x.h"#include <string.h>/*** @brief 主函数* @param 无* @retval 无*/#include "uart.h"// 接收缓冲,最大100个字节uint8_t USART_RX_BUF[100];// 接收状态标记位uint16_t USART_RX_FLAG=0;//串口中断服务函数void DEBUG_USART_IRQHandler(void){uint8_t temp;//接收中断if(USART_GetFlagStatus(USART1, USART_IT_RXNE) != RESET){// 读取接收的数据temp = USART_ReceiveData(USART1);//接收未完成if((USART_RX_FLAG & 0x8000)==0){//接收到了0x0dif(USART_RX_FLAG & 0x4000){// 接收错误,重新开始if(temp != 0x0a) USART_RX_FLAG=0;// 接收完成else USART_RX_FLAG |= 0x8000;}// 还未接收到0x0delse{if(temp == 0x0d){USART_RX_FLAG |= 0x4000;}else{USART_RX_BUF[USART_RX_FLAG & 0x3FFF]=temp;USART_RX_FLAG++;//接收数据错误,重新开始接收if(USART_RX_FLAG > 99) USART_RX_FLAG=0;}}}}}int main(void){uint8_t len=0;uint8_t i=0;uint8_t flag=0;// USART初始化USART_Config();while(1){if(USART_RX_FLAG & 0x8000){// 获取接收到的数据长度len = USART_RX_FLAG & 0x3FFF;//USART_SendString(USART1, "messages:\n");for(i=0; i<len;i++){// 向串口发送数据USART_SendData(USART1, USART_RX_BUF[i]);//等待发送结束while(USART_GetFlagStatus(USART1, USART_FLAG_TC)!=SET);}//USART_SendString(USART1, "\n\n");USART_RX_FLAG=0;memset(USART_RX_BUF,0,sizeof(USART_RX_BUF));}if(strcmp((char *)USART_RX_BUF,"stop stm32!")==0){//USART_SendString(USART1, "stm32 stop delivering!");flag=0;break;}if(strcmp((char *)USART_RX_BUF,"go stm32!")==0){flag=1;}//"hello windows!\n\r"if(flag==1){USART_SendString(USART1, "hello windows!\r\n");delay_ms(800);if(strcmp((char *)USART_RX_BUF,"stop stm32!")==0){//USART_SendString(USART1, "stm32 stop delivering!\r\n");flag=0;break;}}}}

2.拓展实验结果

六、总结

本次实验实现了用中断方式进行串口通信,对串口通信的相关知识点进行了巩固,对串口通信的了解进一步加深。

七、参考资料

STM32的USART窗口通讯程序——串口通讯

HAL库中断方式进行串口通信

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。