
不好意思,各位,初学STM32,对于定时器的计算和频率的获取有些不太理解 我想稍微可以略精确的控制定时器的时间, 网上看到公式 f=(72M/(TIM_Prescaler+1)*(1+TIM_Period)) ; 不好意思,各位,初学STM32,对于定时器的计算和频率的获取有些不太理解 我想稍微可以略精确的控制定时器的时间, 网上看到公式 f=(72M/(TIM_Prescaler+1)*(1+TIM_Period)) ; void MY_TIMERINIT(int arr,int psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; NVIC_InitTypeDef NVIC_InitStruct; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInitStruct.TIM_Period = arr; TIM_TimeBaseInitStruct.TIM_Prescaler = psc; TIM_TimeBaseInit( TIM2, &TIM_TimeBaseInitStruct); TIM_ClearITPendingBit(TIM1, TIM_IT_Update); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1 ; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; NVIC_Init(&NVIC_InitStruct); } arr = 9999; psc = 7199; 打印的非常快 我看到代码里有 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; 看上去是APB1总线得到时钟,分频是1,看上去好像是APB1过来多少,那时钟频率就是多少。 我看到手册里的图 ![]() APB1的时钟好像是AHB分频来的,AHB的时钟代码哪里可以看到呢? 不是很理解。。。 问的比较基础,,,我也查过一些资料 麻烦各位了 谢谢 |
一般
参数 (TIM_Prescaler+1) 处理成为1MHZ 的整数倍
参数 (1+TIM_Period) 对1MHZ的整数 分频成为所需要的具体频率
72MHZ = 72000*1000
因为(TIM_Prescaler 最大 0xFF= 65535 那么 就只能处理成为 32766了 剩下的 2MHZ交给TIM_Period 来处理 TIM_Period=1999 可以处理为1秒一次的频率~~
希望对您有所帮助
谢谢!!
框图看过了,不过有些地方,麻烦斑竹君了。
APB1是由AHB给的,AHB最高是72,APB1最高是36
我程序中直接就用了
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
那请问AHB是多少呢?在程序哪儿可以看到配置的呢?
{
if(TIM_GetITStatus(TIM2, TIM_IT_Update)!=RESET)
{
static int co_sec = 0;
co_sec++;
printf("%d\r\n",co_sec);
}
}
int arr = 64999;
int psc = 64999;
速度还是很快。。。
clk
非常感谢,
你说的让我更明白了。
不过我的提问可能没说清楚。
我比较疑惑的是72m这个值是在那个文档可以查阅到呢?
麻烦你了,谢谢
还有配图,非常给力!非常感谢