//定时器3中断服务程序
void TIM3_IRQHandler(void)
{
if(TIM3->SR&0X0001) //产生更新事件
{
LED1=!LED1;
LED0=!LED0;
}
TIM3->SR&=~(1<<0);//清除中断标志位
}
//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void Timerx_Init(u16 arr,u16 psc)
{
TIM3->SMCR&=0xfffffff8; //从模式控制寄存器设置预分频时钟由内部时钟提供
RCC->APB1ENR|=1<<1; //TIM3时钟使能
TIM3->ARR=arr; //设定计数器自动重装值
TIM3->PSC=psc; //预分频器7200,得到10Khz的计数时钟,//CK_CNT=Fck_psc/([15:0]+1)
TIM3->CR1|=1<<4; //计数器向下计数
TIM3->CR1|=1<<7; //每一次更新事件(UEV)时,才把预装在寄存器的内容送到影子寄存器
TIM3->CR1&=0xfffffffd; //设置UDIS允许更新事件(UEV)
TIM3->CR1&=0xfffffffb; //设置更新请求源
TIM3->CR1|=0x01; //使能计数器
TIM3->DIER|=1<<0; //允许更新中断
MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//抢占1,子优先级3,组2
}
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置72MHZ
delay_init(72); //延时初始化
uart_init(72,9600); //串口初始化
LED_Init(); //初始化与LED连接的硬件接口
Timerx_Init(5000,7199);//10Khz的计数频率,计数到5000为500ms
while(1)
{
delay_ms(200);
TIM3->EGR|=0x0001;
}
}
这样设置以后,个人做了测试,可以在计数器在计数到2000时,设置了TIM3->EGR|=0x0001;更新事件发生,并产生了更新事件中断,同时,对计数器重新初始化