【MSP430i2xx教程第二讲】时钟系统 & EUSCI_A_UART

[复制链接]
41998|276
112207301219 发表于 2015-4-8 12:34 来自手机 | 显示全部楼层
gaoyang9992006 发表于 2015-4-8 10:39
只提供了一条腿,可以是个时钟源电路都可以的。

在什么情况下用外部时钟比内部的好呢?还是所有情况下内部都更好?
112207301219 发表于 2015-4-8 12:37 来自手机 | 显示全部楼层
gaoyang9992006 发表于 2015-4-8 10:39
能独立产生时钟信号的都行,也可以是其他的单片机某个管脚。

刚刚看到,因为只有一个时钟输入管脚,所以晶振不行。再问一下,输入时钟信号有没有要求必须是方波啊?正弦行不?
jpd 发表于 2015-4-8 13:05 | 显示全部楼层
讲的不错,正好现在之前有一个项目,现在楼主讲的正好替我整理整理了知识,点赞
fjjjnk1234 发表于 2015-4-8 16:14 | 显示全部楼层
112207301219 发表于 2015-4-8 12:37
刚刚看到,因为只有一个时钟输入管脚,所以晶振不行。再问一下,输入时钟信号有没有要求必须是方波啊?正 ...

个人认为正弦波也是可以的,数字信号需要区分的是0和1,能区分高低电平就行,方波和正弦波只要振动频率相同,对时钟电路来说没有区别。
fjjjnk1234 发表于 2015-4-8 16:24 | 显示全部楼层
112207301219 发表于 2015-4-8 12:34
在什么情况下用外部时钟比内部的好呢?还是所有情况下内部都更好?

这个得看MSP430的不同系列吧,像这个系列只有一个时钟输入引脚,看来官方是不建议使用外部晶振的,DCOCLK是MSP430微控制器自身认为是最可靠的时钟源,另外设计时钟电路使设计变得复杂,使用DCOCLK还能节约成本,何乐而不为呢?
必胜客A 发表于 2015-4-8 21:14 | 显示全部楼层
发送LED_ON字符串点亮接收MCULED,发送LED_OFF,关闭接收MCULED,发送LED_TEST字符串,返回当前的LED状态
  1. //引用的库
  2. #include "driverlib.h"
  3. //需要传输的字符和LED状态变量
  4. volatile uint8_t TXDataOne[8] = "LED_OFF";
  5. volatile uint8_t TXDataTwo[8] = "LED_ON";
  6. volatile uint8_t TXDataThree[8] = "LED_TEST";
  7. volatile uint8_t RXData[8];
  8. volatile uint8_t LEDState=0;
  9. //配置UART和设置LED相对应的IO口
  10. void Configuration()
  11. {
  12.             //波特率为115200 使用的是SMCLK时钟为16.384MHz
  13.             EUSCI_A_UART_initParam uartConfig = {
  14.                 EUSCI_A_UART_CLOCKSOURCE_SMCLK,          // SMCLK Clock Source
  15.                 8,                                       // BRDIV = 8
  16.                 14,                                      // UCxBRF = 14
  17.                 34,                                      // UCxBRS = 34
  18.                 EUSCI_A_UART_NO_PARITY,                  // No Parity
  19.                 EUSCI_A_UART_MSB_FIRST,                  // MSB First
  20.                 EUSCI_A_UART_ONE_STOP_BIT,               // One stop bit
  21.                 EUSCI_A_UART_MODE,                       // UART mode
  22.                 EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION  // Oversampling Baudrate
  23.             };

  24.             // Setting the DCO to use the internal resistor. DCO will be at 16.384MHz
  25.             CS_setupDCO(CS_INTERNAL_RESISTOR);

  26.             // SMCLK should be same speed as DCO. SMCLK = 16.384MHz
  27.             CS_initClockSignal(CS_SMCLK, CS_CLOCK_DIVIDER_1);

  28.             // Settings P1.2 and P1.3 as UART pins. P1.4 as LED output
  29.             //设置P1.2和P1.3作为UART引脚,P1.4位LED管脚
  30.             GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P1,
  31.                                                        GPIO_PIN2 | GPIO_PIN3,
  32.                                                        GPIO_PRIMARY_MODULE_FUNCTION);
  33.             GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN4);
  34.             GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN4);

  35.             //使能中断
  36.             EUSCI_A_UART_init(EUSCI_A0_BASE, &uartConfig);
  37.             EUSCI_A_UART_enable(EUSCI_A0_BASE);

  38.             EUSCI_A_UART_enableInterrupt(EUSCI_A0_BASE,
  39.                                          EUSCI_A_UART_RECEIVE_INTERRUPT);
  40. }
  41. int main(void) {
  42. WDT_hold(WDT_BASE);
  43.     uint8_t i=0;
  44.     Configuration();
  45.     //发送字符
  46.     while(1)
  47.     {
  48.             for(i=0;i<9;i++)
  49.         EUSCI_A_UART_transmitData(EUSCI_A0_BASE, TXDataOne[i]);
  50.         __delay_cycles(500000);
  51.         for(i=0;i<9;i++)
  52.         EUSCI_A_UART_transmitData(EUSCI_A0_BASE, TXDataTwo[i]);
  53.         __delay_cycles(500000);
  54.         for(i=0;i<9;i++)
  55.         EUSCI_A_UART_transmitData(EUSCI_A0_BASE, TXDataThree[i]);
  56.         __delay_cycles(500000);
  57.     }
  58. }

  59. #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
  60. #pragma vector=USCI_A0_VECTOR
  61. __interrupt
  62. #elif defined(__GNUC__)
  63. __attribute__((interrupt(USCI_A0_VECTOR)))
  64. #endif
  65. void USCI_A0_ISR(void) {
  66.          uint8_t i=0;
  67.     switch(__even_in_range(UCA0IV, USCI_UART_UCTXCPTIFG))
  68.     {
  69.     case USCI_NONE: break;
  70.     case USCI_UART_UCRXIFG:
  71.             for(i=0;i<9;i++)
  72.         RXData[i] = EUSCI_A_UART_receiveData(EUSCI_A0_BASE);

  73. //检查字符,如果接收到的,是LED_ON字符串点亮接收MCU的LED,是LED_OFF,关闭接收MCU的LED,是LED_TEST字符串返回当前的LED状态
  74.         if(RXData == "LED_ON")
  75.         {
  76.             GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN4);
  77.             LEDState=1;
  78.         }
  79.         else if(RXData == "LED_OFF")
  80.                 {
  81.                    GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN4);
  82.                    LEDState=0;
  83.              }
  84.         else if(RXData == "LED_TEST")
  85.         {
  86.                 EUSCI_A_UART_transmitData(EUSCI_A0_BASE, LEDState);
  87.         }
  88.         else break;
  89.     case USCI_UART_UCTXIFG: break;
  90.     case USCI_UART_UCSTTIFG: break;
  91.     case USCI_UART_UCTXCPTIFG: break;
  92.     default: break;
  93.     }
  94. }


112207301219 发表于 2015-4-8 21:34 来自手机 | 显示全部楼层
fjjjnk1234 发表于 2015-4-8 16:24
这个得看MSP430的不同系列吧,像这个系列只有一个时钟输入引脚,看来官方是不建议使用外部晶振的,DCOCLK ...

你的意思是时钟输入只是个摆设,就连一种用它更合适的可能性都没有?这也太摆设了吧。
112207301219 发表于 2015-4-8 21:39 来自手机 | 显示全部楼层
fjjjnk1234 发表于 2015-4-8 16:14
个人认为正弦波也是可以的,数字信号需要区分的是0和1,能区分高低电平就行,方波和正弦波只要振动频率相 ...

应该是这样的,只要振幅够了就行了
lark100 发表于 2015-4-8 22:55 | 显示全部楼层
作业: 发送LED_ON字符串点亮接收MCU的LED,发送LED_OFF,关闭接收MCU的LED,发送LED_TEST字符串,返回当前的LED状态。
// 设置P1.2和P1.3管脚作为UART管脚。P1.4 管脚作为LED输出
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P1, GPIO_PIN2 | GPIO_PIN3, GPIO_PRIMARY_MODULE_FUNCTION);
GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN4);
GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN4);
// 配置和使能UART外设
EUSCI_A_UART_ init(EUSCI_A0_BASE, &uartConfig);
EUSCI_A_UART_ enable(EUSCI_A0_BASE);

EUSCI_A_UART_ transmitData(EUSCI_A0_BASE, LED_ON);
while(EUSCI_A_UART_receiveData (EUSCI_A0_BASE)=="LED_ON")
{
GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN4);
break;
}
EUSCI_A_UART_ transmitData(EUSCI_A0_BASE, LED_OFF);
while(EUSCI_A_UART_receiveData (EUSCI_A0_BASE)=="LED_OFF")
{
GPIO_setOutputLowOnPin (GPIO_PORT_P1, GPIO_PIN4);
break;
}
EUSCI_A_UART_ transmitData(EUSCI_A0_BASE, LED_TEST);
while(EUSCI_A_UART_receiveData (EUSCI_A0_BASE)=="LED_TEST")
{
EUSCI_A_UART_ transmitData(EUSCI_A0_BASE, GPIO_getInputPinValue (GPIO_PORT_P1, GPIO_PIN4));
break;
}
数码小叶 发表于 2015-4-9 08:23 | 显示全部楼层
112207301219 发表于 2015-4-8 21:34
你的意思是时钟输入只是个摆设,就连一种用它更合适的可能性都没有?这也太摆设了吧。 ...

不是,是让你输入时钟信号,不是直接上晶振,增加可靠性,工业应用么,怎么能说是摆设呢:lol:lol
wejoncy 发表于 2015-4-9 08:56 | 显示全部楼层
430的低功耗,对编程风格是有要求的啊,跟以前不太一样
112207301219 发表于 2015-4-9 11:15 | 显示全部楼层
数码小叶 发表于 2015-4-9 08:23
不是,是让你输入时钟信号,不是直接上晶振,增加可靠性,工业应用么,怎么能说是摆设呢 ...

我就是想要个例子嘛,都说的概念上的东西,这个都知道
数码小叶 发表于 2015-4-9 13:44 | 显示全部楼层
112207301219 发表于 2015-4-9 11:15
我就是想要个例子嘛,都说的概念上的东西,这个都知道

这哪是概念,最简单你直接接个信号源不就可以了,不会说信号源还是个概念吧,你总用过吧:o:o:o
数码小叶 发表于 2015-4-9 13:46 | 显示全部楼层
wejoncy 发表于 2015-4-9 08:56
430的低功耗,对编程风格是有要求的啊,跟以前不太一样

你要是用的ccs的话,会给你自动优化,还有低功耗规则,也可以自己选择要哪几条;P;P;P
734774645 发表于 2015-4-9 15:20 | 显示全部楼层
anvy178 发表于 2015-4-3 09:31
你选择11 还是smclk的意思  就是说 11 10  都是smclk

是啊,只要高位是1,就行,其实可以写作:1x
734774645 发表于 2015-4-9 15:22 | 显示全部楼层
hanzhenfei 发表于 2015-4-3 18:53
写得很好很详细,完整的看了下,赞

一起跟版主教程学习,既可以拿到奖品,又可以学到这么有用的知识,终于知道,430也可以用库函数开发了,还是中文版的教程,比原版的英文好懂多了。
112207301219 发表于 2015-4-10 09:28 来自手机 | 显示全部楼层
数码小叶 发表于 2015-4-9 13:44
这哪是概念,最简单你直接接个信号源不就可以了,不会说信号源还是个概念吧,你总用过吧 ...

不好意思,我不知道你有没有看到我提的那个问题。我想你可能不了解我的意思,我问的是有没有一种情况用外部时钟输入比内部的更适合,而不是说有没有用外部时钟输入的例子。我也只是一时好奇,讲了那么多内部时钟的好,而且官方也不推荐使用外部时钟,所以提了一下这个问题,想了解既然绝大多数情况下内部时钟更合适,那么什么情况下或者说有没有一种情况下外部时钟更合适呢?好了,我们不要再纠结这个问题了。可能是我这个问题提的不好,给你添麻烦了。

zhujun615 发表于 2015-4-10 11:31 | 显示全部楼层
http://blog.csdn.net/cs_ing/article/details/8526327 是按照韦东山老师的《嵌入式linux应用开发完全手册》来学习... 本次实验主要涉及四个方面:
1、设置启动MPLL
2、根据HCLK设置存储控制器
3、初始化定时器0
4、定时器中断

louyj 发表于 2015-4-10 16:06 | 显示全部楼层
很好的教程,虽然没有板子,先学习一下。
U201015703 发表于 2015-4-14 18:53 | 显示全部楼层
学习                           
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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