求助msp430机器周期设置的问题?

2019-03-24 09:11发布

  1. #include  <msp430x54x.h>

  2. unsigned int results[5];                                          // 转换值存取变量

  3. long fliter0(long *, int);

  4. void main(void)
  5. {
  6.   int cnt = 0;
  7.   unsigned int i;
  8.   WDTCTL = WDTPW+WDTHOLD;                                         // 关闭看门狗
  9.   P7SEL |= 0x03;                                                  // 使能时钟端口
  10.   UCSCTL6 |= XCAP_3;                                              // 配置晶振电容
  11.   UCSCTL7 &= ~(XT1LFOFFG + DCOFFG);                               // 清除失效标志位
  12.   SFRIFG1 &= ~OFIFG;                                              // 清除失效中断标志位
  13.   UCSCTL4 = SELM__DCOCLK + SELS__DCOCLK;                          // 选择时钟源
  14.   //UCSCTL4 = SELM_7 + SELS_2;                                    // 选择时钟源
  15.   
  16.   P6DIR &= ~(BIT1 + BIT2 + BIT3);                                 // P6.7口A7输入
  17.   P6SEL |=  (BIT1 + BIT2 + BIT3);                                 // P7口第二功能

  18.   P4DIR |= BIT0;
  19.   P4DIR |= BIT1;
  20.   P4DIR |= BIT2;
  21.   
  22.   ADC12CTL2 = ADC12RES_2 + ADC12REFOUT;                           // AD基本配置
  23.   ADC12CTL0 = ADC12ON + ADC12MSC + ADC12SHT01 + ADC12REFON + ADC12REF2_5V;                                       
  24.   ADC12MCTL0 |= ADC12INCH_1;                                      // 通道1输入
  25.   ADC12MCTL1 |= ADC12INCH_2;                                      // 通道2输入
  26.   ADC12MCTL2 |= ADC12INCH_3;                                      // 通道3输入
  27.   ADC12MCTL3 |= ADC12INCH_2;                                      // 通道2输入
  28.   ADC12MCTL4 |= ADC12INCH_3 + ADC12EOS;                           // 通道3输入
  29.   ADC12CTL1 = ADC12SHP + ADC12CONSEQ_3;                           // 选择转换模式                  
  30.   for (i=0;i<0xFFFF;i++);                                         // 等待基准电压建立                       
  31.   UCSCTL8 |= MODOSCREQEN;  
  32.   ADC12IE |= 0X08;                                                // 使能通道4中断
  33.   ADC12CTL0 |= ADC12ENC;                                          // 开启转换
  34.   _EINT();                                                        // 打开总中断
  35.   ADC12CTL0 |= ADC12SC;                                           // 转换开始
  36.   LPM3;                                                           // 进入低功耗3
  37.   
  38. }

  39. #pragma vector = ADC12_VECTOR
  40. __interrupt void ADC12ISR(void)
  41. {
  42.   
  43.         unsigned int i;
  44.         unsigned int j;

  45.         results[0] = ADC12MEM0;                                         // 保存第一通道值
  46.         results[1] = ADC12MEM1;                                         // 保存第二通道值
  47.         results[2] = ADC12MEM2;                                         // 保存第三通道值
  48.         results[3] = ADC12MEM3;                                         // 保存第四通道值
  49.         results[4] = ADC12MEM4;                                         // 保存第五通道值
  50.   
  51.   /*
  52.         程序部分
  53.   */
  54.   
  55.         P4OUT ^=  BIT0;
  56.         for(i = 0; i < 10000; i++);

  57. }
复制代码

主程序部分就不写了,我通过for(i = 0; i < 10000; i++);完成之后翻转P4.0的方式来估计计算的时间,程序运行实际输出方波频率21Hz,for语句一次累加是5个机器周期,那么计算频率为:21*2**5*10000=2MHz,但是我用的是16M的晶振啊,我的程序为什么这么慢啊(只有AD12的话输出是10kHz,也不是AD的时间太长),分频什么的设置我不懂啊,我就想程序的计算频率再高一点,那么我应该怎么设置啊? 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
wanyisq
2019-03-24 18:59
硫酸锌 发表于 2016-7-8 17:25
问题解决了,主要是因为使用的芯片是MSP430F5438A,貌似和网上很多的例程是不一样的,很多的程序写进去直 ...

具体的用法我不太清楚  但是DCO本身也是不准确的  你可以选择使用16M外部晶振在测试一下

一周热门 更多>

相关问题

    相关文章