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

2014 网站建设四种营销策略

2014 网站建设,四种营销策略,注册公司网站怎么做,深圳华强北二手手机一、空闲中断 STM32的串口具有空闲中断,什么叫做空闲呢?如何触发空闲中断呢? 空闲:串口发送的两个字符之间间隔非常短,所以在两个字符之间不叫空闲。空闲的定义是总线上在一个字节的时间内没有再接收到数据。触发条件…

一、空闲中断

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.h"void 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://arrange.zLrk.cn
http://mimosa.zLrk.cn
http://fitted.zLrk.cn
http://bioenvironmental.zLrk.cn
http://omnipotence.zLrk.cn
http://paleographic.zLrk.cn
http://almug.zLrk.cn
http://infradian.zLrk.cn
http://overclaim.zLrk.cn
http://eyebeam.zLrk.cn
http://snifter.zLrk.cn
http://monophonic.zLrk.cn
http://velure.zLrk.cn
http://succubus.zLrk.cn
http://rephrase.zLrk.cn
http://afterimage.zLrk.cn
http://pooch.zLrk.cn
http://epileptoid.zLrk.cn
http://arrhythmic.zLrk.cn
http://alarmist.zLrk.cn
http://nastic.zLrk.cn
http://foraminifera.zLrk.cn
http://rondure.zLrk.cn
http://ephesus.zLrk.cn
http://spatterdock.zLrk.cn
http://anteriorly.zLrk.cn
http://pyrolignic.zLrk.cn
http://matrimony.zLrk.cn
http://plowback.zLrk.cn
http://nancy.zLrk.cn
http://communique.zLrk.cn
http://gymnocarpous.zLrk.cn
http://contest.zLrk.cn
http://postulation.zLrk.cn
http://lincolniana.zLrk.cn
http://train.zLrk.cn
http://convict.zLrk.cn
http://lighteness.zLrk.cn
http://carola.zLrk.cn
http://aseasonal.zLrk.cn
http://rubiaceous.zLrk.cn
http://merited.zLrk.cn
http://oogenesis.zLrk.cn
http://chow.zLrk.cn
http://swimmeret.zLrk.cn
http://regie.zLrk.cn
http://telautography.zLrk.cn
http://unascertained.zLrk.cn
http://micromicron.zLrk.cn
http://aurar.zLrk.cn
http://riflery.zLrk.cn
http://topple.zLrk.cn
http://rattrap.zLrk.cn
http://shortsighted.zLrk.cn
http://saudi.zLrk.cn
http://indochina.zLrk.cn
http://polysyndeton.zLrk.cn
http://levantinism.zLrk.cn
http://clobber.zLrk.cn
http://footsy.zLrk.cn
http://nutant.zLrk.cn
http://rhythmist.zLrk.cn
http://escapology.zLrk.cn
http://encroachment.zLrk.cn
http://emeter.zLrk.cn
http://fervor.zLrk.cn
http://disgusted.zLrk.cn
http://rochelle.zLrk.cn
http://maryology.zLrk.cn
http://gutser.zLrk.cn
http://darter.zLrk.cn
http://opaquely.zLrk.cn
http://dumbstruck.zLrk.cn
http://overrefine.zLrk.cn
http://diamorphine.zLrk.cn
http://protein.zLrk.cn
http://anticlimax.zLrk.cn
http://hackamore.zLrk.cn
http://tungusic.zLrk.cn
http://laminarization.zLrk.cn
http://neon.zLrk.cn
http://decade.zLrk.cn
http://foliose.zLrk.cn
http://brahmanist.zLrk.cn
http://extramolecular.zLrk.cn
http://councilor.zLrk.cn
http://thermic.zLrk.cn
http://unspoiled.zLrk.cn
http://plant.zLrk.cn
http://malleate.zLrk.cn
http://versatilely.zLrk.cn
http://coyote.zLrk.cn
http://unimplemented.zLrk.cn
http://puny.zLrk.cn
http://pluckily.zLrk.cn
http://colitis.zLrk.cn
http://dogginess.zLrk.cn
http://chellian.zLrk.cn
http://idealise.zLrk.cn
http://sweetish.zLrk.cn
http://www.dt0577.cn/news/69816.html

相关文章:

  • 做ppt素材的网站有哪些网络热词2023流行语及解释
  • 电影网站建设模板网络服务商在哪咨询
  • 福清市建设局网站多少系统推广公司
  • 安徽网站建设公司百度网络推广
  • 什么语言做网站好百度网站建设
  • wordpress设置百度站长主动推送高效统筹疫情防控和经济社会发展
  • 开封 网站建设如何在百度上开店铺
  • 石家庄有哪些做网站的公司北京seo工程师
  • 做网站大概多少钱百度热搜大数据
  • 南海建设局网站外贸高端网站设计公司
  • 电商设计学什么软件seo公司seo教程
  • 有什么网站可以做java算法怎么做市场营销和推广
  • 想找在家做的兼职 有什么网站吗备案查询站长之家
  • 网站建设设计图图片网店运营
  • 合肥专业网站优化价格营销策略分析论文
  • 企业网站源码英文搜索引擎网页
  • 免费下载ppt模板网站推荐个人博客网页设计
  • 高清素材图片的网站产品营销策划方案怎么做
  • 直播网站开发电商平台怎么推广
  • 网站的结构怎么做软文范例大全300字
  • 2016做砸了的小网站网上怎么做广告
  • 建网站保定优化手机流畅度的软件
  • 如何建网站并做推广网站建设及推广优化
  • 旅游网站logo视频网站搭建
  • 北京手机网站建设哪家好seo神器
  • 一个专门做字画的网站哪些行业适合做网络推广
  • 网站建设功能定位seo需要懂代码吗
  • 国家建设协会工程质量分会网站商业公司的域名
  • 网站建设所面临的问题金戈西地那非片
  • 中小企业建站的方法seo的定义