历史上的今天
今天是:2025年02月04日(星期二)
2020年02月04日 | STM8 定时器TIM1 计时
2020-02-04 来源:eefocus
ST公司的STM8单片机的TIM1定时器,是一个16位高级控制定时器,可用于实现基本的定时,PWM波的产生,这里主要分析下基本的计时功能。
我们先看ST提供的库函数中TIM1定时器的初始化函数
void TIM1_TimeBaseInit(uint16_t TIM1_Prescaler,
TIM1_CounterMode_TypeDef TIM1_CounterMode,
uint16_t TIM1_Period,
uint8_t TIM1_RepetitionCounter)
其中,TIM1_Prescaler是一个16位的分频配置,可输入值为0-65535,这个值最终是写入TIM1_PSCR寄存器的,而我们计算定时器的频率公式为:fcnk = fsys/(PSCR[15:0]+1),其中fsys为系统时钟频率,PSCR[15:0]为TIM1_PSCR寄存器的16位值;
TIM1_CounterMode是计数模式,总共有5种模式,分别为:
TIM1_COUNTERMODE_UP 向上计数模式
TIM1_COUNTERMODE_DOWN 向下计数模式
TIM1_COUNTERMODE_CENTERALIGNED1
TIM1_COUNTERMODE_CENTERALIGNED2
TIM1_COUNTERMODE_CENTERALIGNED3
TIM1_Period,计数值,此项可取1-65535任意数值
TIM1_RepetitionCounter,重复计数次数,此项可取0-255任意数值。
假设我们的系统时钟是8Mhz,我们定时1秒钟,那我们初始化设置应该为:
TIM1_TimeBaseInit(7,TIM1_COUNTERMODE_UP,1000,100);
时间计算:
定时器的频率fcnk = 8Mhz/(7+1) = 1Mhz,说明一次计数为1us,1000次计数为1ms,而重复计数100次,则一次中断计时时间为100ms,为了到达1s的效果,我们还需要在中断函数里面,进行一个10次的判断
中断函数代码实现
INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11)
{
count_number++;
if(count_number < 10)
{
}
else
{
count_number = 0;//此时到达1秒钟定时
}
TIM1_ClearITPendingBit(TIM1_IT_UPDATE);
}
下面为相关代码,进行1S定时的实现
/*********************
*函数名称:TIM_Config
*函数描述:计时器配置
*参数说明:
* 输入参数 无
* 输出参数 无
*********************/
void TIM_Config(void)
{
TIM1_DeInit();
TIM1_TimeBaseInit(7,TIM1_COUNTERMODE_UP,1000,100);
TIM1_ARRPreloadConfig(ENABLE);
TIM1_ITConfig(TIM1_IT_UPDATE,ENABLE);
TIM1_Cmd(ENABLE);
}
/**
* @brief Timer1 Update/Overflow/Trigger/Break Interrupt routine.
* @param None
* @retval None
*/
INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
count_number++;
if(count_number < 10)
{
}
else
{
count_number = 0;
}
TIM1_ClearITPendingBit(TIM1_IT_UPDATE);
}
史海拾趣
|
用modelsim-altera版在时序仿真时,在工程中加入了仿真元件库、网表文件。延时文件、测试文件。. R1 W- g2 N. E |$ L7 H7 |) v$ s但是执行仿真后,出现这样的错误, K0 N7 g% I3 `\" KFailed to access library \'C:/altera/quartus60/ed ...… 查看全部问答> |
|
我把2440的背光部分驱动加入到6410的BSP中,写了一个小的应用程序,驱动无法打开有失败的提示,可是我在6410的注册表对应位置已经看到加入的backlight.dll了,这是怎么回事,大家知道吗? HANDLE hDrv = &n ...… 查看全部问答> |
|
看看我的调试信息:: \\ ID[1] { dwVersion: 0x1 dwSignature: 0x43465349 String: \'\' dwImageType: 0x6 dwTtlSectors: 0xDA64 dwLoadAddress: 0x8C200000 &nb ...… 查看全部问答> |
|
以下为TI提供的Time_A 输出PWM波形的示例: TI示例解释时说:P1.2|--> TACCR1 - 75% PWM P2.0|--> TACCR2 - 25% PWM ...… 查看全部问答> |




