你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32 通用定时器 定时问题

[复制链接]
jjii 提问时间:2015-4-4 18:28 /
本人新手,正在学习定时器 定时功能,基本定时器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中的重载值



收藏 评论4 发布时间:2015-4-4 18:28

举报

4个回答
kqh1120 回答时间:2015-4-6 13:29:10
没用过F4的 sweat.gif
废鱼 回答时间:2015-4-7 09:18:14
为什么while(i--);这样写呢?
jjii 回答时间:2015-4-15 11:11:24
安 发表于 2015-4-7 09:18
为什么while(i--);这样写呢?

效果等同于
while(i > 0)
{
    i--;
}
废鱼 回答时间:2015-4-15 16:36:08
我知道这个意思一样,我是说这里加个延时是做什么用?

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版