实例代码
STM32F407芯片
使用定时器TIM4、内部时钟RCC 实现定时器中断
//配置定时器中断
void TIM4_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
//1.使能时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
//2.选择时钟源
TIM_InternalClockConfig(TIM4); //选择内部时钟源作为TIM4时基单元驱动
//3.配置时基单元
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //递增计数
TIM_TimeBaseInitStruct.TIM_Period = 10000 - 1; //计数重装值ARR
TIM_TimeBaseInitStruct.TIM_Prescaler = 8400 - 1; //预分频PSC
//TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; //选择外部时钟时,时钟源处的预分频
//TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0; //重复计数器的值,高级定时器才用到,这里给0即可
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStruct);
//清除中断标志(不清除则会在启动定时器前先产生一次更新中断事件)
//(自动重装载器机制是通过产生一次更新中断事件来装载的,所以初次给ARR值时,即便定时器还没有启动,也会产生一次更新中断事件)
TIM_ClearFlag(TIM4, TIM_FLAG_Update);
//4.配置输出中断控制,允许更新中断输出到NVIC
TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
//5.配置NVIC(嵌套中断向量控制器)
// ① NVIC优先级分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
// ② NVIC
NVIC_InitStruct.NVIC_IRQChannel = TIM4_IRQn; //选择NVIC通道
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
NVIC_Init(&NVIC_InitStruct);
//启动定时器
TIM_Cmd(TIM4, ENABLE);
}
//定时器4中断处理函数(函数位置任意,但函数名必须以中断向量表中的函数名为准,可在启动文件中找到)
void TIM4_IRQHandler(void)
{
//1.先判断TIM4中断标志位
if(TIM_GetITStatus(TIM4, TIM_IT_Update) == SET)
{
//2.处理中断的代码
//3.软件清除中断标志
TIM_ClearFlag(TIM4, TIM_FLAG_Update);
}
}
//主函数
int main()
{
TIM4_Init();
while(1);
}
|