打印

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

[复制链接]
楼主: xlhtracy
手机看帖
扫描二维码
随时随地手机跟帖
241
gaoyang9992006 发表于 2015-4-8 10:39
只提供了一条腿,可以是个时钟源电路都可以的。

在什么情况下用外部时钟比内部的好呢?还是所有情况下内部都更好?

使用特权

评论回复
242
112207301219| | 2015-4-8 12:37 | 只看该作者
gaoyang9992006 发表于 2015-4-8 10:39
能独立产生时钟信号的都行,也可以是其他的单片机某个管脚。

刚刚看到,因为只有一个时钟输入管脚,所以晶振不行。再问一下,输入时钟信号有没有要求必须是方波啊?正弦行不?

使用特权

评论回复
243
jpd| | 2015-4-8 13:05 | 只看该作者
讲的不错,正好现在之前有一个项目,现在楼主讲的正好替我整理整理了知识,点赞

使用特权

评论回复
244
fjjjnk1234| | 2015-4-8 16:14 | 只看该作者
112207301219 发表于 2015-4-8 12:37
刚刚看到,因为只有一个时钟输入管脚,所以晶振不行。再问一下,输入时钟信号有没有要求必须是方波啊?正 ...

个人认为正弦波也是可以的,数字信号需要区分的是0和1,能区分高低电平就行,方波和正弦波只要振动频率相同,对时钟电路来说没有区别。

使用特权

评论回复
245
fjjjnk1234| | 2015-4-8 16:24 | 只看该作者
112207301219 发表于 2015-4-8 12:34
在什么情况下用外部时钟比内部的好呢?还是所有情况下内部都更好?

这个得看MSP430的不同系列吧,像这个系列只有一个时钟输入引脚,看来官方是不建议使用外部晶振的,DCOCLK是MSP430微控制器自身认为是最可靠的时钟源,另外设计时钟电路使设计变得复杂,使用DCOCLK还能节约成本,何乐而不为呢?

使用特权

评论回复
246
必胜客A| | 2015-4-8 21:14 | 只看该作者
发送LED_ON字符串点亮接收MCULED,发送LED_OFF,关闭接收MCULED,发送LED_TEST字符串,返回当前的LED状态
//引用的库
#include "driverlib.h"
//需要传输的字符和LED状态变量
volatile uint8_t TXDataOne[8] = "LED_OFF";
volatile uint8_t TXDataTwo[8] = "LED_ON";
volatile uint8_t TXDataThree[8] = "LED_TEST";
volatile uint8_t RXData[8];
volatile uint8_t LEDState=0;
//配置UART和设置LED相对应的IO口
void Configuration()
{
            //波特率为115200 使用的是SMCLK时钟为16.384MHz
            EUSCI_A_UART_initParam uartConfig = {
                EUSCI_A_UART_CLOCKSOURCE_SMCLK,          // SMCLK Clock Source
                8,                                       // BRDIV = 8
                14,                                      // UCxBRF = 14
                34,                                      // UCxBRS = 34
                EUSCI_A_UART_NO_PARITY,                  // No Parity
                EUSCI_A_UART_MSB_FIRST,                  // MSB First
                EUSCI_A_UART_ONE_STOP_BIT,               // One stop bit
                EUSCI_A_UART_MODE,                       // UART mode
                EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION  // Oversampling Baudrate
            };

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

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

            // Settings P1.2 and P1.3 as UART pins. P1.4 as LED output
            //设置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);

            //使能中断
            EUSCI_A_UART_init(EUSCI_A0_BASE, &uartConfig);
            EUSCI_A_UART_enable(EUSCI_A0_BASE);

            EUSCI_A_UART_enableInterrupt(EUSCI_A0_BASE,
                                         EUSCI_A_UART_RECEIVE_INTERRUPT);
}
int main(void) {
WDT_hold(WDT_BASE);
    uint8_t i=0;
    Configuration();
    //发送字符
    while(1)
    {
            for(i=0;i<9;i++)
        EUSCI_A_UART_transmitData(EUSCI_A0_BASE, TXDataOne[i]);
        __delay_cycles(500000);
        for(i=0;i<9;i++)
        EUSCI_A_UART_transmitData(EUSCI_A0_BASE, TXDataTwo[i]);
        __delay_cycles(500000);
        for(i=0;i<9;i++)
        EUSCI_A_UART_transmitData(EUSCI_A0_BASE, TXDataThree[i]);
        __delay_cycles(500000);
    }
}

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=USCI_A0_VECTOR
__interrupt
#elif defined(__GNUC__)
__attribute__((interrupt(USCI_A0_VECTOR)))
#endif
void USCI_A0_ISR(void) {
         uint8_t i=0;
    switch(__even_in_range(UCA0IV, USCI_UART_UCTXCPTIFG))
    {
    case USCI_NONE: break;
    case USCI_UART_UCRXIFG:
            for(i=0;i<9;i++)
        RXData[i] = EUSCI_A_UART_receiveData(EUSCI_A0_BASE);

//检查字符,如果接收到的,是LED_ON字符串点亮接收MCU的LED,是LED_OFF,关闭接收MCU的LED,是LED_TEST字符串返回当前的LED状态
        if(RXData == "LED_ON")
        {
            GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN4);
            LEDState=1;
        }
        else if(RXData == "LED_OFF")
                {
                   GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN4);
                   LEDState=0;
             }
        else if(RXData == "LED_TEST")
        {
                EUSCI_A_UART_transmitData(EUSCI_A0_BASE, LEDState);
        }
        else break;
    case USCI_UART_UCTXIFG: break;
    case USCI_UART_UCSTTIFG: break;
    case USCI_UART_UCTXCPTIFG: break;
    default: break;
    }
}


使用特权

评论回复
247
112207301219| | 2015-4-8 21:34 | 只看该作者
fjjjnk1234 发表于 2015-4-8 16:24
这个得看MSP430的不同系列吧,像这个系列只有一个时钟输入引脚,看来官方是不建议使用外部晶振的,DCOCLK ...

你的意思是时钟输入只是个摆设,就连一种用它更合适的可能性都没有?这也太摆设了吧。

使用特权

评论回复
248
112207301219| | 2015-4-8 21:39 | 只看该作者
fjjjnk1234 发表于 2015-4-8 16:14
个人认为正弦波也是可以的,数字信号需要区分的是0和1,能区分高低电平就行,方波和正弦波只要振动频率相 ...

应该是这样的,只要振幅够了就行了

使用特权

评论回复
249
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;
}

使用特权

评论回复
250
数码小叶| | 2015-4-9 08:23 | 只看该作者
112207301219 发表于 2015-4-8 21:34
你的意思是时钟输入只是个摆设,就连一种用它更合适的可能性都没有?这也太摆设了吧。 ...

不是,是让你输入时钟信号,不是直接上晶振,增加可靠性,工业应用么,怎么能说是摆设呢:lol:lol

使用特权

评论回复
251
wejoncy| | 2015-4-9 08:56 | 只看该作者
430的低功耗,对编程风格是有要求的啊,跟以前不太一样

使用特权

评论回复
252
112207301219| | 2015-4-9 11:15 | 只看该作者
数码小叶 发表于 2015-4-9 08:23
不是,是让你输入时钟信号,不是直接上晶振,增加可靠性,工业应用么,怎么能说是摆设呢 ...

我就是想要个例子嘛,都说的概念上的东西,这个都知道

使用特权

评论回复
253
数码小叶| | 2015-4-9 13:44 | 只看该作者
112207301219 发表于 2015-4-9 11:15
我就是想要个例子嘛,都说的概念上的东西,这个都知道

这哪是概念,最简单你直接接个信号源不就可以了,不会说信号源还是个概念吧,你总用过吧:o:o:o

使用特权

评论回复
254
数码小叶| | 2015-4-9 13:46 | 只看该作者
wejoncy 发表于 2015-4-9 08:56
430的低功耗,对编程风格是有要求的啊,跟以前不太一样

你要是用的ccs的话,会给你自动优化,还有低功耗规则,也可以自己选择要哪几条;P;P;P

使用特权

评论回复
255
734774645| | 2015-4-9 15:20 | 只看该作者
anvy178 发表于 2015-4-3 09:31
你选择11 还是smclk的意思  就是说 11 10  都是smclk

是啊,只要高位是1,就行,其实可以写作:1x

使用特权

评论回复
256
734774645| | 2015-4-9 15:22 | 只看该作者
hanzhenfei 发表于 2015-4-3 18:53
写得很好很详细,完整的看了下,赞

一起跟版主教程学习,既可以拿到奖品,又可以学到这么有用的知识,终于知道,430也可以用库函数开发了,还是中文版的教程,比原版的英文好懂多了。

使用特权

评论回复
257
112207301219| | 2015-4-10 09:28 | 只看该作者
数码小叶 发表于 2015-4-9 13:44
这哪是概念,最简单你直接接个信号源不就可以了,不会说信号源还是个概念吧,你总用过吧 ...

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

使用特权

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

使用特权

评论回复
259
louyj| | 2015-4-10 16:06 | 只看该作者
很好的教程,虽然没有板子,先学习一下。

使用特权

评论回复
260
U201015703| | 2015-4-14 18:53 | 只看该作者
学习                           

使用特权

评论回复
发新帖 本帖赏金 5.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则