OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4144|回复: 1

基本定时器Timer6的问题。。

[复制链接]

52

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
997
金钱
997
注册时间
2017-8-19
在线时间
160 小时
发表于 2018-3-12 15:51:37 | 显示全部楼层 |阅读模式
1金钱
#include "stm32f4xx.h"
#include "timer.h"
#include "led.h"


//TIM6/TIM7为基本定时器,时钟源是内部时钟源
//定时器时钟为84M,是递增计数器

/*
函数功能:初始化基本定时器,定时时间为1s
*/
void timer6_init(uint16_t psc,uint16_t arr)
{       
        uint32_t priority = 0;
        RCC->APB1ENR |= 1 << 4; //开启tim6外设时钟
        TIM6->PSC = 8400 - 1; //84M/8400 = 10000 频率  -1是因为寄存器上+1了
        TIM6->ARR = 10000 - 1;  //配置计数器的值  -1是因为公式+1了  不要纠结
       
        //配置控制寄存器
        TIM6->CR1 = 0;   //不缓冲(不使用影子寄存器、循环模式,使能其他一些东西)
        TIM6->CR2 |= (0x4 << 4);        //选择更新事件作为触发TRGO
        TIM6->DIER |= 1 << 0;  //使能更新中断
       
        //设置中断优先级
        NVIC_SetPriorityGrouping(7-2);  //设置优先级分组
        priority = NVIC_EncodePriority(7-2,2,2); //优先级编码
        NVIC_SetPriority(TIM6_DAC_IRQn,priority); //设置优先级编码
        NVIC_EnableIRQ(TIM6_DAC_IRQn);       //使能核心级优先级
       
        TIM6->CR1 |= 1 << 0; //开启计数器计数
}

/*
函数功能:基本定时器tim6的中断服务函数
//这里只做了一部分
*/
void TIM6_DAC_IRQHandler(void)
{       
                LED0 = !LED0;
                TIM6->SR &= ~(0X1 << 0);
                TIM6->CR1 |= 1 << 0; //开启计数器计数
}



上面这部分代码是我想定时1s的,结果示波器变成了3s。。。我不知道哪里错了。。
另外,我没有按照原子的方法修改启动文件那些,查了一下还是8M的外部晶振,这个应该没问题,现在不知道问题错在哪里。。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

163

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2762
金钱
2762
注册时间
2017-5-17
在线时间
430 小时
发表于 2018-3-12 19:55:04 | 显示全部楼层
你先看看你的时钟是不是正确的,库函数提供的有个函数可以查看系统的时钟频率,【void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)】。如果还是不行,对照原子的例程仔细看看初始化那一块。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-20 18:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表