我正在尝试使用stm32生成1us延迟,我知道我需要一个计时器。 我在计时器上找到了一些代码,但是不知道如何配置设置使其达到1us。 因为设置将取决于apb1时钟频率或其他。 下面是我的代码:
void TIM5_Init_Query(void)
{
TIM_TimeBaseInitTypeDef Tim5;
TIM_DeInit(TIM5);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);
Tim5.TIM_Period=1;
Tim5.TIM_Prescaler=80-1;
Tim5.TIM_ClockDivision=1;
Tim5.TIM_CounterMode=TIM_CounterMode_Down;
TIM_TimeBaseInit(TIM5,&Tim5);
}
void usDelay(u32 nTime)
{
u16 counter=nTime&0xffff;
TIM_Cmd(TIM5,ENABLE);
TIM_SetCounter(TIM5,counter);
while(counter>1)
{
counter=TIM_GetCounter(TIM5);
}
TIM_Cmd(TIM5,DISABLE);
}
我的问题是,如何设置TIM_Prescaler,TIM_Period和Tim5.TIM_ClockDivision, 这些价值与我的延迟之间的关系是什么? 如何在我的代码中检查apb1时钟频率?
答案 0 :(得分:3)
您可以使用STM32外设库中提供的函数RCC_GetClocksFreq
在运行时获取apb时钟频率。要使此功能返回正确的值,如果您使用的频率不是默认值的外部晶振(STM32F1xx为8 MHz或25 MHz,请检查您的微控制器),您需要定义宏HSE_VALUE
并将其设置为项目中使用的晶体频率。
您没有说明您使用的是哪种微控制器(有许多不同的stm32微型),但不同的参数记录在与您的微控制器系列相对应的参考手册中,例如对于STM32F1XX,这将是第15.3节参考手册,本文件:
http://www.st.com/web/en/resource/technical/document/reference_manual/CD00171190.pdf