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

上海万网网站建设代理网址怎么用

上海万网网站建设,代理网址怎么用,惠州市建设局网站,腾讯官网首页登录入口【STM32笔记】HAL库外部定时器、系统定时器阻塞、非阻塞延时 外部定时器 采用定时器做延时使用时 需要计算好分频和计数 另外还要配置为不进行自动重载 对于50MHz的工作频率 分频为50-1也就是50M/501M 一次计数为1us 分频为50000-1也就是1k 一次计数为1ms 我配置的是TIM6 只…【STM32笔记】HAL库外部定时器、系统定时器阻塞、非阻塞延时 外部定时器 采用定时器做延时使用时 需要计算好分频和计数 另外还要配置为不进行自动重载 对于50MHz的工作频率 分频为50-1也就是50M/501M 一次计数为1us 分频为50000-1也就是1k 一次计数为1ms 我配置的是TIM6 只能下上计数 也就是从0开始计数 计数到counter值为止 所以在while里面要判断计数值不为us 没用到中断 所以不用开启定时器中断 阻塞延时 整体代码如下 void TIM_Delay_us(uint16_t us,TIM_HandleTypeDef* htim) {TIM_Base_InitTypeDef TIM_Str{0};TIM_Str.AutoReloadPreloadTIM_AUTORELOAD_PRELOAD_DISABLE;TIM_Str.Prescaler50-1;TIM_Str.Periodus;TIM_Str.CounterModeTIM_COUNTERMODE_UP; TIM_Base_SetConfig(htim-Instance,TIM_Str);HAL_TIM_Base_Start(htim);while(__HAL_TIM_GET_COUNTER(htim)!us);HAL_TIM_Base_Stop(htim); }void TIM_Delay_ms(uint16_t ms,TIM_HandleTypeDef* htim) {TIM_Base_InitTypeDef TIM_Str{0};TIM_Str.AutoReloadPreloadTIM_AUTORELOAD_PRELOAD_DISABLE;TIM_Str.Prescaler50000-1;TIM_Str.Periodms;TIM_Str.CounterModeTIM_COUNTERMODE_UP; TIM_Base_SetConfig(htim-Instance,TIM_Str);HAL_TIM_Base_Start(htim);while(__HAL_TIM_GET_COUNTER(htim)!ms);HAL_TIM_Base_Stop(htim); }尽量不要用tim.h里面的更改分频和更改计数值的函数 改了没用 写结构体更好 另外 还可以通过中断来实现 不过不推荐 因为中断进行不如阻塞来的快 中断就要用 HAL_TIM_Base_Start_IT(htim);但中断可以在回调里面实现其他的功能 非阻塞延时 void TIM_Delay_us(uint16_t us,TIM_HandleTypeDef* htim) {TIM_Base_InitTypeDef TIM_Str{0};TIM_Str.AutoReloadPreloadTIM_AUTORELOAD_PRELOAD_DISABLE;TIM_Str.Prescaler50-1;TIM_Str.Periodus;TIM_Str.CounterModeTIM_COUNTERMODE_UP; TIM_Base_SetConfig(htim-Instance,TIM_Str);HAL_TIM_Base_Start(htim); // while(__HAL_TIM_GET_COUNTER(htim)!us); // HAL_TIM_Base_Stop(htim); }void TIM_Delay_ms(uint16_t ms,TIM_HandleTypeDef* htim) {TIM_Base_InitTypeDef TIM_Str{0};TIM_Str.AutoReloadPreloadTIM_AUTORELOAD_PRELOAD_DISABLE;TIM_Str.Prescaler50000-1;TIM_Str.Periodms;TIM_Str.CounterModeTIM_COUNTERMODE_UP; TIM_Base_SetConfig(htim-Instance,TIM_Str);HAL_TIM_Base_Start(htim); // while(__HAL_TIM_GET_COUNTER(htim)!ms); // HAL_TIM_Base_Stop(htim); }调用非阻塞后 需要在别的地方调用 while(__HAL_TIM_GET_COUNTER(htim)!ms); HAL_TIM_Base_Stop(htim);才能实现阻塞延时 如果不调用 则可以自行选择判断时间 系统定时器 Cortex-M架构SysTick系统定时器阻塞和非阻塞延时 阻塞延时 void delay_ms(unsigned int ms) {SysTick-LOAD 50000000/1000-1; // Count from 255 to 0 (256 cycles) 载入计数值 定时器从这个值开始计数SysTick-VAL 0; // Clear current value as well as count flag 清空计数值到达0后的标记SysTick-CTRL 5; // Enable SysTick timer with processor clock 使能26MHz的系统定时器while(ms--){while ((SysTick-CTRL 0x00010000)0);// Wait until count flag is set 等待}SysTick-CTRL 0; // Disable SysTick 关闭系统定时器 } void delay_us(unsigned int us) {SysTick-LOAD 50000000/1000/1000-1; // Count from 255 to 0 (256 cycles) 载入计数值 定时器从这个值开始计数SysTick-VAL 0; // Clear current value as well as count flag 清空计数值到达0后的标记SysTick-CTRL 5; // Enable SysTick timer with processor clock 使能26MHz的系统定时器while(us--){while ((SysTick-CTRL 0x00010000)0);// Wait until count flag is set 等待}SysTick-CTRL 0; // Disable SysTick 关闭系统定时器 }50000000表示工作频率 分频后即可得到不同的延时时间 以此类推 那么 不用两个嵌套while循环 也可以写成 void delay_ms(unsigned int ms) {SysTick-LOAD 50000000/1000*ms-1; // Count from 255 to 0 (256 cycles) 载入计数值 定时器从这个值开始计数SysTick-VAL 0; // Clear current value as well as count flag 清空计数值到达0后的标记SysTick-CTRL 5; // Enable SysTick timer with processor clock 使能26MHz的系统定时器while ((SysTick-CTRL 0x00010000)0);// Wait until count flag is set 等待SysTick-CTRL 0; // Disable SysTick 关闭系统定时器 } void delay_us(unsigned int us) {SysTick-LOAD 50000000/1000/1000*us-1; // Count from 255 to 0 (256 cycles) 载入计数值 定时器从这个值开始计数SysTick-VAL 0; // Clear current value as well as count flag 清空计数值到达0后的标记SysTick-CTRL 5; // Enable SysTick timer with processor clock 使能26MHz的系统定时器while ((SysTick-CTRL 0x00010000)0);// Wait until count flag is set 等待SysTick-CTRL 0; // Disable SysTick 关闭系统定时器 }但是这种写法有个弊端 那就是输入ms后最大定时不得超过计数值也就是不能超过LOAD的最大值否则溢出以后则无法正常工作 而LOAD如果最大是32位 也就是4294967295 晶振为50M的话 50M的计数值为1s 4294967295计数值约为85s 固最大定时时间为85s 但用嵌套while的话 最大可以支持定时4294967295*85s 非阻塞延时 直接改写第二种方法就好了 void delay_ms(unsigned int ms) {SysTick-LOAD 50000000/1000*ms-1; // Count from 255 to 0 (256 cycles) 载入计数值 定时器从这个值开始计数SysTick-VAL 0; // Clear current value as well as count flag 清空计数值到达0后的标记SysTick-CTRL 5; // Enable SysTick timer with processor clock 使能26MHz的系统定时器//while ((SysTick-CTRL 0x00010000)0);// Wait until count flag is set 等待//SysTick-CTRL 0; // Disable SysTick 关闭系统定时器 } void delay_us(unsigned int us) {SysTick-LOAD 50000000/1000/1000*us-1; // Count from 255 to 0 (256 cycles) 载入计数值 定时器从这个值开始计数SysTick-VAL 0; // Clear current value as well as count flag 清空计数值到达0后的标记SysTick-CTRL 5; // Enable SysTick timer with processor clock 使能26MHz的系统定时器//while ((SysTick-CTRL 0x00010000)0);// Wait until count flag is set 等待//SysTick-CTRL 0; // Disable SysTick 关闭系统定时器 }将等待和关闭定时器语句去掉 在使用时加上判断即可变为阻塞 delay_ms(500); while ((SysTick-CTRL 0x00010000)0); SysTick-CTRL 0;在非阻塞状态下 可以提交定时器后 去做别的事情 然后再来等待 不过这样又有一个弊端 那就是定时器会自动重载 可能做别的事情以后 定时器跑过了 然后就要等85s才能停下 故可以通过内部定时器来进行非阻塞延时函数的编写 基本上每个mcu的内部定时器都可以配置自动重载等功能 网上资料很多 这里就不再阐述了
http://www.sczhlp.com/news/161188/

相关文章:

  • 台州公司做网站银川哪家网站建设专业
  • 电子购物网站的设计与实现建筑行业征信查询平台
  • 公司网站制作源码页面模板不存在怎么办
  • 个人网站的网页淘客自己做网站
  • o2o网站建设如何青岛网站做网站多少钱
  • 做网站最基础需要什么条件好的手表网站
  • 安徽网新科技网站建设介绍瓷砖网站建设
  • 江苏住房与城乡建设厅网站html5网站正在建设中
  • 网站的欢迎页怎么做杭州网络安全公司
  • 深圳建设很行住房公积金网站做网站一般注册哪几类商标
  • 查看网站是哪家做的怎么看宿州网站建设公司
  • 网站推广步骤做社区网站用什么程序
  • 什么网站做的好看个人网站简单
  • 门户网站开发的意义h5网站制作一般多少钱
  • 公司网站制作策划网站建设服务费下什么科目
  • 网站开发和编程有什么区别网络营销推广有哪些方法
  • 网站seo谷歌wordpress json 分类
  • 做网站必备软件无极县在线招聘信息
  • 跨境电商网站如何做推广放单网站建设
  • 占个位置
  • 占个位置~
  • AI元人文系列文章:价值决策芯片——为机器安上一颗“透明的心”
  • 无极网站建设网络营销策划方案步骤
  • 怎么做免流网站高端外贸网站建设
  • 网站内容怎么修改成都健康码小程序
  • 应用大全网站价格低文案
  • 移动端网站的重要性企业网站商城
  • 海口会计报名网站商城网站制作公司地址
  • 网站建设倒计时代码襄樊做网站
  • 免费游戏网站模板广州网站建设公司怎么样