本人新手,正在学习定时器 定时功能,基本定时器TIM6/7测试可行,但是通过定时器TIM14测试遇到问题,求大家帮忙看看,这个问题困扰我好久了。 ///////////////////////////////////////////////////测试基本定时器TIM6/7 程序如下: #include "stm32f4xx.h" int main(void) { /*******************设置时钟******************************/ RCC->AHB1ENR = 0x00000001; //GPIOA端口使能 RCC->APB1ENR = 0x00000030; //TIM6,TIM7使能 42M /*******************设置IO引脚******************************/ GPIOA->MODER |= 0x00000001; //设置GPIOA端口引脚PA0为输出模式 GPIOA->OTYPER |= 0x000000000; //默认推挽输出 GPIOA->OSPEEDR |= 0x00000001; //输出速度为25M GPIOA->PUPDR |= 0x00000000; //无上拉下拉 GPIOA->ODR = 0x00000000; //默认输出低电平 /*******************设置TIM******************************/ TIM6->CR1 = 0x0080; //(bit7)自动重载使能,更新请求源,允许更新,计数器开关 // TIM7->CR2 = 0x0000; //保持复位值,(从模式控制位) TIM6->CNT = 0; //计数寄存器,用于存放初始值 TIM6->PSC = 8399; //预分频寄存器,APB1时钟频率的8400分频,发生更新事件时装载到实际预分频寄存器 TIM6->ARR = 10000; //自动载入寄存器,发生更新时间时装载到实际自动重载寄存器,不能为空,定时1s TIM6->DIER = 0x0001; //(bit0)中断使能位,(bit8)DMA使能位 TIM6->EGR = 0x0000; //软件更新控制位,若(bit0)UG=1:重新初始化计数寄存器he预分频寄存器 TIM6->CR1 |= 0x0001; /*************************设置中断****************************/ // NVIC->IP[55] = 0x80; NVIC->ISER[1] |= (1<<(54-32)); //使能 while(1); } void TIM6_DAC_IRQHandler(void) //找中断入口到startup文件中找 { uint32_t i=0x00ffffff; if(TIM6->SR == 0x0001) { GPIOA->BSRRL = 0x0001; //PA0置位 while(i--); GPIOA->BSRRH = 0x0001; //每隔1S灯闪烁 TIM6->SR = 0x0000; //状态位软件清零 } } ////////////////////////////////////////////////////////////通用定时器TIM14测试程序: #include "stm32f4xx.h" uint32_t i=0x0fffffff; int main(void) { /*******************设置时钟******************************/ RCC->AHB1ENR = 0x00000001; //GPIOA端口使能 RCC->APB1ENR = 0x00000180; //TIM13,TIM14使能 42M RCC->APB2ENR = 0x00070000; //TIM9 TIM10 TIM11 ENABLE 84M /*******************设置IO引脚******************************/ GPIOA->MODER |= 0x00000001; //设置GPIOA端口引脚PA0为输出模式 GPIOA->OTYPER |= 0x000000000; //默认推挽输出 GPIOA->OSPEEDR |= 0x00000001; //输出速度为25M GPIOA->PUPDR |= 0x00000000; //无上拉下拉 GPIOA->ODR = 0x00000000; //默认输出低电平 /*******************设置TIM9******************************/ TIM14->CR1 |= 0x0080; //(bit7)自动重载使能,请求源,允许更新,计数器开关(所有寄存器设置完后置1,开始计数) // TIM9->CR2 = 0x0000; //保持复位值,(用于选择主模式下将要发送到从定时器以实现同步的信息) // TIM9->SMCR = 0x0070; //从模式控制寄存器(外部触发信号极性选择 //内部触发,边沿检测触发,滤波输入) TIM14->CNT = 0; //计数寄存器,用于存放初始值 TIM14->ARR = 10000; //自动载入寄存器,发生更新时间时装载到实际自动重载寄存器,不能为空,定时1s TIM14->PSC = 8399; //预分频寄存器,APB1时钟频率的8400分频,发生更新事件时装载到实际预分频寄存器 TIM14->DIER = 0x0001; //(bit0)中断使能位, bit2/3 捕获/比较中断使能,bit6 触发信号中断使能 TIM14->EGR = 0x0000; //软件更新控制位,若(bit0)UG=1:重新初始化计数寄存器he预分频寄存器 // TIM9->CCMR1 = 0x0000; //捕获/比较模式控制器 // TIM9->CCER = 0x0000; //捕获/比较使能控制 // TIM9->CCR1 = 0x0000; // TIM9->CCR2 = 0x0000; TIM14->CR1 |= 0x0001; /*************************设置中断****************************/ // NVIC->IP[55] = 0x80; NVIC->ISER[1] |= (1<<(45-32)); //使能 while(1) { //测试程序 if(TIM14->CNT >10000) //超过上限 { GPIOA->BSRRL = 0x0001; //PA0置位 } } void TIM8_TRG_COM_TIM14_IRQHandler(void) //找中断入口到startup文件中找 { uint32_t i=0x0fffffff; if(TIM14->SR == 0x0001) { GPIOA->BSRRL = 0x0001; //PA0置位 while(i--); GPIOA->BSRRH = 0x0001; //每隔1S灯闪烁 TIM14->SR = 0x0000; //状态位软件清零 } } 对于TIM14写了同样的程序,遇到问题 ,描述如下 //选择内部时钟,软件触发正常,中断程序正常 //但是不产生溢出中断,CTN寄存器的计数值可以大于ARR中的重载值 |
效果等同于
while(i > 0)
{
i--;
}