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

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个回答
zfz0122 回答时间: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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版