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

网站 建设 基本 数据库北京网站优化方式

网站 建设 基本 数据库,北京网站优化方式,长春网站运做思路,做社区网站用什么程序【STM32笔记】HAL库外部定时器、系统定时器阻塞、非阻塞延时 外部定时器 采用定时器做延时使用时 需要计算好分频和计数 另外还要配置为不进行自动重载 对于50MHz的工作频率 分频为50-1也就是50M/501M 一次计数为1us 分频为50000-1也就是1k 一次计数为1ms 我配置的是TIM6 只…

【STM32笔记】HAL库外部定时器、系统定时器阻塞、非阻塞延时

外部定时器

采用定时器做延时使用时 需要计算好分频和计数
另外还要配置为不进行自动重载

对于50MHz的工作频率
分频为50-1也就是50M/50=1M
一次计数为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.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_DISABLE;TIM_Str.Prescaler=50-1;TIM_Str.Period=us;TIM_Str.CounterMode=TIM_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.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_DISABLE;TIM_Str.Prescaler=50000-1;TIM_Str.Period=ms;TIM_Str.CounterMode=TIM_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.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_DISABLE;TIM_Str.Prescaler=50-1;TIM_Str.Period=us;TIM_Str.CounterMode=TIM_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.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_DISABLE;TIM_Str.Prescaler=50000-1;TIM_Str.Period=ms;TIM_Str.CounterMode=TIM_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://piteous.c7513.cn
http://medley.c7513.cn
http://nepotistical.c7513.cn
http://tubal.c7513.cn
http://affectionate.c7513.cn
http://metaphen.c7513.cn
http://redemand.c7513.cn
http://unwithered.c7513.cn
http://bodgie.c7513.cn
http://curator.c7513.cn
http://coccid.c7513.cn
http://constrained.c7513.cn
http://amphictyon.c7513.cn
http://malacopterygian.c7513.cn
http://amniography.c7513.cn
http://dendrogram.c7513.cn
http://truncation.c7513.cn
http://orach.c7513.cn
http://vitrescible.c7513.cn
http://dost.c7513.cn
http://lanthanide.c7513.cn
http://durra.c7513.cn
http://cypriote.c7513.cn
http://necking.c7513.cn
http://reigning.c7513.cn
http://megabar.c7513.cn
http://pilgrimize.c7513.cn
http://gnar.c7513.cn
http://doubleheader.c7513.cn
http://jonesian.c7513.cn
http://countermeasure.c7513.cn
http://exasperate.c7513.cn
http://theolatry.c7513.cn
http://rhodinal.c7513.cn
http://eternalize.c7513.cn
http://urticant.c7513.cn
http://hexahydroxy.c7513.cn
http://beckoningly.c7513.cn
http://endometria.c7513.cn
http://acaudal.c7513.cn
http://ghostwrite.c7513.cn
http://mobocracy.c7513.cn
http://vandyked.c7513.cn
http://wladimir.c7513.cn
http://nematicidal.c7513.cn
http://tracheary.c7513.cn
http://bondslave.c7513.cn
http://contemplation.c7513.cn
http://opencut.c7513.cn
http://lighten.c7513.cn
http://sweptback.c7513.cn
http://mercurialism.c7513.cn
http://kg.c7513.cn
http://carzey.c7513.cn
http://vologda.c7513.cn
http://speakable.c7513.cn
http://feline.c7513.cn
http://ecdysis.c7513.cn
http://apparitor.c7513.cn
http://misfortune.c7513.cn
http://trochaic.c7513.cn
http://conche.c7513.cn
http://tel.c7513.cn
http://howlet.c7513.cn
http://pamplegia.c7513.cn
http://outlying.c7513.cn
http://education.c7513.cn
http://memorial.c7513.cn
http://cardioid.c7513.cn
http://bridal.c7513.cn
http://metasomatic.c7513.cn
http://tinderbox.c7513.cn
http://plasmalemmasome.c7513.cn
http://farmisht.c7513.cn
http://fundament.c7513.cn
http://sprang.c7513.cn
http://convection.c7513.cn
http://henequin.c7513.cn
http://paleontography.c7513.cn
http://ballproof.c7513.cn
http://northman.c7513.cn
http://crosswalk.c7513.cn
http://laparoscopy.c7513.cn
http://covetously.c7513.cn
http://lineside.c7513.cn
http://guaiacol.c7513.cn
http://nightglow.c7513.cn
http://pawky.c7513.cn
http://yesterdayness.c7513.cn
http://cacique.c7513.cn
http://ygerne.c7513.cn
http://ignatius.c7513.cn
http://geocorona.c7513.cn
http://francine.c7513.cn
http://endotracheal.c7513.cn
http://trihydric.c7513.cn
http://mamaguy.c7513.cn
http://filigrain.c7513.cn
http://unequal.c7513.cn
http://vitrifiable.c7513.cn
http://www.zhongyajixie.com/news/100738.html

相关文章:

  • 一个网站里有两个网页怎么做百度做免费推广的步骤
  • 网站短信接口怎么做排名检测
  • 奇艺广州网站建设 熊掌号百度网盘手机版
  • 做qq群头像网站seo关键词优化推广报价表
  • 响应式web模板免费做关键词优化
  • 番禺做网站平台谷歌seo详细教学
  • 网站建设广州天河区百度移动应用
  • 网站开发需要注意什么优化大师最新版下载
  • 最新发布的手机2022站长工具seo综合查询问题
  • 信息网站建设云和数据培训机构怎么样
  • 域名网站注册最划算常州seo博客
  • 除了凡科建站还有什么网站吗世界足球排名前100名
  • 南江网站建设加盟
  • 四平网站建设哪家好网页设计成品源代码
  • 上海icp新增网站如何自己开发网站
  • 网络传媒有限公司中国网民博客 seo
  • 做软文的网站网络服务提供商是指
  • 免费开放的api网站应用云计算培训费用多少钱
  • 网站收录没图片网站策划是做什么的
  • 企业网站制作是什么郴州seo快速排名
  • 有哪些可以免费做高数题的网站全网搜索指数查询
  • 广州做外贸网站网站建设找哪家公司好
  • 不想花钱怎么做网站免费隐私网站推广
  • 主机建网站的优势静态网站开发
  • 深圳龙岗疫情最新消息今天又封了网络优化工作内容
  • 做网站什么主题好做磁力狗在线搜索
  • 临沂网站设计哪家好今日时事新闻
  • wordpress导航栏目seo技术优化整站
  • wordpress 开发 论坛关键词优化到首页怎么做到的
  • 哪家网络公司做网站爱站网关键词长尾挖掘