sql注入网站建设百度云/凡科建站模板
嵌入式工程师成长之路 系列文章 总目录 |
---|
系列文章总目录 |
希望本是无所谓有,无所谓无的,这正如脚下的路,其实地上本没有路,走的人多了,也便成了路 |
原创不易,文章会持续更新,欢迎微信扫码关注公众号 |
承接 小程序 / 嵌入式 / PC端项目开发,联系作者 |
1.定时器3的作用
怎么识别通信的开始和结束?
最简单的方法是定义几个特殊的字符,使用这些特殊字符作为一帧数据的起始符和结束符。可以这样做,但不太严谨,譬如如果发送的内容数据中本身就存在特殊字符,是不是不太好处理呢?
可以使用定时器来解决一帧数据的结束问题:
(1)规定起始符:通信总线大都时间是空闲的,所以一旦有数据接收过来,就表示一帧数据接收开始,注意,这里并没有额外定义起始特殊字符。
(2)规定结束符:如果总线10ms内仍然没有新的数据过来,就表示一帧数据接收结束。
怎么来保证数据的准确性?
每一帧数据的最后四个字节为该帧数据的CRC校验码,通过CRC来确保数据准确。
2.定时器3的代码
(1)h文件
#ifndef __tim_H
#define __tim_H#ifdef __cplusplusextern "C" {
#endif/* Includes ------------------------------------------------------------------*/
#include "../../../20_Framework/Inc/main.h"/* USER CODE BEGIN Includes *//* USER CODE END Includes *//* USER CODE BEGIN Private defines *//* USER CODE END Private defines */void MX_TIM3_Init(uint16_t arr,uint16_t psc);/* USER CODE BEGIN Prototypes *//* USER CODE END Prototypes */#ifdef __cplusplus
}
#endif
#endif /*__ tim_H */
(2)c文件
#include "tim.h"TIM_HandleTypeDef TIM3_Handler;/*下面的代码可以产生一个预分频系数为psc,周期为arr的定时器中断,每隔一段时间(具体多长时间还需细算)* HAL_TIM_PeriodElapsedCallback会被调用一次*/
void MX_TIM3_Init(uint16_t arr,uint16_t psc)
{TIM3_Handler.Instance=TIM3;TIM3_Handler.Init.Prescaler=psc;TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;TIM3_Handler.Init.Period=arr;TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;TIM3_Handler.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;HAL_TIM_Base_Init(&TIM3_Handler);HAL_TIM_Base_Start_IT(&TIM3_Handler);
}void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM3){__HAL_RCC_TIM3_CLK_ENABLE();HAL_NVIC_SetPriority(TIM3_IRQn,3,3);HAL_NVIC_EnableIRQ(TIM3_IRQn);}
}void TIM3_IRQHandler(void)
{/* USER CODE BEGIN TIM3_IRQn 0 *//* USER CODE END TIM3_IRQn 0 */HAL_TIM_IRQHandler(&TIM3_Handler);/* USER CODE BEGIN TIM3_IRQn 1 *//* USER CODE END TIM3_IRQn 1 */
}/*定时器的回调函数,至于多久调用一次,需要用时,再细细推敲*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{static uint32_t count = 0;count++;
}