2018/4/19
stm32
1.说在前面
今天在代码层面上初步接触了通用寄存器,学习了一下怎样配置一个定时器和设置中断时间
2.对于定时器的配置
1.配置定时器(依旧采用结构体的形式初始化)
1-1:配置定时器的初始化
1-2:配置NVIC的中断优先级
1-3:使能定时器3
注:库函数存在于Stm32f10x_tim.h和Stm32f10x_tim.c中
void TIM3_Int_Init(u16 arr,u16 psc)//arr 自动重装值,psc 时间预分频系数
{
//1.配置定时器操作
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//设置定时器的初始化
NVIC_InitTypeDef NVIC_InitStructure;//设置中断优先级的初始化
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //实现时钟3使能
TIM_TimeBaseInitStructure.TIM_Period=arr;//自动重载寄存器周期
TIM_TimeBaseInitStructure.TIM_Prescaler=psc;//时钟频率的预分频系数
TIM_TimeBaseInitStructure.TIM_ClockDivision= TIM_CKD_DIV1;//设置时钟分割,DIV1对等分割
//这2位定义在定时器时钟(CK_INT)频率、死区时间和由死区发生器与数字滤波器(ETR,TIx)所用
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);//进行定时器3的初始化
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //允许更新中断
//配置定时器3成功
//配置NVIC
NVIC_InitStructure.NVIC_IRQChannel= TIM3_IRQn;//设置定时器3的中断操作
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//共占优先级为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;//从优先级为3
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);//初始化NVIC
//配置定时器成功
//使能定时器3
TIM_Cmd(TIM3,ENABLE);
}
注:对于NVIC的IRQChannel而言,不一定每一个管脚都有自己独特的中断线,一般而言TIM0-4有自己独特的通道,TIM9_5共用,TIM15_10共用
arr:自动重载的寄存器周期
psc:时间频率的预分频系数
TIME=(arr+1)*1/(CLK/psc)
例:TIMx_Int_Init(4999,7199)
则分频系数为7200,,分频为10KHZ,所以一次中断的时间为1/10khz=10^-4s
所以中断一次的时间为5000*10^-4=0.5s
配置中断服务函数,则小灯每隔0.5s闪烁一次
void TIM3_IRQHandler()
{
if(TIM_GetITStatus(TIM3, TIM_IT_Update)!=RESET)//判断中断的产生
{
TIM_ClearITPendingBit(TIM3,TIM_IT_Update );//清除
LED1=!LED1;//实现LED1的控制
}
}