设置参数为多少void TIM1_Int_Init();是1ms进一次中断、
时间: 2023-09-21 21:06:03 浏览: 145
开发模板环境-库函数.rar_STM32F1 库函数_stm32_stm32f1库函数
### 回答1:
要使得定时器 TIM1 每隔 1 毫秒触发一次中断,可以按照以下步骤设置参数:
1. 计算计数器自动重装载值 ARR 的大小:
由于定时器时钟频率为 APB2 总线频率的 2 倍,而 APB2 总线频率为 72MHz,因此定时器时钟频率为 144MHz。又因为要实现 1 毫秒中断一次,因此定时器每隔 1 毫秒需要计数器计数 1 次。因此,计数器自动重装载值 ARR 可以计算为:
ARR = 定时器时钟频率 / 计数频率 - 1 = 144000000 / 1000 - 1 = 143999
2. 设置预分频器的大小:
为了使得计数频率为 1kHz,需要设置预分频器的大小为 71(因为预分频器的分频系数为实际分频值加 1)。因此,预分频器的值为:
PSC = 预分频值 - 1 = 71 - 1 = 70
3. 将 ARR 和 PSC 的值分别赋给计数器的自动重装载寄存器 ARR 和预分频寄存器 PSC:
TIM1->ARR = 143999;
TIM1->PSC = 70;
4. 启用定时器 TIM1 的更新事件和中断:
TIM1->DIER |= TIM_DIER_UIE;
5. 使能定时器 TIM1:
TIM1->CR1 |= TIM_CR1_CEN;
完整的函数如下所示:
void TIM1_Int_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //使能 TIM1 时钟
//设置定时器 TIM1 的参数
TIM_TimeBaseStructure.TIM_Period = 143999; //自动重装载值 ARR
TIM_TimeBaseStructure.TIM_Prescaler = 70; //预分频器的值 PSC
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); //使能 TIM1 更新中断
//设置 NVIC 中断优先级组为 1,并使能 TIM1 更新中断
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM1, ENABLE); //使能定时器 TIM1
}
### 回答2:
设置参数为多少,使得函数void TIM1_Int_Init()可以实现每1ms进一次中断。
要实现每1ms进一次中断,需要根据系统时钟频率来确定TIM1的预分频系数和计数器值。
首先,假设系统时钟频率为F,要求1ms进一次中断,则计数器每计满一次应经过的时间应为1ms。假设计数器的位数为n,则计数器的最大值为2^n-1。因此,我们可以得到以下等式:
(2^n-1) / F = 1ms
解上述等式,得到:
2^n-1 = F * 1ms
将F乘以1ms的换算关系1ms = 1000000ns,将F替换为CPU的频率,得到:
2^n-1 = CPU频率 * 1000000ns
这样,我们可以通过对n进行遍历,来找到满足上述等式的最小的n,从而确定计数器的位数。
假设找到了计数器位数n之后,再通过计算得到预分频系数,计算公式为:
预分频系数 = (F / 1000) - 1
其中,F表示系统时钟频率。
最后,在函数void TIM1_Int_Init()中,将找到的计数器位数n和预分频系数设置给TIM1计数器和预分频器寄存器,并使得TIM1工作在向上计数模式。
综上所述,根据系统时钟频率F,可以通过计算得到合适的计数器位数n和预分频系数,并将其设置给TIM1计数器和预分频器寄存器,从而实现1ms进一次中断的要求。
### 回答3:
TIM1_Int_Init()函数是用于初始化TIM1计时器,并设置每隔1ms触发一次中断的参数。
在该函数中,我们需要做以下设置:
1. 首先,我们需要开启TIM1时钟,使其能够工作。通过设置RCC_APB2Periph_TIM1来开启TIM1时钟。
2. 接下来,我们需要设置TIM1的工作模式。通过设置TIM1的控制寄存器CR1,将TIM1设置为向上计数模式,并使其在溢出时自动重装载。
3. 然后,我们需要设置TIM1的预分频器,以确定每个计数周期的时钟频率。通过设置TIM1的预分频寄存器PSC,将时钟频率设置为1MHz,即每个计数周期为1us。
4. 接下来,我们需要设置TIM1的自动重装载寄存器ARR,以确定定时器的计数周期。通过设置ARR为1000,即每个计数周期为1ms。
5. 然后,我们需要使能TIM1的更新中断,并设置优先级。通过设置TIM1的中断使能寄存器DIER和中断优先级寄存器NVIC,使TIM1能够触发中断,并设置中断的优先级为较高。
6. 最后,我们需要启动TIM1计数器,使其开始计数。通过设置TIM1的控制寄存器CR1,将计时器使能,并开始计数。
总结起来,通过以上设置,TIM1_Int_Init()函数能够实现每隔1ms触发一次中断的功能。
阅读全文