stm32 通用定时器 定时问题
本人新手,正在学习定时器 定时功能,基本定时器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 = 0x80;
NVIC->ISER |= (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 ENABLE84M
/*******************设置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 = 0x80;
NVIC->ISER |= (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中的重载值
没用过F4的 为什么while(i--);这样写呢? 安 发表于 2015-4-7 09:18
为什么while(i--);这样写呢?
效果等同于
while(i > 0)
{
i--;
} 我知道这个意思一样,我是说这里加个延时是做什么用?
页:
[1]