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

北屯市网站建设_网站建设公司_Angular_seo优化

网站开发要计入无形资产吗,网站开发后台编辑系统,开源saas建站系统,做3d在哪个网站上接单比较好一.串口轮询模式底层机制#xff1a; 在STM32每个串口的内部都有两个寄存器#xff1a;发送数据寄存器(TDR)/发送移位寄存器,当我们调用HAL_UART_Transmit 把数据发送出去时#xff0c;CPU会将数据依次将数据发送到数据寄存器中#xff0c;移位寄存器中的数据会根据我们设置…一.串口轮询模式底层机制 在STM32每个串口的内部都有两个寄存器发送数据寄存器(TDR)/发送移位寄存器,当我们调用HAL_UART_Transmit 把数据发送出去时CPU会将数据依次将数据发送到数据寄存器中移位寄存器中的数据会根据我们设置的比特率传化成高低电平从TX引脚输出。待发送移位寄存器中发数据发送出去后,CPU就会将下一个数据进行相同的发送。 当我们调用HAL_UART_Receive把数据接收过来时数据会通过RX引脚收到的电平信号进行转化后会将数据存进接收移位寄存器。接收移位寄存器每接收完1帧就会将数据放到接收数据寄存器。而后CPU会将接收数据寄存器中的数据存到变量中 而在轮询模式下。在发送整个数据的过程中CPU都要不断地轮询“发送数据寄存器”中的数据是否移动到“发送移位寄存器”下,直到把本次要发送的数据全部发完或者用时超过设置的超时时间才算结束。 因此采用轮询模式在数据接收和发送过程中CPU不会去做其他事情主程序中的代码会进行阻塞直到IO结束。 具体的案例在下面链接 STM32TTL串口调试-CSDN博客 二.串口的中断模式 (1).中断模式机制 采用中断模式便可以解决在IO过程中主程序阻塞问题。原理是接收和发送数据时CPU并不会轮询发送/接收数据寄存器是否有数据。而是发送/接收数据寄存器当每数据时会发送一个中断主动通知CPU。因此CPU在将数据寄存器中的数据移动到移位寄存器后就可以去执行其他任务了。当发送移位寄存器中的数据发送出去后就会触发“发送移位寄存器空”中断再把CPU叫回来。如此反复完成IO。 (2).中断模式案例 在STM32TTL串口调试-CSDN博客这个案例下改造成中断函数形式。 1. 打开CubeIDE开启USART2中断生成代码 2.查看stm32f1xx_it文件中 USART2_IRQHandler() 中断处理函数的定义。由于每个USART中只有一个中断向量并且这个中断向量是USART中断请求共用的所以中断处理函数也是被USART共用的。因此为了单独写发送数据的逻辑写在中断处理函数中就不太合适。因此需要判断哪些原因触发了这个中断处理函数分别实现逻辑而这个判断HAL_UART_IRQHandler(huart2) 函数中已经帮我们准备好了。 转到HAL_UART_IRQHandler(huart2)的定义。可以看见经过一系列判断等逻辑后就会根据判断的结果执行Callback函数。因此当某个事件发生时就会调用回调函数。而数据接收完成后执行的回调函数就是 __weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) 注Cplt 指 完成 。 __weak 关键字作为前缀代表是一个弱定义我们可以在其他地方重新定义此函数 因此我们可以实现这个回调函数来实现传输数据又不阻塞主程序。 (3).示例代码 main.c关键代码如下 注:  HAL_UART_Receive_IT(huart2, message, size);        HAL_UART_Transmit_IT(huart2,message, size); 是中断形式的UART接收/发送数据的函数由于不阻塞主程序因此不需要设置超时时间。 /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include main.h/* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include string.h /* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*/ UART_HandleTypeDef huart2; uint8_t recvDate[2];/* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART2_UART_Init(void); /* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){// HAL_UART_Receive(huart, pData, Size, Timeout) // HAL_UART_Receive(huart2, recvDate, 2, HAL_MAX_DELAY);HAL_UART_Transmit_IT(huart2,recvDate,2);GPIO_PinState pinstate GPIO_PIN_RESET;if(recvDate[1] 1){pinstate GPIO_PIN_SET;}if(recvDate[0] R){HAL_GPIO_WritePin(redLED_GPIO_Port, redLED_Pin, pinstate);}else if(recvDate[0] B){HAL_GPIO_WritePin(blueLED_GPIO_Port,blueLED_Pin, pinstate);}else if(recvDate[0] G){HAL_GPIO_WritePin(greenLED_GPIO_Port,greenLED_Pin, pinstate);}HAL_UART_Receive_IT(huart2, recvDate, 2);} /* USER CODE END 0 *//*** brief The application entry point.* retval int*/ int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART2_UART_Init();/* USER CODE BEGIN 2 */HAL_UART_Receive_IT(huart2, recvDate, 2);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */ } ...三.DMA 模式 虽然采用中断模式便可以解决在IO过程中主程序阻塞问题但是CPU切换过于频繁。而直接内存访问DMADirect Memory Access是一些计算机总线架构提供的功能它能使数据从附加设备如磁盘驱动器直接发送到计算机主板的内存上。 CPU和寄存器就像老师与学生。轮询模式就像老师每讲完一段知识点老师都会不断地问学生学好了没直到学会才会讲下一个知识点。中断模式就像老师每讲完一段知识点后就开始干自己的事等待学生举手示意自己学习完后才开始讲下一个知识点。而DMA就像一名助教负责提前学习老师要讲给学生的知识助教再将所学知识讲给学生。直到学生把助教所学的知识都学完后助教再让教师再传授一部分知识。 再CubeIDE设计界面中connective -USART2- DMA Settings 可以配置DMA通道(如下图). 想要发送数据(TX),即内存向外设传输数据默认通道为Channal7而接收为Channal6。目前采用默认配置就行。 配置完后传输和发送数据的函数就变成了 注:  HAL_UART_Receive_DMA(huart2, message, size);        HAL_UART_Transmit_DMA(huart2,message, size); 当然还可以利用中断来通知CPU传输/发送数据只不过就不是原先的串口中断而是DMA传输完成中断了。 四.接收不定长数据 (1) 接收不定长数据的原理 接收不定长数据主要关心的是串口空闲(Idle)中断即接收串口(RX引脚)上无后续数据进入便会触发。通常这个场景代表一帧数据包接收完成。 而数据接收关键函数就变成了: HAL_UARTEx_ReceiveToIdle(huart2, pData, Size, RxLen, Timeout)       //size为允许装入的最大数据长度。       HAL_UARTEx_ReceiveToIdle_IT(huart2, message,maxsize);       HAL_UARTEx_ReceiveToIdle_DMA(huart2, message, maxsize); 回调函数就变成了 // Size参数传入数值为本次接收的数据长度 __weak void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) 对于该回调函数除了串口空闲中断会调用以外DMA传输过半中断也会调用。因此需要根据业务要求决定无关中断是否要屏蔽。 (2).采用DMA方式接收不定长数据的示例代码 /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM *//* USER CODE END PM */ uint8_t recvDate[20]; /* Private variables ---------------------------------------------------------*/ UART_HandleTypeDef huart2; DMA_HandleTypeDef hdma_usart2_tx; DMA_HandleTypeDef hdma_usart2_rx;/* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_DMA_Init(void); static void MX_USART2_UART_Init(void); /* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){if(huart huart2){//把接收到的数据发给终端进行打印HAL_UART_Transmit_DMA(huart2,recvDate,Size);GPIO_PinState pinstate GPIO_PIN_RESET;if(recvDate[1] 1){pinstate GPIO_PIN_SET;}if(recvDate[0] R){HAL_GPIO_WritePin(redLED_GPIO_Port, redLED_Pin, pinstate);}else if(recvDate[0] B){HAL_GPIO_WritePin(blueLED_GPIO_Port,blueLED_Pin, pinstate);}else if(recvDate[0] G){HAL_GPIO_WritePin(greenLED_GPIO_Port,greenLED_Pin, pinstate);}//继续接收即将要接收的数据HAL_UARTEx_ReceiveToIdle_DMA(huart2, recvDate, sizeof(recvDate));//关闭DMA传输过半中断__HAL_DMA_DISABLE_IT(hdma_usart2_rx,DMA_IT_HT);} } /* USER CODE END 0 *//*** brief The application entry point.* retval int*/ int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_DMA_Init();MX_USART2_UART_Init();/* USER CODE BEGIN 2 *///接收数据,并屏蔽DMA传输过半中断HAL_UARTEx_ReceiveToIdle_DMA(huart2, recvDate, sizeof(recvDate));__HAL_DMA_DISABLE_IT(hdma_usart2_rx,DMA_IT_HT);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */ }
http://www.ihoyoo.com/news/109541.html

相关文章:

  • 深圳住建厅官方网站重庆企业服务建站网站开发
  • 第一次做网站时是怎样的心情长沙seo 优化选智投未来no1
  • 游学旅行网站建设策划书网站建设中的板块名称
  • 关于网站建设与维护的心得体会嘉兴网站建设模板网站
  • 车辆优化管理专业网站wordpress整合uc
  • 长春网站设计长春网络推广云梦网如何做网站
  • 成都网站建设潮州公司的网 网站打不开
  • 惠州微网站建设视频直播网站app开发
  • 广州网站制作设计公司南宁学网站建设
  • 网站建设加推广北京清控人居建设集团网站
  • 如何提高网站访问量wordpress集成微博登陆
  • 山东网站建设排行榜线上课程制作
  • 高端的培训行业网站开发深圳宝安建设工程交易中心
  • 做网站能不能赚钱wordpress修改侧边栏
  • 网站的开发包括什么东西wordpress默认摘要
  • 网站开发树形图济南seo优化
  • 出售源码的网站wordpress 插件 升级
  • 免费app下载网站seo培训班
  • 安徽网站开发培训价格哪些网站是单页面
  • 海南做网站找谁本地网站搭建如何访问网页
  • 公司网站开发部署网站建设服务商的网站建设流程
  • 盐山县做网站价格济南网站建设推广服务
  • 机电网站模板企业建设项目备案办法
  • 网站做百度推广去掉自动升级wordpress失败提示
  • 企业建设网站公司简介网站怎么做登录
  • 营销型网站5要素app购物商城
  • 花里胡哨的网站手机制作海报的软件免费
  • 网站营销成功的案例分析乐之网站制作
  • 深圳企业做网站公咨询公司招聘
  • wordpress如何重装wordpress自带主题优化