[MSP-EXP430F5529LP] 定时器接收数据的疑惑

[复制链接]

1

主题

3

帖子

76

积分

一粒轻沙

Rank: 1

积分
76
查看: 317回复: 2 发表于 2021-8-5 20:42:58   只看该作者
求助 想用编码电机实现测速功能,设想是用定时器测频率,看教程和例程自己弄了代码出来,但是单片机死活无法接收。教程是看的其他芯片,怀疑是不是换成了f5529后我自己少设置了什么东西。编码电机没问题,不用定时器中断的时候,输出的PWM波和串口输出都没问题,开启定时器中断后,接收不了中断,PWM波也很不正常,串口发送不了数据。

程序如下:

  1. #include "msp430.h"

  2. #include "stdint.h"
  3. #include <stdio.h>
  4.   int j=1,k=0,l=1;

  5. void InitSystemClock(void)
  6. {
  7.   P5SEL |= BIT2|BIT3; //将IO配置为XT2功能  
  8.   UCSCTL6 &= ~XT2OFF; //使能XT2  
  9.   
  10.   UCSCTL4 = UCSCTL4&(~(SELA_7))|SELA_1; //先将ACLK配置为VLOCLK  
  11.   UCSCTL3 |= SELREF_2;                  //将REFCLK配置为REFCLK  
  12.   
  13.   while (SFRIFG1 & OFIFG){  
  14.     UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);         // 清除三类时钟标志位  
  15.                               // 这里需要清除三种标志位,因为任何一种  
  16.                               // 标志位都会将OFIFG置位  
  17.     SFRIFG1 &= ~OFIFG;                                  // 清除时钟错误标志位  
  18.   }  
  19.   UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_5|SELM_5;     //将SMCLK和MCLK时钟源配置为XT2  
  20.   UCSCTL5 |= DIVS_2;
  21. }
  22. void InitUART(void)
  23. {
  24.     /*复位USCI_Ax*/
  25.     UCA0CTL1 |= UCSWRST;

  26.     /*选择USCI_Ax为UART模式*/
  27.     UCA0CTL0 &= ~UCSYNC;

  28.     /*配置UART时钟源为SMCLK*/
  29.     UCA0CTL1 |= UCSSEL1;

  30.     /*配置波特率为9600@1MHz*/
  31.     UCA0BR0 = 0x68;
  32.     UCA0BR1 = 0x00;
  33.     UCA0MCTL = 1 << 1;
  34.     /*使能端口复用*/
  35.     P3SEL |= BIT3 + BIT4;
  36.      P3DIR |= BIT4;
  37.      P3DIR &= ~BIT3;
  38.     /*清除复位位,使能UART*/
  39.     UCA0CTL1 &= ~UCSWRST;
  40. }

  41. void UARTSendString(uint8_t *pbuff,uint8_t num)
  42. {
  43.         uint8_t cnt = 0;
  44.         for(cnt = 0;cnt < num;cnt ++)
  45.         {
  46.                 while(UCA0STAT & UCBUSY);
  47.                 UCA0TXBUF = *(pbuff + cnt);
  48.         }
  49. }

  50. void PrintFreq(float freq)
  51. {
  52.         uint32_t temp = (uint32_t)(freq * 1000);
  53.         uint8_t charbuff[] = {0,0,0,0,0,0,0,0,0};//最大999999.999Hz
  54.         int8_t cnt = 0;
  55.         for(cnt = 8;cnt >= 0;cnt --)
  56.         {
  57.                 charbuff[cnt] = (uint8_t)(temp % 10) + '0';
  58.                 temp /= 10;
  59.         }
  60.         UARTSendString("频率为:",8);
  61.         UARTSendString(charbuff,6);
  62.         UARTSendString(".",1);
  63.         UARTSendString(charbuff + 6,3);
  64.         UARTSendString("Hz",2);
  65. }

  66. void main()
  67. {   
  68.   WDTCTL = WDTPW | WDTHOLD;
  69.   InitSystemClock();
  70.   InitUART();
  71.   
  72.     P4DIR |= BIT7;
  73.     P4OUT |= BIT7;
  74.    
  75.    /*设置时钟源为SMCLK*/
  76.     TA0CTL |= TASSEL_2;
  77.     /*设置工作模式为Up Mode*/
  78.     TA0CTL |= MC1;
  79.     /*设置定时间隔*/
  80.     TA0CCR0 = 49999;//50ms
  81.     /*开启TAIFG中断*/
  82.     TA0CTL |= TAIE;

  83.     /*捕捉功能*/
  84.     TA0CCTL2 |= CAP;
  85.     TA0CCTL1 |= CAP;
  86.     /*上升沿捕捉*/
  87.     TA0CCTL1 |= CM_2;
  88.    
  89.     TA0CCTL2 |= CM_2;
  90.     TA0CCTL1 |= SCS;
  91.     TA0CCTL2 |= SCS;
  92.     /*捕捉输入*/
  93.     TA0CCTL1 |= CCIS1;
  94.     TA0CCTL2 |= CCIS1;
  95.     P1SEL |= BIT2+BIT3;
  96.     P1DIR &= ~(BIT2+BIT3);
  97.     /*允许捕捉比较中断*/
  98.     TA2CCTL2 |= CCIE;//输入2口
  99.     TA2CCTL1 |= CCIE;//1口
  100.     _EINT();

  101.   while(1)
  102.   {

  103.     PrintFreq(j);
  104.     PrintFreq(k);
  105.     PrintFreq(l);
  106.     __delay_cycles(5000000);

  107.   }

  108. }



  109. #pragma vector = TIMER0_A1_VECTOR
  110. __interrupt void Time_Tick(void)
  111. {
  112.        
  113.          __bis_SR_register(GIE);
  114.         switch(TA0IV)
  115.         {
  116.         case 0x02://1口
  117.                   l^=l;
  118.                   j ^= j;
  119.           break;
  120.         case 0x04://2口
  121.                
  122.                 P4OUT ^= BIT7;
  123.                 break;
  124.         case 0x0A://溢出
  125.                
  126.           k+=1;
  127.                 break;
  128.         default:
  129.                 break;
  130.         }
  131. }
复制代码

70

主题

434

帖子

914

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
914
发表于 2021-8-10 10:20:08   只看该作者
建议类似的问题,先描述下你的思路。 用了哪些资源,做什么用途。 不然,看代码太费精力了

1

主题

3

帖子

76

积分

一粒轻沙

Rank: 1

积分
76
发表于 2021-8-24 14:09:21   只看该作者
之后换了用外部中断来测频率,外部中断P1.2口输入模式,编码电机每来一个波就进入中断,中断里变量加一,主函数就死循环,延时函数每隔一秒把中断的变量按编码电机给的说明书计算一次,得出的速度送出串口显示。一开始也和定时器一样不行,但是最后把上拉电阻换成下拉电阻之后就可以了。试出来的,不知道为什么。
快速回复 返回顶部 返回列表