北镇建设局网站,wordpress 用户 函数,张店学校网站建设哪家好,网站建设与管理ppt模板下载概述 在使用 DHT11 的时候#xff0c;时序通信需要微秒来操作#xff0c;STM32CubeMX 自带一个系统时钟#xff0c;但是实现的是毫秒级别的。因此就自己用通用计时器实现一个。文章目录环境#xff1a;开发板#xff1a;STM32F4探索者#xff08;正点原子#xff09;1…概述 在使用 DHT11 的时候时序通信需要微秒来操作STM32CubeMX 自带一个系统时钟但是实现的是毫秒级别的。因此就自己用通用计时器实现一个。文章目录环境开发板STM32F4探索者正点原子1.配置定时器时钟选择时钟源这里选择的是内部时钟来自 RCC 的TIMxCLK在通用定时器框图中我们可以看到如下而我们可以在 STM32F4xx中文参考手册中找到TIM2 在外设总线1(APB1上)因此其时钟为 84MHz如下图所示2.计数器时钟频率及计数模式除了配置定时器的时钟还需要配置计数器时钟频率我们要实现微秒延时因此计数器时钟频率应该是1MHz而要实现还需要以下3个参数 预分频系数根据STM32F4xx中文参考手册中的时钟频率计算如下图所示其中fCK_PSC就是通用定时器框图中的CK_PSC, 即值为84MHz而我们所要的计数器时钟频率1MHz因此PSC[15:0] (fCK_PSC/CK_CNT) - 1 (84/1) - 1 83因此预分频系数为 83 计数器模式计数器这里采用向下计数模式也就是 如设置计数值为 1000那么每隔一个微秒就减一一直减到 0 自动重装载值虽然我们并不使用自动重装载功能但是我们还是要对自动重装载寄存器进行赋值且不赋值为0即可但是我测试时发送如果为1延时会出现偏差因此这里赋值为 2依据如下3.打开定时器中断4.具体实现代码volatile bool elapsed false; //用于判断设置的计数值是否耗尽向下计数模式耗尽时在中断中奖会设置为truevoid setState(bool state)
{elapsed state;
}bool getState()
{return elapsed;
}void usDelay(uint32_t time)
{__HAL_TIM_SetCounter(htim2,time); //设置计数值setState(false); HAL_TIM_Base_Start_IT(htim2); //开启定时器while(!getState()); //判断计数值是否耗尽HAL_TIM_Base_Stop_IT(htim2); //关闭定时器}计数值耗尽回掉函数void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if (htim-Instance TIM2) {setState(true);}}5.代码测试主函数的主循环中while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */printf(hello usDelay);for(int i 0; i 1000; i){usDelay(1000);}}在串口调试助手中可以看到如下一秒打印一条语句测试代码已上传我的博客欢迎来下载。后续也将分享如何使用该函数读取 DHT11 温湿度传感器的值后续我还会继续分享STM32CubeMX的相关操作相信你会学到更多知识我会在[ STM32CubeMX专栏 ]持续更新来关注本专栏吧文章有帮助到你点赞收藏关注我吧