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

张掖网站建设培训桂林最近发生的重大新闻

张掖网站建设培训,桂林最近发生的重大新闻,门票预订网站建设,简易广州网站建设STM32 HAL库利用ARM Cortex-M内核自带的24位递减计数器SysTick(系统节拍),它属于 NVIC的一部分,且可以产生 SysTick 异常(异常类型#15)。通过读取并判断计数值来实现精确延时,从0xFFFFFF向下计数到0。可以用作I2C、SPI通信中的时序控制,RTOS环…

STM32 HAL库利用ARM Cortex-M内核自带的24位递减计数器SysTick(系统节拍),它属于 NVIC的一部分,且可以产生 SysTick 异常(异常类型#15)。通过读取并判断计数值来实现精确延时,从0xFFFFFF向下计数到0。可以用作I2C、SPI通信中的时序控制,RTOS环境中作为心跳时钟。

目录

一、微秒级延时函数 udelay

二、毫秒级延时函数 mdelay

三、获取系统时间函数 

四、函数调用


一、微秒级延时函数 udelay

udelay 函数用于实现微秒级的延时。它利用了 STM32 的 SysTick 定时器,这是一个 24 位的递减计数器。函数首先记录 SysTick 定时器当前的计数值 told 作为计时起点,并获取 SysTick 的重装载值 load。根据 LOAD + 1 个时钟对应 1ms 的关系,计算出输入的微秒数 us 对应的时钟滴答数 ticks。在一个无限循环中,不断获取当前的计数值 tnow,并根据计数值是否溢出计算已经过去的时钟滴答数 cnt。当 cnt 达到或超过 ticks 时,退出循环,延时结束。

/*********************************************************************** 函数名称: udelay* 功能描述: us 级别的延时函数* 输入参数: us - 延时多少 us* 输出参数: 无* 返 回 值: 无* 修改日期        版本号     修改人	      修改内容* -----------------------------------------------***********************************************************************/
void udelay(int us)
{// 记录 SysTick 定时器当前的计数值,作为计时起点uint32_t told = SysTick->VAL;uint32_t tnow;// 获取 SysTick 定时器的重装载值,用于后续计算uint32_t load = SysTick->LOAD;/* LOAD+1 个时钟对应 1ms* n us 对应 n*(load+1)/1000 个时钟*/// 根据输入的 us 数,计算需要的时钟滴答数uint32_t ticks = us*(load+1)/1000;// 用于累计已经过去的时钟滴答数uint32_t cnt = 0;// 进入循环,开始计时while (1){// 获取 SysTick 定时器当前的计数值tnow = SysTick->VAL;if (told >= tnow)// 如果计数值没有溢出,直接计算两次计数值的差值并累加到 cnt 中cnt += told - tnow;else// 如果计数值溢出了,需要加上重装载值来正确计算经过的滴答数cnt += told + load + 1 - tnow;// 更新计时起点为当前计数值told = tnow;if (cnt >= ticks)// 当累计的滴答数达到需要的滴答数时,退出循环,延时结束break;}	
}

二、毫秒级延时函数 mdelay

mdelay 函数用于实现毫秒级的延时。它通过循环调用 udelay 函数,每次延时 1000 微秒(即 1 毫秒),从而实现指定毫秒数的延时。这种设计利用了已实现的微秒级延时函数,提高了代码的复用性。

/*********************************************************************** 函数名称: mdelay* 功能描述: ms 级别的延时函数* 输入参数: ms - 延时多少 ms* 输出参数: 无* 返 回 值: 无* 修改日期        版本号     修改人	      修改内容* -----------------------------------------------***********************************************************************/
void mdelay(int ms)
{// 通过循环多次调用 udelay 函数,每次延时 1000us(即 1ms),实现 ms 级别的延时for (int i = 0; i < ms; i++)udelay(1000);
}

三、获取系统时间函数 

system_get_ns 函数用于获取系统时间,单位为纳秒。它首先获取 SysTick 定时器的重装载值 reload 和系统启动后经过的滴答数(单位为毫秒)ns。然后获取 SysTick 定时器当前的计数值 cnt,将 ns 转换为纳秒,并计算 SysTick 定时器从上次重装载后到现在经过的时间(单位为纳秒),累加到 ns 中,最后返回系统当前的时间。

/*********************************************************************** 函数名称: system_get_ns* 功能描述: 获得系统时间(单位 ns)* 输入参数: 无* 输出参数: 无* 返 回 值: 系统时间(单位 ns)* 修改日期        版本号     修改人	      修改内容* -----------------------------------------------*/uint64_t system_get_ns(void)
{// 用于存储 SysTick 定时器当前计数值和计算过程中的中间结果uint64_t cnt;// 获取 SysTick 定时器的重装载值uint32_t reload = SysTick->LOAD;// 获取系统启动后经过的滴答数,单位是 msuint64_t ns = HAL_GetTick();// 获取 SysTick 定时器当前的计数值cnt = SysTick->VAL;// 将系统启动后经过的时间从 ms 转换为 nsns *= 1000000;// 计算 SysTick 定时器从上次重装载后到现在经过的时间(单位 ns),并累加到 ns 中ns += (reload - cnt) * 1000000 / reload;// 返回系统当前的时间,单位为 nsreturn ns;
}

四、函数调用

在主循环中,代码实现了一个周期性的操作。首先,将 GPIOE 引脚 5 置高电平,点亮连接在该引脚上的设备。然后记录开始时间 start_time,调用 mdelay 函数延时 500 毫秒,再记录结束时间 end_time。通过计算 end_time 和 start_time 的差值,得到 mdelay(500) 函数执行所花费的时间 elapsed_time,并使用 printf 函数将其打印输出。最后,将 GPIOE 引脚 5 置低电平,熄灭连接的设备,再次延时 500 毫秒,完成一个周期的操作。

  while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */// 点亮 GPIOE 引脚 5 连接的设备HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_SET);// 记录开始时间start_time = system_get_ns();// 延时 500 毫秒mdelay(500);// 记录结束时间end_time = system_get_ns();// 计算从计时起始点到结束点所经过的时间,即代码在 mdelay(500) 执行期间所花费的时间// 将结果存储在 elapsed_time 变量中,单位为纳秒//elapsed_time = end_time - start_time;// 打印延时耗时printf("elapsed_time: %"PRIu64"\r\n", elapsed_time);// 熄灭 GPIOE 引脚 5 连接的设备HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_RESET);// 再延时 500 毫秒mdelay(500);}

五、运行结果

调用500ms延时测的时间是约500337532 ns

综上所述,这段代码通过合理利用 STM32 的 SysTick 定时器,实现了微秒和毫秒级的延时,以及系统时间的获取和代码执行时间的测量,控制 LED 闪烁。

http://www.dtcms.com/wzjs/539344.html

相关文章:

  • 58同城做网站上海工商企业查询网
  • 网站推广计划书范文500字网站制作完成之后我们便进入了什么阶段
  • 让iis做跳转网站php和mysql做租车网站
  • 企业门户网站建设jsp网络黄页推广大全
  • 建设银行招聘官方网站连云港市城乡建设局网站
  • 潍坊建设厅官方网站wordpress 如何编辑
  • 南阳网站建设大旗电商wordpress主开发
  • 做网站app需要多少钱页面设计图标
  • 苏州企业网站关键词优化vps网站目录权限设置
  • 智库网站建设方案厦门关键词seo排名网站
  • 只能家居网站建设目的wordpress导出数据库结构
  • 网站布局f演讲网站开发背景
  • 建立网站的详细步骤图解丰都网站建设
  • 建设好网站外链有哪些方式最好的开发网站建设
  • 烟台专业做网站网络规划设计师考试全程指导(第2版) pdf
  • 云浮市住房和城乡建设局网站微信官网客户端
  • 建网站的几个公司做数学题的网站
  • php做简单网站例子做区位图的网站
  • 公司网站建设费入账中国企业网站建设案例
  • 唯一做魅惑的网站江苏省中医院网站建设
  • 旅游网站设计模版phpcms v9 网站名称标签
  • 上海建设工程检测登记的网站网站建设衤首选金手指10
  • 微信网站制作入门正规seo多少钱
  • 制作简历模板网站做网站的知名品牌公司
  • 比价网站怎么做的注册网站卖钱最多的人
  • 有做医学手术视频的网站简述网络营销的特点是什么
  • asp sqlite网站空间高端品牌运动鞋
  • 做网站和seo流程wamp加wordpress
  • 为什么建设旅游网站WordPress减少数据库占有
  • 设计学校网站模板域名第二年续费价格