打印

劳驾一次版主帮忙看看

[复制链接]
2474|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ff8zgs|  楼主 | 2013-2-21 18:46 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ff8zgs 于 2013-2-21 19:26 编辑

最近在用Tim1 做定时中断,发现了一个奇怪的问题,我计算5mS中断一次但实际上却是0.5s 中断一次。
代码如下,我从MCO输出sysclk时钟看是正确的50Mhz,然后PLL/2时钟也是正确25Mhz,查看寄存器RCC_CFGR 0x0001 040A Tim1_CR1=0x0000 0001 都是正确 但是在最终的板子上LED灯 闪烁情况 却相差了100倍,不明白哪里出错了,补充下,MCU是STM32F107.
void RCC_cfg(void)
{
        //定义错误状态变量
        ErrorStatus HSEStartUpStatus;

        //将RCC寄存器重新设置为默认值
        RCC_DeInit();        
/*        //打开外部高速时钟晶振25Mhz*/
        RCC_HSEConfig(RCC_HSE_ON);
//        RCC_GetSYSCLKSource();        
        //等待外部高速时钟晶振工作
        HSEStartUpStatus = RCC_WaitForHSEStartUp();
        if(HSEStartUpStatus == SUCCESS)               
        {
//                RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
                /*使用PLL时钟时钟源为HSE,PLL时钟频率50MHZ  HSE x2*/
                RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_2);                                
                RCC_PLLCmd(ENABLE);        
                /*设置AHB时钟为HCLK时钟  未分频=50Mhz*/
                RCC_HCLKConfig(RCC_SYSCLK_Div1);               
                /*设置高速AHB时钟(APB2)为HCLK时钟 =50Mhz*/               
                RCC_PCLK2Config(RCC_HCLK_Div1);                                
                /*设置低速AHB时钟(APB1)为HCLK时钟 =25Mhz*/                                
                RCC_PCLK1Config(RCC_HCLK_Div2);                                                
                                                
                while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);                        
                        
                //设置PLL为系统时钟源                                
                RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);               
                //判断PLL是否是系统时钟                                
                while(RCC_GetSYSCLKSource() != 0x08);
        
        }                        
        //打开GPIO时钟,复用功能,串口1的时钟               
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1, ENABLE);
}
{
          TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        uint32_t a,b;

  /* TIM5 clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
  
  /* ---------------------------------------------------------------
    TIM4 Configuration: Output Compare Timing Mode:
    TIM2CLK = 36 MHz, Prescaler = 7200, TIM2 counter clock = 7.2 MHz
  --------------------------------------------------------------- */

  /* Time base configuration */
  //这个就是自动装载的计数值,由于计数是从0开始的,计数10000次后为9999
  TIM_TimeBaseStructure.TIM_Period = (100 - 1);
  // 这个就是预分频系数,当由于为0时表示不分频所以要减1
  TIM_TimeBaseStructure.TIM_Prescaler = (2500 - 1);
  // 高级应用本次不涉及。定义在定时器时钟(CK_INT)频率与数字滤波器(ETR,TIx)
  // 使用的采样频率之间的分频比例
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  //向上计数
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  //初始化定时器5
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

  /* Clear TIM5 update pending flag[清除TIM5溢出中断标志] */
  TIM_ClearITPendingBit(TIM1, TIM_IT_Update);

  /* TIM IT enable */ //打开溢出中断
  TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);

  /* TIM5 enable counter */
  TIM_Cmd(TIM1, ENABLE);  //计数器使能,开始工作
  
                  a=TIM1->CR1;        
                b=a+b;
}
沙发
uet_cache| | 2013-2-21 19:17 | 只看该作者
你是用F1,还是F2,F4..

使用特权

评论回复
板凳
ff8zgs|  楼主 | 2013-2-21 19:25 | 只看该作者
uet_cache 发表于 2013-2-21 19:17
你是用F1,还是F2,F4..

stm32F107

使用特权

评论回复
地板
uet_cache| | 2013-2-21 19:40 | 只看该作者
定时器配置好像没问题。你可以看下时钟树,查时钟配置。

使用特权

评论回复
5
610095871| | 2013-2-21 19:42 | 只看该作者
STM32F107d PLLMUL 应该是没有2倍频的
#ifndef STM32F10X_CL
#define RCC_PLLMul_2                    ((uint32_t)0x00000000)
#define RCC_PLLMul_3                    ((uint32_t)0x00040000)
#define RCC_PLLMul_4                    ((uint32_t)0x00080000)
#define RCC_PLLMul_5                    ((uint32_t)0x000C0000)
#define RCC_PLLMul_6                    ((uint32_t)0x00100000)
#define RCC_PLLMul_7                    ((uint32_t)0x00140000)
#define RCC_PLLMul_8                    ((uint32_t)0x00180000)
#define RCC_PLLMul_9                    ((uint32_t)0x001C0000)
#define RCC_PLLMul_10                   ((uint32_t)0x00200000)
#define RCC_PLLMul_11                   ((uint32_t)0x00240000)
#define RCC_PLLMul_12                   ((uint32_t)0x00280000)
#define RCC_PLLMul_13                   ((uint32_t)0x002C0000)
#define RCC_PLLMul_14                   ((uint32_t)0x00300000)
#define RCC_PLLMul_15                   ((uint32_t)0x00340000)
#define RCC_PLLMul_16                   ((uint32_t)0x00380000)
#define IS_RCC_PLL_MUL(MUL) (((MUL) == RCC_PLLMul_2) || ((MUL) == RCC_PLLMul_3)   || \
                              ((MUL) == RCC_PLLMul_4) || ((MUL) == RCC_PLLMul_5)   || \
                              ((MUL) == RCC_PLLMul_6) || ((MUL) == RCC_PLLMul_7)   || \
                              ((MUL) == RCC_PLLMul_8) || ((MUL) == RCC_PLLMul_9)   || \
                              ((MUL) == RCC_PLLMul_10) || ((MUL) == RCC_PLLMul_11) || \
                              ((MUL) == RCC_PLLMul_12) || ((MUL) == RCC_PLLMul_13) || \
                              ((MUL) == RCC_PLLMul_14) || ((MUL) == RCC_PLLMul_15) || \
                              ((MUL) == RCC_PLLMul_16))

#else
#define RCC_PLLMul_4                    ((uint32_t)0x00080000)
#define RCC_PLLMul_5                    ((uint32_t)0x000C0000)
#define RCC_PLLMul_6                    ((uint32_t)0x00100000)
#define RCC_PLLMul_7                    ((uint32_t)0x00140000)
#define RCC_PLLMul_8                    ((uint32_t)0x00180000)
#define RCC_PLLMul_9                    ((uint32_t)0x001C0000)
#define RCC_PLLMul_6_5                  ((uint32_t)0x00340000)

首先启动文件使用 startup_stm32f10x_cl.s
另外在软件或程序中添加 STM32F10X_CL的宏定义
这样试试

使用特权

评论回复
6
ff8zgs|  楼主 | 2013-2-21 19:57 | 只看该作者
本帖最后由 ff8zgs 于 2013-2-21 20:02 编辑
610095871 发表于 2013-2-21 19:42
STM32F107d PLLMUL 应该是没有2倍频的
#ifndef STM32F10X_CL
#define RCC_PLLMul_2                    (( ...

2倍频是我自己修改历程库搞得,因为我手上的板子的HSE是25Mhz,但我希望计数系统时钟为50Mhz,所以修改成2倍频,这个是可以实现的。历程库里说用4~9倍是在HSE 8Mhz下说的,所以我2倍频是可以的,并且在MCO输出的SYSCLK50Mhz 表明 这个方法是可行的
#ifndef STM32F10X_CL
#define RCC_PLLMul_2                    ((uint32_t)0x00000000)
#define RCC_PLLMul_3                    ((uint32_t)0x00040000)
#define RCC_PLLMul_4                    ((uint32_t)0x00080000)
#define RCC_PLLMul_5                    ((uint32_t)0x000C0000)
#define RCC_PLLMul_6                    ((uint32_t)0x00100000)
#define RCC_PLLMul_7                    ((uint32_t)0x00140000)
#define RCC_PLLMul_8                    ((uint32_t)0x00180000)
#define RCC_PLLMul_9                    ((uint32_t)0x001C0000)
#define RCC_PLLMul_10                   ((uint32_t)0x00200000)
#define RCC_PLLMul_11                   ((uint32_t)0x00240000)
#define RCC_PLLMul_12                   ((uint32_t)0x00280000)
#define RCC_PLLMul_13                   ((uint32_t)0x002C0000)
#define RCC_PLLMul_14                   ((uint32_t)0x00300000)
#define RCC_PLLMul_15                   ((uint32_t)0x00340000)
#define RCC_PLLMul_16                   ((uint32_t)0x00380000)
#define IS_RCC_PLL_MUL(MUL) (((MUL) == RCC_PLLMul_2) || ((MUL) == RCC_PLLMul_3)   || \
                              ((MUL) == RCC_PLLMul_4) || ((MUL) == RCC_PLLMul_5)   || \
                              ((MUL) == RCC_PLLMul_6) || ((MUL) == RCC_PLLMul_7)   || \
                              ((MUL) == RCC_PLLMul_8) || ((MUL) == RCC_PLLMul_9)   || \
                              ((MUL) == RCC_PLLMul_10) || ((MUL) == RCC_PLLMul_11) || \
                              ((MUL) == RCC_PLLMul_12) || ((MUL) == RCC_PLLMul_13) || \
                              ((MUL) == RCC_PLLMul_14) || ((MUL) == RCC_PLLMul_15) || \
                              ((MUL) == RCC_PLLMul_16))

#else
#define RCC_PLLMul_2                    ((uint32_t)0x00000000)

#define RCC_PLLMul_4                    ((uint32_t)0x00080000)
#define RCC_PLLMul_5                    ((uint32_t)0x000C0000)
#define RCC_PLLMul_6                    ((uint32_t)0x00100000)
#define RCC_PLLMul_7                    ((uint32_t)0x00140000)
#define RCC_PLLMul_8                    ((uint32_t)0x00180000)
#define RCC_PLLMul_9                    ((uint32_t)0x001C0000)
#define RCC_PLLMul_6_5                  ((uint32_t)0x00340000)


使用特权

评论回复
7
ff8zgs|  楼主 | 2013-2-21 20:00 | 只看该作者
uet_cache 发表于 2013-2-21 19:40
定时器配置好像没问题。你可以看下时钟树,查时钟配置。

时钟树看过了没有问题,这段代码是在Tim5 上改过来的,只是把tim5改成了Tim1而已,当然时钟和中断服务业相应修改了

使用特权

评论回复
8
610095871| | 2013-2-21 20:10 | 只看该作者
lz还是好好看看互联性的参考手册吧。

使用特权

评论回复
9
ff8zgs|  楼主 | 2013-2-21 20:24 | 只看该作者
610095871 发表于 2013-2-21 20:10
lz还是好好看看互联性的参考手册吧。

刚才我试了用HIS/2做系统系统时钟,但中断相差100倍还是存在。所以这个方法本身应该没有问题,STM32互联型,应该是使用功能来划分的,107 如果没使用网络和usb应该和普通的设备一样。所以可以让系统时钟低于25Mhz,而如果需要使用互联功能就必须高于25Mhz,所以如果外部时钟8Mhz,必须是4倍以上。不知道我这么理解有没有错误。

使用特权

评论回复
10
ff8zgs|  楼主 | 2013-2-22 08:35 | 只看该作者
乖乖 都要 沉下去了。。。。。还没解决方案呢

使用特权

评论回复
11
gongyuan073| | 2013-2-22 09:10 | 只看该作者
帮顶啊 期待接待

使用特权

评论回复
12
ff8zgs|  楼主 | 2013-2-22 10:41 | 只看该作者
已经绝望了,debug看每一个寄存器都是正确的,主要RCC和TIm1 的寄存器如下图

未反反复复命名.jpg (96.71 KB )

未反反复复命名.jpg

dddjpg.jpg (72.77 KB )

dddjpg.jpg

使用特权

评论回复
13
ff8zgs|  楼主 | 2013-2-22 12:42 | 只看该作者
求大侠啊求大侠,给小弟我指个方向也好啊

使用特权

评论回复
14
JasonWangFAE| | 2013-2-22 13:17 | 只看该作者
I think you can check "HSE_VALUE" this value in the stm32f10x.h file .

使用特权

评论回复
15
ff8zgs|  楼主 | 2013-2-22 13:21 | 只看该作者
JasonWangFAE 发表于 2013-2-22 13:17
I think you can check "HSE_VALUE" this value in the stm32f10x.h file .

问题已解决了,和那个 头文件无关系。
虽然原因 我还是有点不能接受 但问题解决,

使用特权

评论回复
16
ocon| | 2013-2-22 18:57 | 只看该作者
ff8zgs 发表于 2013-2-22 13:21
问题已解决了,和那个 头文件无关系。
虽然原因 我还是有点不能接受 但问题解决, ...

电工最恶劣的陋习,就是在求助的时候希望所有人都热心来帮你,一旦问题解决,却不肯公开,藏着掖着,生怕被人偷了去。

使用特权

评论回复
17
hawksabre| | 2013-2-22 20:10 | 只看该作者
顶一个   问题是什么  楼主   说一下

使用特权

评论回复
18
ff8zgs|  楼主 | 2013-2-22 20:53 | 只看该作者
本帖最后由 ff8zgs 于 2013-2-22 20:56 编辑
ocon 发表于 2013-2-22 18:57
电工最恶劣的陋习,就是在求助的时候希望所有人都热心来帮你,一旦问题解决,却不肯公开,藏着掖着,生怕 ...

你这个批评,我不接受,这是赤果果的冤枉,我解决这个问题后,立马投入下一步的任务,而且关键是问题原因我还没想明白,所以没在这里细说也没结贴。那么现在结贴。其实问题关键是要配置这句。但是我看ST的描述是在下溢更新事件,而且主要是用在PWM上,而我的只是上溢中断,所以最初没特别注意。后来试了下发现问题就在这里。欢迎知道原因的人在这里指点下。当然等我忙过这几天再回来琢磨下。再次申明我不是那种藏着掖着的人,当时解决了我立马在我所在的QQ群说明原因。
  /*不明白干嘛的,但Tim1必须设置这句,否则Tim走时慢100倍*/
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0 ;


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

199

帖子

1

粉丝