劳驾一次版主帮忙看看

[复制链接]
3095|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.
  1. void RCC_cfg(void)
  2. {
  3.         //定义错误状态变量
  4.         ErrorStatus HSEStartUpStatus;

  5.         //将RCC寄存器重新设置为默认值
  6.         RCC_DeInit();        
  7. /*        //打开外部高速时钟晶振25Mhz*/
  8.         RCC_HSEConfig(RCC_HSE_ON);
  9. //        RCC_GetSYSCLKSource();        
  10.         //等待外部高速时钟晶振工作
  11.         HSEStartUpStatus = RCC_WaitForHSEStartUp();
  12.         if(HSEStartUpStatus == SUCCESS)               
  13.         {
  14. //                RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
  15.                 /*使用PLL时钟时钟源为HSE,PLL时钟频率50MHZ  HSE x2*/
  16.                 RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_2);                                
  17.                 RCC_PLLCmd(ENABLE);        
  18.                 /*设置AHB时钟为HCLK时钟  未分频=50Mhz*/
  19.                 RCC_HCLKConfig(RCC_SYSCLK_Div1);               
  20.                 /*设置高速AHB时钟(APB2)为HCLK时钟 =50Mhz*/               
  21.                 RCC_PCLK2Config(RCC_HCLK_Div1);                                
  22.                 /*设置低速AHB时钟(APB1)为HCLK时钟 =25Mhz*/                                
  23.                 RCC_PCLK1Config(RCC_HCLK_Div2);                                                
  24.                                                 
  25.                 while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);                        
  26.                         
  27.                 //设置PLL为系统时钟源                                
  28.                 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);               
  29.                 //判断PLL是否是系统时钟                                
  30.                 while(RCC_GetSYSCLKSource() != 0x08);
  31.         
  32.         }                        
  33.         //打开GPIO时钟,复用功能,串口1的时钟               
  34.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1, ENABLE);
  35. }
  1. {
  2.           TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  3.         uint32_t a,b;

  4.   /* TIM5 clock enable */
  5.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
  6.   
  7.   /* ---------------------------------------------------------------
  8.     TIM4 Configuration: Output Compare Timing Mode:
  9.     TIM2CLK = 36 MHz, Prescaler = 7200, TIM2 counter clock = 7.2 MHz
  10.   --------------------------------------------------------------- */

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

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

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

  27.   /* TIM5 enable counter */
  28.   TIM_Cmd(TIM1, ENABLE);  //计数器使能,开始工作
  29.   
  30.                   a=TIM1->CR1;        
  31.                 b=a+b;
  32. }
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 | 显示全部楼层
定时器配置好像没问题。你可以看下时钟树,查时钟配置。
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的宏定义
这样试试
 楼主| 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 表明 这个方法是可行的
  1. #ifndef STM32F10X_CL
  2. #define RCC_PLLMul_2                    ((uint32_t)0x00000000)
  3. #define RCC_PLLMul_3                    ((uint32_t)0x00040000)
  4. #define RCC_PLLMul_4                    ((uint32_t)0x00080000)
  5. #define RCC_PLLMul_5                    ((uint32_t)0x000C0000)
  6. #define RCC_PLLMul_6                    ((uint32_t)0x00100000)
  7. #define RCC_PLLMul_7                    ((uint32_t)0x00140000)
  8. #define RCC_PLLMul_8                    ((uint32_t)0x00180000)
  9. #define RCC_PLLMul_9                    ((uint32_t)0x001C0000)
  10. #define RCC_PLLMul_10                   ((uint32_t)0x00200000)
  11. #define RCC_PLLMul_11                   ((uint32_t)0x00240000)
  12. #define RCC_PLLMul_12                   ((uint32_t)0x00280000)
  13. #define RCC_PLLMul_13                   ((uint32_t)0x002C0000)
  14. #define RCC_PLLMul_14                   ((uint32_t)0x00300000)
  15. #define RCC_PLLMul_15                   ((uint32_t)0x00340000)
  16. #define RCC_PLLMul_16                   ((uint32_t)0x00380000)
  17. #define IS_RCC_PLL_MUL(MUL) (((MUL) == RCC_PLLMul_2) || ((MUL) == RCC_PLLMul_3)   || \
  18.                               ((MUL) == RCC_PLLMul_4) || ((MUL) == RCC_PLLMul_5)   || \
  19.                               ((MUL) == RCC_PLLMul_6) || ((MUL) == RCC_PLLMul_7)   || \
  20.                               ((MUL) == RCC_PLLMul_8) || ((MUL) == RCC_PLLMul_9)   || \
  21.                               ((MUL) == RCC_PLLMul_10) || ((MUL) == RCC_PLLMul_11) || \
  22.                               ((MUL) == RCC_PLLMul_12) || ((MUL) == RCC_PLLMul_13) || \
  23.                               ((MUL) == RCC_PLLMul_14) || ((MUL) == RCC_PLLMul_15) || \
  24.                               ((MUL) == RCC_PLLMul_16))

  25. #else
  26. #define RCC_PLLMul_2                    ((uint32_t)0x00000000)

  27. #define RCC_PLLMul_4                    ((uint32_t)0x00080000)
  28. #define RCC_PLLMul_5                    ((uint32_t)0x000C0000)
  29. #define RCC_PLLMul_6                    ((uint32_t)0x00100000)
  30. #define RCC_PLLMul_7                    ((uint32_t)0x00140000)
  31. #define RCC_PLLMul_8                    ((uint32_t)0x00180000)
  32. #define RCC_PLLMul_9                    ((uint32_t)0x001C0000)
  33. #define RCC_PLLMul_6_5                  ((uint32_t)0x00340000)


 楼主| ff8zgs 发表于 2013-2-21 20:00 | 显示全部楼层
uet_cache 发表于 2013-2-21 19:40
定时器配置好像没问题。你可以看下时钟树,查时钟配置。

时钟树看过了没有问题,这段代码是在Tim5 上改过来的,只是把tim5改成了Tim1而已,当然时钟和中断服务业相应修改了
610095871 发表于 2013-2-21 20:10 | 显示全部楼层
lz还是好好看看互联性的参考手册吧。
 楼主| ff8zgs 发表于 2013-2-21 20:24 | 显示全部楼层
610095871 发表于 2013-2-21 20:10
lz还是好好看看互联性的参考手册吧。

刚才我试了用HIS/2做系统系统时钟,但中断相差100倍还是存在。所以这个方法本身应该没有问题,STM32互联型,应该是使用功能来划分的,107 如果没使用网络和usb应该和普通的设备一样。所以可以让系统时钟低于25Mhz,而如果需要使用互联功能就必须高于25Mhz,所以如果外部时钟8Mhz,必须是4倍以上。不知道我这么理解有没有错误。
 楼主| ff8zgs 发表于 2013-2-22 08:35 | 显示全部楼层
乖乖 都要 沉下去了。。。。。还没解决方案呢
gongyuan073 发表于 2013-2-22 09:10 | 显示全部楼层
帮顶啊 期待接待
 楼主| ff8zgs 发表于 2013-2-22 10:41 | 显示全部楼层
已经绝望了,debug看每一个寄存器都是正确的,主要RCC和TIm1 的寄存器如下图
dddjpg.jpg
未反反复复命名.jpg
 楼主| ff8zgs 发表于 2013-2-22 12:42 | 显示全部楼层
求大侠啊求大侠,给小弟我指个方向也好啊
JasonWangFAE 发表于 2013-2-22 13:17 | 显示全部楼层
I think you can check "HSE_VALUE" this value in the stm32f10x.h file .
 楼主| 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 .

问题已解决了,和那个 头文件无关系。
虽然原因 我还是有点不能接受 但问题解决,
ocon 发表于 2013-2-22 18:57 | 显示全部楼层
ff8zgs 发表于 2013-2-22 13:21
问题已解决了,和那个 头文件无关系。
虽然原因 我还是有点不能接受 但问题解决, ...

电工最恶劣的陋习,就是在求助的时候希望所有人都热心来帮你,一旦问题解决,却不肯公开,藏着掖着,生怕被人偷了去。
hawksabre 发表于 2013-2-22 20:10 | 显示全部楼层
顶一个   问题是什么  楼主   说一下
 楼主| ff8zgs 发表于 2013-2-22 20:53 | 显示全部楼层
本帖最后由 ff8zgs 于 2013-2-22 20:56 编辑
ocon 发表于 2013-2-22 18:57
电工最恶劣的陋习,就是在求助的时候希望所有人都热心来帮你,一旦问题解决,却不肯公开,藏着掖着,生怕 ...

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


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

本版积分规则

18

主题

199

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部