搜索
bottom↓
回复: 15

MSP430F4152定时器问题:外接8MHz晶振,理论上应该产生1ms中断,为什么用示波器实际测试是

[复制链接]

出0入0汤圆

发表于 2011-5-12 12:23:58 | 显示全部楼层 |阅读模式
有如下简单的 MSP430F4152 程序:

//定时器0中断服务程序
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer0_IRQHandler(void)
{
  P7OUT ^= BIT(4);                            // Toggle P5.1
}

//主处理程序
void main(void)
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;

  //配置时钟系统,选择外部高频晶振
  FLL_CTL0 |= XTS_FLL;//LFTX1 mode select :High frequency mode
  while(FLL_CTL0 & XT1OF);//等待直到晶体稳定
  FLL_CTL1 |= (SELM0 + SELM1);// + FLL_DIV0 + FLL_DIV1);//MCLK Select :LFXT1CLK or VLO;ACLK8分频率
  
  //配置GPIO端口输入/输出状态
  P7DIR |=  BIT(4);//输出
  P7SEL &= ~BIT(4);//作为I/O口使用
  
  //配置定时计数器0
  TA0CTL   = TASSEL_2 + MC_1;//选择SMCLK、Up Mode
  TACCR0   = 8000;//8MHz外部晶振,产生1ms中断
  TA0CCTL0 = CCIE;//使能CCR0中断

  __bis_SR_register(GIE);//使能全局中断
  while(1)
  {
    //进入 LPM0 低功耗模式
    //__bis_SR_register(LPM0_bits + GIE);
  }
}

硬件使用MSP430F4152芯片,外接普通的HC49S封装的贴片8MHz晶振,执行如上的代码,理论上应该产生1ms中断,为什么用示波器实际测试是约2.35ms产生一次中断呢?谢谢

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2011-5-12 12:27:43 | 显示全部楼层
示波器测试 P7.4 输出的是方波,每个高电平或低电平的宽度都是约 2.35ms ,理论上应该是为 1ms 的,求各位大侠指点,谢谢!

出0入0汤圆

发表于 2011-5-12 12:41:44 | 显示全部楼层
430的IO速度很慢的,不知道是不是这个原因。

出0入0汤圆

 楼主| 发表于 2011-5-12 13:38:31 | 显示全部楼层
回复【2楼】spacefram
430的io速度很慢的,不知道是不是这个原因。
-----------------------------------------------------------------------

代码改成这样:
//*********************************************************************
uint8 dsladssdfsdfdsfa_1s;
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer0_IRQHandler(void)
{
  if(++dsladssdfsdfdsfa_1s > 200)
  { dsladssdfsdfdsfa_1s = 0;
    P7OUT ^= BIT(4);
  }
}
//*********************************************************************

示波器测试 P74 端口波形,高电平或低电平持续时间变为约 475ms

这应该可以说明,跟 I/O 速度无关了!

谢谢

出0入0汤圆

发表于 2011-5-12 13:59:21 | 显示全部楼层
你确认用的是外部晶振吗?判断一下标志位吧

不对 应该用个循环来判断

死循环

出0入0汤圆

 楼主| 发表于 2011-5-12 14:02:55 | 显示全部楼层
回复【5楼】jlhgold
你确认用的是外部晶振吗?判断一下标志位吧
不对 应该用个循环来判断
死循环
-----------------------------------------------------------------------

while(FLL_CTL0 & XT1OF);//等待直到晶体稳定

这就是标志位判断呀?谢谢

出0入0汤圆

发表于 2011-5-12 14:48:58 | 显示全部楼层
回复【6楼】gogocs  
-----------------------------------------------------------------------

没用过你这个型号

449好像不是这样的

一般用

  do                              // loop until flag is clear
  {
    FLL_CTL0 = FLL_CTL0 & ~XT2OF; // clear high freq oscillator fault flag
    for (i = 50000; i; i--);      // delay for crystal to start and FLL to lock
  }
  while (FLL_CTL0 & XT2OF);       // test high freq oscillator fault flag

f1/f2系列一般是这样的

  // Wait for xtal to stabilize
  do
  {
  IFG1 &= ~OFIFG;                           // Clear OSCFault flag
  for (clk = 0xFF; clk > 0; clk--);             // Time for flag to set
  }
  while ((IFG1 & OFIFG));                   // OSCFault flag still set?


直接while循环 会不会有bug?

建议用TI推荐的方法试试

出0入0汤圆

发表于 2011-5-12 14:54:33 | 显示全部楼层
顺便问一下 你这个是IAR的编译环境吗?

BIT(4)可以这样写?

出0入0汤圆

 楼主| 发表于 2011-5-12 17:10:40 | 显示全部楼层
回复【8楼】jlhgold
顺便问一下 你这个是iar的编译环境吗?
bit(4)可以这样写?
-----------------------------------------------------------------------

我有个宏定义:
#define BIT(a)                              (1<<a)

谢谢

出0入0汤圆

 楼主| 发表于 2011-5-12 19:35:37 | 显示全部楼层
将晶振换成32768的,时钟初始化部分代码换成如下:

  SCFI0 |= FN_4;                            // x2 DCO freq, 8MHz nominal DCO
  SCFQCTL = 121;                            // (121+1) x 32768 x 2 = 7.99 Mhz
  FLL_CTL0 |= DCOPLUS + XCAP11PF;           // DCO+ set so freq= xtal x D x N+1

再用示波器实际测试已经是约1ms产生一次中断了。
但为什么 8M 晶振用不了,还没找出问题出来,暂且就用 32768 的晶振吧! 希望有大侠能解决这个问题,谢谢了。

!!!!持续关注!!!!

出0入0汤圆

发表于 2011-5-17 16:31:31 | 显示全部楼层
会不会与外接8M的要加起振电容??

出0入0汤圆

发表于 2011-5-20 15:13:43 | 显示全部楼层
现在在用,只要接低速晶振就行的

出0入0汤圆

发表于 2011-5-20 16:39:29 | 显示全部楼层
你说的2.35ms产生一次中断是什么意思??

按照你的代码,每产生一次中断,p7.4都要翻转一下,即由 低电平——高电平  或 高电平——低电平,
实际上周期是你中断间隔的两倍,不知道你理解不,不妨画图看一下。

   ——      ——
   |   |    |    |
---     ——      ----
1ms 1ms  1ms ........

你用示波器检测的频率换成周期肯定是 2ms(2.35ms)啊!!!!!!!!!

说“430的IO速度很慢的”的人总是容易从对方找原因,而不先看看自己,多查datesheet吧

出0入0汤圆

 楼主| 发表于 2011-5-22 10:00:06 | 显示全部楼层
回复【11楼】guisi 柯护祥
会不会与外接8m的要加起振电容??

-----------------------------------------------------------------------

加发 12P 或 20P 电容都一样的结果,没用。。。谢谢

出0入0汤圆

 楼主| 发表于 2011-5-22 10:04:40 | 显示全部楼层
回复【13楼】cc1989summer 超哥
你说的2.35ms产生一次中断是什么意思??
按照你的代码,每产生一次中断,p7.4都要翻转一下,即由 低电平——高电平  或 高电平——低电平,
实际上周期是你中断间隔的两倍,不知道你理解不,不妨画图看一下。
   ——      ——
   |   |    |    |
---     ——      ----
1ms 1ms  1ms ........
你用示波器检测的频率换成周期肯定是 2ms(2.35ms)啊!!!!!!!!!
说“430的io速度很慢的”的人总是容易从对方找原因,而不先看看自己,多查datesheet吧

-----------------------------------------------------------------------

我所说的2.35ms是用示波器观察,高电平 或 低电平 的持续时间是 2.35ms,也就是说:
       ———        ———
      |      |      |      |
———        ———        ———
2.35ms 2.35ms 2.35ms ........

这个问题我在 1楼 也说明了吧?HOHO

谢谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-18 23:53

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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