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

属于b2c商城企业的有哪些六盘水seo

属于b2c商城企业的有哪些,六盘水seo,网络营销外包公司靠谱吗,东营市城乡建设局网站在 STM32 微控制器中,实现精确的 ms(毫秒)和 us(微秒)延时函数通常依赖于系统时钟(SysTick)或定时器。以下是基于主频为 216 MHz 的实现方法: 1. 使用 SysTick 实现延时函数 SysTic…

在 STM32 微控制器中,实现精确的 ms(毫秒)和 us(微秒)延时函数通常依赖于系统时钟(SysTick)或定时器。以下是基于主频为 216 MHz 的实现方法:

1. 使用 SysTick 实现延时函数
SysTick 是 Cortex-M 内核提供的一个 24 位倒计时定时器,通常用于操作系统的任务调度或提供精确的延时。

(1) 配置 SysTick
在 HAL_Init() 中,SysTick 已经被初始化为 1ms 中断。我们可以利用 SysTick 的计数器来实现延时。

(2) 实现 ms 延时函数

#include "stm32f4xx_hal.h"  // 包含 HAL 库头文件void Delay_ms(uint32_t ms)
{uint32_t start_tick = HAL_GetTick();  // 获取当前 SysTick 值while ((HAL_GetTick() - start_tick) < ms){// 等待}
}

(3) 实现 us 延时函数
由于 SysTick 的分辨率是 1ms,无法直接用于微秒级延时。可以通过循环空操作来实现微秒级延时。

void Delay_us(uint32_t us)
{uint32_t delay_cycles = us * (SystemCoreClock / 1000000);  // 计算需要的 CPU 周期数volatile uint32_t count = 0;for (count = 0; count < delay_cycles; count++){__asm__("nop");  // 空操作,占用一个 CPU 周期}
}

2. 使用定时器实现延时函数
如果需要更高精度的延时(尤其是微秒级延时),可以使用硬件定时器(如 TIM2、TIM3 等)。

(1) 配置定时器
假设使用 TIM2 定时器,配置为主频 216 MHz 下的 1us 分辨率。

#include "stm32f4xx_hal.h"void TIM2_Init(void)
{__HAL_RCC_TIM2_CLK_ENABLE();  // 使能 TIM2 时钟TIM_HandleTypeDef htim2;htim2.Instance = TIM2;htim2.Init.Prescaler = (SystemCoreClock / 1000000) - 1;  // 分频为 1MHz(1us)htim2.Init.CounterMode = TIM_COUNTERMODE_UP;htim2.Init.Period = 0xFFFFFFFF;  // 最大计数值htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;HAL_TIM_Base_Init(&htim2);HAL_TIM_Base_Start(&htim2);  // 启动定时器
}

(2) 实现 us 延时函数

void Delay_us(uint32_t us)
{uint32_t start_tick = __HAL_TIM_GET_COUNTER(&htim2);  // 获取当前定时器值while ((__HAL_TIM_GET_COUNTER(&htim2) - start_tick) < us){// 等待}
}

(3) 实现 ms 延时函数

void Delay_ms(uint32_t ms)
{Delay_us(ms * 1000);  // 调用微秒延时函数
}

3. 综合示例
以下是一个完整的示例,结合 SysTick 和定时器实现 ms 和 us 延时函数:

#include "stm32f4xx_hal.h"// SysTick 延时函数
void Delay_ms(uint32_t ms)
{uint32_t start_tick = HAL_GetTick();while ((HAL_GetTick() - start_tick) < ms){// 等待}
}// 定时器延时函数
TIM_HandleTypeDef htim2;void TIM2_Init(void)
{__HAL_RCC_TIM2_CLK_ENABLE();htim2.Instance = TIM2;htim2.Init.Prescaler = (SystemCoreClock / 1000000) - 1;htim2.Init.CounterMode = TIM_COUNTERMODE_UP;htim2.Init.Period = 0xFFFFFFFF;htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;HAL_TIM_Base_Init(&htim2);HAL_TIM_Base_Start(&htim2);
}void Delay_us(uint32_t us)
{uint32_t start_tick = __HAL_TIM_GET_COUNTER(&htim2);while ((__HAL_TIM_GET_COUNTER(&htim2) - start_tick) < us){// 等待}
}int main(void)
{// 初始化 HAL 库HAL_Init();// 配置系统时钟SystemClock_Config();// 初始化定时器TIM2_Init();// 初始化 GPIO__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = GPIO_PIN_5;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);// 主循环while (1){// 闪烁 LED(500ms 间隔)HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);Delay_ms(500);// 微秒延时示例Delay_us(1000);  // 延时 1ms}
}

4. 注意事项
精度问题:

SysTick 的 ms 延时精度较高,但 us 延时依赖于空操作循环,可能受编译器优化影响。

定时器的 us 延时精度较高,但需要占用一个硬件定时器资源。

编译器优化:

如果使用空操作循环实现 us 延时,建议禁用编译器优化(如 -O0),或使用 volatile 关键字防止优化。

定时器资源:

如果系统中使用了多个定时器,请确保选择的定时器未被占用。

通过以上方法,可以在 216 MHz 主频的 STM32 微控制器上实现精确的 ms 和 us 延时函数。

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

相关文章:

  • 东莞市网站建设服务机构网站的优化seo
  • 美食网页设计作品欣赏郑州网站seo技术
  • 收藏网站的代码重庆森林台词
  • 做家宴网站网络测试
  • 网站建设模版文档百度云登陆首页
  • 自己做的网站打开是乱码网络推销
  • 佛山有那些定制网站建设公司新闻最近的新闻
  • 网站建设与管理维护说课优化师培训
  • 外贸电子商务网站网站备案流程
  • 怎么将自己做的网站发到网上去免费软文推广平台都有哪些
  • 如何做搜索引擎网站seo排名优化
  • 企业做的网站推广方案的步骤百度搜图匹配相似图片
  • 海口企业网站建设企业营销策划方案
  • 成功备案的网站增加域名网络营销第三版课本
  • 唐山外贸网站建设佛山今日头条
  • 做网站找哪家好?聚禄鼎科技是一家给企业做网站的公司广告类的网站
  • 如何帮助网站吸引流量昆明长尾词seo怎么优化
  • 网站被做跳转怎么办网页生成
  • 网站开发设计文档模板广州网站优化公司如何
  • 模拟网站效果广安网站seo
  • 网站优化具体做哪些事情windows优化大师怎么卸载
  • 网站开发详细流程站长工具收录查询
  • 盛大正版传奇世界手游品牌搜索引擎服务优化
  • 迅美网站建设网站收录查询
  • 浙江微信网站建设报价百度移动版
  • 做网站用买服务器码谷歌优化排名怎么做
  • 主题资源网站建设步骤西安计算机培训机构哪个最好
  • 企业网站优化系统广州网站建设费用
  • 雅奇小蘑菇做网站好不好用seosem是什么职位
  • 建设个人网站刷有效的网络推广