STM8S105 TIM1 TIM2 定时器的定时时间初始化

很多刚接触STM8单片机的入门者不知到如何使用TIM1和TIM2的定时器作为定时功能。

下面介绍如下:

TIM1的初始化1us:

系统时钟是16M。

void set_TIM1_nus(u16 nus)
{
 /*1u的记数周期*/
 /*TIM1_TimeBaseInit(0x0F,TIM1_COUNTERMODE_UP,nus,TIM1_RCR_RESET_VALUE);*/
 /* Set the Autoreload value */
 TIM1->ARRH = (u8)(nus >> 8);
 TIM1->ARRL = (u8)(nus);

 /* Set the Prescaler value */
 TIM1->PSCRH = (u8)(0x0F >> 8);
 TIM1->PSCRL = (u8)(0x0F);

 /* Select the Counter Mode */
 TIM1->CR1 = (u8)(((TIM1->CR1) & (u8)(~(TIM1_CR1_CMS | TIM1_CR1_DIR))) | (u8)(TIM1_COUNTERMODE_UP));

 /* Set the Repetition Counter value */
 TIM1->RCR = TIM1_RCR_RESET_VALUE;
 
 /*打开1中断*/
 /*TIM1_ITConfig( TIM1_IT_UPDATE , ENABLE); */
 TIM1->IER |= (u8)TIM1_IT_UPDATE;
 
 /*计时器打开*/
 /*TIM1_Cmd(ENABLE); */
 TIM1->CR1 |= TIM1_CR1_CEN;

 /*TIM1_ClearFlag(TIM1_FLAG_UPDATE); */
   /* Clear the flags (rc_w0) clear this bit by writing 0. Writing ??has no effect*/
 TIM1->SR1 = (u8)(~(u8)(TIM1_FLAG_UPDATE));
 TIM1->SR2 = (u8)((u8)(~((u8)((u16)TIM1_FLAG_UPDATE >> 8))) & (u8)0x1E);

}

TIM2的初始化如下:

初始化为1ms

void time2_set_1ms(void)
{
 My_TIM2_TimeBaseInit(TIM2_PRESCALER_16,1000);

 My_TIM2_ITConfig( TIM2_IT_UPDATE , ENABLE);
 
 My_TIM2_SetCounter(0x0000);
 
 /*计时器打开*/
 My_TIM2_Cmd(ENABLE);
 My_TIM2_ClearFlag(TIM2_FLAG_UPDATE);
}

中断处理部分,两者基本上都是一致的:

中断处理函数里面清除本次的中断就好了。其他功能自己定义。

TIMx_ClearFlag(TIM_FLAG_UPDATE);

 

好的,以下是基本定时器TIM2和TIM3的初始化代码: 1. TIM2初始化代码: ```c void TIM2_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 使能TIM2时钟 TIM_TimeBaseInitStruct.TIM_Prescaler = 72 - 1; // 预分频器,定时器时钟为72MHz/72=1MHz TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式 TIM_TimeBaseInitStruct.TIM_Period = 1000 - 1; // 自动重装载值,定时1ms TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct); // 初始化TIM2定时器 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // 允许更新中断 TIM_Cmd(TIM2, ENABLE); // 使能TIM2定时器 } ``` 2. TIM3初始化代码: ```c void TIM3_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 使能TIM3时钟 TIM_TimeBaseInitStruct.TIM_Prescaler = 72 - 1; // 预分频器,定时器时钟为72MHz/72=1MHz TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式 TIM_TimeBaseInitStruct.TIM_Period = 5000 - 1; // 自动重装载值,定时5ms TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct); // 初始化TIM3定时器 TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); // 允许更新中断 TIM_Cmd(TIM3, ENABLE); // 使能TIM3定时器 } ``` 以上代码中,我们使用了STM32F405的72MHz内部时钟作为定时器的时钟源,并通过预分频器将其分频为1MHz。定时器的计数模式为向上计数,自动重装载值为1000和5000分别表示1ms和5ms的定时时间。TIM_ITConfig函数用于使能定时器的更新中断,TIM_Cmd函数用于使能定时器。 希望这些代码对你有帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

goodlinux

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值