求助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条回答
硫酸锌
2019-03-25 06:45
wanyisq 发表于 2016-7-7 09:13
首先你的两个时钟都设置的DCO时钟源  其次你也没有对DCO进行配置啊  16M的时钟哪来的?

问题解决了,主要是因为使用的芯片是MSP430F5438A,貌似和网上很多的例程是不一样的,很多的程序写进去直接提示各种宏定义没有。。所以程序也根本写不进去,更别说调试了。


  1.     UCSCTL6 |= XCAP_3;                                    // 配置晶振电容
复制代码
之后加了两句:
  1.     UCSCTL1 = DCORSEL_4;                                  // 选择DCO的范围
  2.     UCSCTL2 |= 240;                                       // 设置DCO频率为16M
复制代码

但也不能说解决了问题,因为我使用的晶振是16M的,然后设计了一次5W次机器周期的程序翻转P4.0的输出,也就是测试的输出方波周期是10W次机器周期的视角,

按理说DCORSEL_0、DCORSEL_1、DCORSEL_2、DCORSEL_3之类的应该是表示DCO时钟的1/2/3/4分频,或者是1/2/4/8分频才差不多,但是实际测试的结果为:

  1.   配置    - 输出频率 - DCO频率 - 分频
  2. DCORSEL_0 -   11Hz   -  1M     - 16
  3. DCORSEL_1 -   22Hz   -  2M     - 8
  4. DCORSEL_2 -   49Hz   -  5M     - 3.5??
  5. DCORSEL_3 -   92Hz   -  9M     - 11/6??
  6. DCORSEL_4 -  169Hz   - 16M     - 1
  7. DCORSEL_5 -  169Hz   - 16M     - 1
  8. DCORSEL_6 -    0Hz   -  0      - /
  9. DCORSEL_7 -    0Hz   -  0      - /
复制代码

且不说6、7为什么是0。。0、1对应的是1M和2M的频率还是好理解的,但是49Hz和92Hz是怎么出来的。。我就是在想不通了,169Hz对应的计算频率是16M,应该已经是电路的极限了,但是分2次频的话也应该是84Hz啊,92Hz是怎么来的?

一周热门 更多>

相关问题

    相关文章