void TIM1_Int_Init(7199,999);是多长时间进一次中断、
时间: 2023-06-19 08:36:13 浏览: 84
这个函数是用来初始化定时器1的,参数7199和999分别是自动重装载寄存器ARR和预分频器PSC的值。根据定时器计数的公式,定时器1的计数频率为:
计数频率 = APB2总线时钟频率 / (PSC + 1)
其中,APB2总线时钟频率默认为72MHz。因此,当PSC为7199时,定时器1的计数频率为:
计数频率 = 72MHz / (7199 + 1) = 10kHz
而定时器1的自动重装载值为ARR=999,意味着当定时器1计数值达到999时会发生一次更新事件,同时计数器会被重置为0重新开始计数。因此,每次定时器1计数从0开始,到达999时会发生一次更新事件,也就是每100个定时器时钟周期会进一次中断。因此,定时器1中断的时间间隔为:
时间间隔 = 100个时钟周期 × 每个时钟周期的时长
每个时钟周期的时长为:
每个时钟周期的时长 = 1 / 计数频率 = 1 / 10kHz = 0.1ms
因此,定时器1中断的时间间隔为:
时间间隔 = 100个时钟周期 × 每个时钟周期的时长 = 100 × 0.1ms = 10ms
相关问题
设置参数为多少void TIM1_Int_Init();是1ms进一次中断、
### 回答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触发一次中断的功能。
void TIM3_Int_Init(u16 arr,u16 psc)
这是一个函数声明,用于初始化STM32的定时器TIM3中断。其中,arr和psc分别表示自动重装值和预分频系数。具体实现代码如下:
```
void TIM3_Int_Init(u16 arr,u16 psc) {
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能TIM3时钟
TIM_TimeBaseInitStructure.TIM_Period = arr; //设置自动重装寄存器
TIM_TimeBaseInitStructure.TIM_Prescaler = psc; //设置预分频系数
TIM_TimeBaseInitStructure.TIM_ClockDivision = 0; //设置时钟分割
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //设置计数模式为向上计数
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure); //初始化TIM3
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); //允许更新中断,即计数器溢出中断
TIM_Cmd(TIM3, ENABLE); //使能TIM3
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //指定TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //响应优先级为3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能TIM3中断通道
NVIC_Init(&NVIC_InitStructure); //初始化NVIC
}
```
其中,TIM3_IRQn是TIM3的中断号,需要在中断服务函数中进行处理。
阅读全文