当前位置: 首页 > news >正文

商城小程序哪家好泉州seo托管

商城小程序哪家好,泉州seo托管,推广方式,大连seo排名扣费一、空闲中断 STM32的串口具有空闲中断#xff0c;什么叫做空闲呢#xff1f;如何触发空闲中断呢#xff1f; 空闲#xff1a;串口发送的两个字符之间间隔非常短#xff0c;所以在两个字符之间不叫空闲。空闲的定义是总线上在一个字节的时间内没有再接收到数据。触发条件…一、空闲中断 STM32的串口具有空闲中断什么叫做空闲呢如何触发空闲中断呢 空闲串口发送的两个字符之间间隔非常短所以在两个字符之间不叫空闲。空闲的定义是总线上在一个字节的时间内没有再接收到数据。触发条件空闲中断是检测到有数据被接收后总线上在一个字节的时间内没有再接收到数据的时候发生的。而总线在什么情况时会有一个字节时间内没有接收到数据呢一般就只有一个数据帧发送完成的情况所以串口的空闲中断也叫帧中断。 开启空闲中断后要重写对应的回调函数HAL_UARTEx_RxEventCallback在函数里做些处理。 二、实验内容 使用USART1外设接收电脑发来的数据然后将接收到的数据发送给电脑。 二、STM32CUBEMX配置 USART1的模式为异步通信、115200波特率、数据长度8位、无校验位、停止位1位。 DMA Settings的配置开启串口接收的DMA。 NVIC Settings的配置开启USART1的全局中断。 这里两个中断优先级我都给了1根据不同情况修改中断优先级 三、keil代码 首先确保魔术棒中的Use MicroLIB这个选项勾选上不然串口发送数据会不正常 添加头文件因为要使用memset函数 #include string.h定义串口接收数据数组 #define BUFF_SIZE 128 //接收缓存大小 uint8_t rx_buffer[BUFF_SIZE]; // 创建接收缓存,大小为BUFF_SIZE手动在usart.h外部声明hdma_usart1_rx在main函数中要使用 extern UART_HandleTypeDef huart1;/* USER CODE BEGIN Private defines */ extern DMA_HandleTypeDef hdma_usart1_rx; //手动外部声明 /* USER CODE END Private defines */void MX_USART1_UART_Init(void);在main函数初始化添加这两个函数不然串口首次无法进入中断 HAL_UARTEx_ReceiveToIdle_DMA(huart1,rx_buffer,BUFF_SIZE); //手动开启串口DMA模式接收数据 __HAL_DMA_DISABLE_IT(hdma_usart1_rx, DMA_IT_HT); //手动关闭DMA_IT_HT中断重定向HAL_UARTEx_RxEventCallback串口接收完成回调函数 /* 串口接收完成回调函数 */ void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) {if (huart-Instance USART1){HAL_UARTEx_ReceiveToIdle_DMA(huart1, rx_buffer, BUFF_SIZE); // 接收完毕后重启串口DMA模式接收数据HAL_UART_Transmit(huart1, rx_buffer, Size, 0xffff); // 将接收到的数据再发出__HAL_DMA_DISABLE_IT(hdma_usart1_rx, DMA_IT_HT); // 手动关闭DMA_IT_HT中断memset(rx_buffer, 0, BUFF_SIZE); // 清除接收缓存} } 重定向HAL_UART_ErrorCallback串口错误回调函数 /* 串口错误回调函数 */ void HAL_UART_ErrorCallback(UART_HandleTypeDef * huart) {if(huart-Instance USART1){HAL_UARTEx_ReceiveToIdle_DMA(huart1, rx_buffer, BUFF_SIZE); //手动开启串口DMA模式接收数据__HAL_DMA_DISABLE_IT(hdma_usart1_rx, DMA_IT_HT); // 手动关闭DMA_IT_HT中断memset(rx_buffer, 0, BUFF_SIZE); // 清除接收缓存} } 以下是main函数完整代码 #include main.h #include dma.h #include usart.h #include gpio.h#include stdio.h #include string.hvoid SystemClock_Config(void);#define BUFF_SIZE 128 //接收缓存大小 uint8_t rx_buffer[BUFF_SIZE]; // 创建接收缓存,大小为BUFF_SIZEint main(void) {HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_DMA_Init();MX_USART1_UART_Init();HAL_UARTEx_ReceiveToIdle_DMA(huart1,rx_buffer,BUFF_SIZE); //手动开启串口DMA模式接收数据__HAL_DMA_DISABLE_IT(hdma_usart1_rx, DMA_IT_HT); //手动关闭DMA_IT_HT中断 while (1){} } void SystemClock_Config(void) {//... } /* USER CODE BEGIN 4 */ /* 串口接收完成回调函数 */ void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) {if (huart-Instance USART1){HAL_UARTEx_ReceiveToIdle_DMA(huart1, rx_buffer, BUFF_SIZE); /// 接收完毕后重启串口DMA模式接收数据HAL_UART_Transmit(huart1, rx_buffer, Size, 0xffff); // 将接收到的数据再发出__HAL_DMA_DISABLE_IT(hdma_usart1_rx, DMA_IT_HT); // 手动关闭DMA_IT_HT中断memset(rx_buffer, 0, BUFF_SIZE); // 清除接收缓存} } /* 串口错误回调函数 */ void HAL_UART_ErrorCallback(UART_HandleTypeDef * huart) {if(huart-Instance USART1){HAL_UARTEx_ReceiveToIdle_DMA(huart1, rx_buffer, BUFF_SIZE);//手动开启串口DMA模式接收数据__HAL_DMA_DISABLE_IT(hdma_usart1_rx, DMA_IT_HT); // 手动关闭DMA_IT_HT中断memset(rx_buffer, 0, BUFF_SIZE); // 清除接收缓存} } /* USER CODE END 4 */ 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 */ }四、原理讲解 我们使用串口空闲中断的目的是为了获取完整的数据并且是由软件自动判断是否接收完整。当软件判断接收到完整的数据时就会产生中断进入回调函数HAL_UARTEx_RxEventCallback。 软件判断接收到完整数据有两种情况 1、数据接收后一个字节未接收到数据2、当前的数据接收长度与预设接收长度相等预设接收长度为HAL_UARTEx_ReceiveToIdle_DMA的参数BUFF_SIZE 预设接收长度要考虑好若数据接收长度预设接受长度就会出现数据的丢失情况。因为数据接收长度是随着接收不断累加的其大小等于预设接收长度时就会触发中断程序就会判断成接收到完整数据就是第二情况。 1、HAL_UARTEx_ReceiveToIdle_DMA 在main函数里我们调用了HAL_UARTEx_ReceiveToIdle_DMA该函数会开启USART1的空闲中断并启用串口以DMA方式接收数据当数据接收完成之后进入HAL_UARTEx_RxEventCallback回调函数。随后我们在回调函数里进行数据处理即可。 2、__HAL_DMA_DISABLE_IT 为什么要手动关闭这个中断如果不关闭这个中断程序在接收一串完整的数据时会进入执行两次HAL_UARTEx_RxEventCallback。一次是数据传输一半时一次数数据传输完成时这与我们预期的不符。我们只希望在数据传输完成时进入回调函数进行数据处理。 __HAL_DMA_DISABLE_IT的回调函数是UART_DMARxHalfCplt该回调函数会执行一次HAL_UARTEx_RxEventCallback 3、HAL_UARTEx_RxEventCallback 在该回调函数里需要手动开启中断才能进入下一次的中断。 4、HAL_UART_ErrorCallback 重写这个回调函数主要是为了防止一些错误情况的发生。若产生错误中断进入HAL_UART_ErrorCallback则无法进入HAL_UARTEx_RxEventCallback回调函数也就无法开启下一次空闲中断。所以这里在HAL_UART_ErrorCallback里手动开启了空闲中断做了一些恢复处理。 错误示例开发板设置115200波特率电脑串口用9600波特率电脑发送数据之后程序会进入串口错误中断而进入不了空闲中断。若程序当中未在错误中断进行错误处理即使电脑串口修改成115200波特率进行通信程序也无法进入空闲中断。 五、参考文章 配置和代码链接里面详解了相关一些函数的源码 链接: 【STM32 HAL库实战】串口DMA 空闲中断 实现不定长数据接收 空闲中断讲解 链接: STM32串口之空闲中断
http://www.w-s-a.com/news/745686/

相关文章:

  • 网站运行方案设计平台模式
  • 网站加入wordpress邳州城乡建设局网站
  • 两个网站如何使用一个虚拟主机东莞市网站seo内容优化
  • 湖南网站建设公司排名傲派电子商务网站建设总结
  • 网站建设求职要求互联网挣钱项目平台
  • 网站权重怎么做做黑彩网站能赚钱吗
  • 三台建设局网站网页设计购物网站建设
  • thinkphp大型网站开发市场调研公司招聘
  • 天宁区建设局网站七冶建设集团网站 江苏
  • 越南网站 后缀湘潭新思维网站
  • 环球旅行社网站建设规划书网钛cms做的网站
  • 软件资源网站wordpress不能识别语言
  • 东坑仿做网站西安私人网站
  • 公司想做个网站怎么办如何搭建视频网站
  • .net网站架设凯里网站建设哪家好
  • seo网站建站建站国外百元服务器
  • 家具网站开发设计论文企业网站里面的qq咨询怎么做
  • 网站视频提取软件app淘宝店购买网站
  • 站长之家域名解析做百度推广网站咱们做
  • 行业 网站 方案莱州网站建设公司电话
  • 丹东谁做微网站威海网络科技有限公司
  • 寻找网站建设_网站外包自助打印微信小程序免费制作平台
  • 台式机网站建设vk社交网站做婚介
  • 创建网站得花多少钱网站建设的技术路线
  • 图书馆网站建设汇报免费编程软件哪个好用
  • 手机搭建网站工具网站搜索引擎优化的基本内容
  • 网站快速排名二手交易网站开发技术路线
  • 官方网站开发公司施工企业会计王玉红课后答案
  • 网站建设能用手机制作吗网站建设所需物资
  • 阜阳做网站的公司阳江招聘网最新消息