stm8S毫秒定时器

#include "tim4.h"
#include "stm8s_tim4.h"

#define TIM4_PERIOD 124

void Dely1ms(void)
{
TIM4_DeInit();
/* Time base configuration */
// 8M/64=125000HZ
// (x + 1)/125000=0.001s = 1ms
// x = 124
TIM4_TimeBaseInit(TIM4_PRESCALER_64, TIM4_PERIOD);

/* Clear TIM4 update flag */
TIM4_ClearFlag(TIM4_FLAG_UPDATE);
/* Enable update interrupt */
TIM4_ITConfig(TIM4_IT_UPDATE, DISABLE);

/* Enable TIM4 */
TIM4_Cmd(ENABLE);

while( SET != TIM4_GetFlagStatus(TIM4_FLAG_UPDATE));
}

void DelyMs(uint32_t ms)
{
while(ms--) Dely1ms();
}

 

转载于:https://www.cnblogs.com/tinyos/p/6392207.html

### STM8S 单片机中定时器1实现精确延时 对于STM8S系列单片机中的定时器1(TIM1),可以利用其自动重装载功能来创建一个精确的延时函数。通过配置预分频系数(Prescaler)和计数周期(Auto-reload register value),能够调整延时的时间长度。 #### 配置定时器1以产生特定频率中断用于延时 为了使能TIM1并设定所需的参数,需调用`TIM1_TimeBaseInit()`函数[^1]: ```c void TIM1_Configuration(void){ /* Time base configuration */ TIM1_TimeBaseInitTypeDef TIM1_TimeBaseStructure; RCC_ClocksTypeDef rcc_clocks; // 获取当前系统时钟信息 RCC_GetClocksFreq(&rcc_clocks); // 计算预分配值PrescalerValue uint16_t PrescalerValue = (uint16_t)((rcc_clocks.SYSCLK_Frequency / 2) / 1000000) - 1; // 初始化TIM1 TIM1_DeInit(); // 设置时间基底结构体成员变量 TIM1_TimeBaseStructure.TIM1_Prescaler = PrescalerValue; TIM1_TimeBaseStructure.TIM1_Period = 9999; // 自动重新加载寄存器ARR=9999对应于1ms间隔 TIM1_TimeBaseStructure.TIM1_ClockDivision = 0; TIM1_TimeBaseStructure.TIM1_RepetitionCounter = 0; TIM1_TimeBaseStructure.TIM1_CounterMode = TIM1_CounterMode_Up; // 根据定义的时间基底参数初始化TIM1向下计数器 TIM1_TimeBaseInit(&TIM1_TimeBaseStructure); } ``` 上述代码片段展示了如何基于期望得到每毫秒一次更新事件的前提下来设置定时器1的工作模式以及相关参数。这里假设系统的主频为16MHz,则经过除法运算后得出合适的预分频数值使得每次溢出代大约1ms的实际物理时间流逝。 接着,在实际应用当中可能还需要编写一段简单的等待循环逻辑配合之前提到过的定时器完成具体的延时操作: ```c // 延时n ms void delay_ms(uint32_t nTime){ TimingDelay = nTime; while(TimingDelay != 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值