新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > msp430串口數據收發的討論

        msp430串口數據收發的討論

        作者: 時間:2016-11-13 來源:網絡 收藏
        在做串口通信看<MSP430系列16位超低功耗單片機原理與應用> 沈建華編著 一書中感到書中有些控制字沒有列出,編寫程序時容易忘記寫.出現不必要的錯誤. ME2 IE2 IFG2 (或ME1 IE1 IFG1)下面的本程序用的是USART1.要從.H的頭文件里找上面三個特殊功能寄存器的用法.

        #define IE2_ (0x0001) /* Interrupt Enable 2 */

        本文引用地址:http://www.104case.com/article/201611/316415.htm

        DEFC( IE2 , IE2_)

        #define U1IE IE2 /* UART1 Interrupt Enable Register */

        #define URXIE1 (0x10)

        #define UTXIE1 (0x20)

        #define IFG2_ (0x0003) /* Interrupt Flag 2 */

        DEFC( IFG2 , IFG2_)

        #define U1IFG IFG2 /* UART1 Interrupt Flag Register */

        #define URXIFG1 (0x10)

        #define UTXIFG1 (0x20)

        #define ME2_ (0x0005) /* Module Enable 2 */

        DEFC( ME2 , ME2_)

        #define U1ME ME2 /* UART1 Module Enable Register */

        #define URXE1 (0x10)

        #define UTXE1 (0x20)

        #define USPIE1 (0x10)

        430的波特率的使用很有特點.: 時鐘源可通過UTCTL<0 1>中的SSEL1 SSEL0 選擇外部時鐘 UCLK1 ACLK SMCLK SMCLK 對于波特率的計算: 比如時鐘750KHz,波特率115200,750000/115200=6.51 小數0.51*8=4.08 那么UxMCTL就可以為0xAA或者0x55(4個1均勻分布)關波特率=BRCLK/(UBR+(M7+M6+M5+M4+M3+M2+M1+M0)/8) 是反過來的運算. 本程序中用ACLK :32768HZ 32768/9600=3.4133... 那么UBR就是3 再用 0.4133*8=3.3064 取整數 3 在波特率調整控制器中UMCTL中的M7~M0 任意修改3個位并且不能緊靠在一起.同時UMCTL的值要求不能少于0x03

        #include "msp430x16x.h"

        void Delay(unsigned char m);

        void ComInit(void);

        unsigned char Usart_Tx_Data[30]={"You are the best ! cheer on! "};

        void InitSystemClock(void) // 初始化系統時鐘

        {

        unsigned char i;

        WDTCTL=WDTPW+WDTHOLD; //關閉看門狗

        BCSCTL1=0x00; //Set 430 clk 開啟XT2,DOC的標稱頻率為最低 且不分頻;XT1為低速晶體(32.768K)

        BCSCTL2=SELM_2+SELS; //選擇MCLK SCLK的時鐘源為高速時鐘 不分頻,均為8M

        do

        {

        IFG1&=~OFIFG;

        for(i=0xff;i>0;i--);

        }

        while ((IFG1&OFIFG)!=0);

        //P5DIR=0XFF;

        //P5OUT|=BIT7;

        //P5IN=0X80;

        //P5SEL|=BIT4+BIT5+BIT6;//將MCLK SCLK ACLK分別輸出至P5.4 5 6口

        }

        void main(void)

        {

        int i;

        InitSystemClock(); // 初始化系統時鐘

        ComInit();

        //InitLCD();

        //P1DIR=0x00;

        //P1IE=0xff;

        _EINT();

        while(1)

        {

        Delay(100);

        }

        /*

        while(1)

        {

        for(i=0;i<30;i++)

        {

        TXBUF1=Usart_Tx_Data[i];

        while((UTCTL1&0X01)==0);

        Delay(100);

        }

        } */

        }

        void Delay(unsigned char m)

        {

        unsigned char i;

        while(m--)

        {

        for(i=0;i<0xff;i++);

        }

        }

        void ComInit(void) //串口初始化

        {

        UCTL1|=SWRST;

        UCTL1 = CHAR; // 8-bit 字符 無校驗 1位停止位 UART模式 無反饋 線路空閑多機模式

        /*******************波特率為1200*******************/

        /* UTCTL1=SSEL0; //選擇ACLK為波特率發生器時鐘源(32.768K), UCLKI與UCLK極性相同

        UBR01 = 0x1B; // 波特率設置寄存器 波特率為1200

        UBR11 = 0x00; // // 波特率設置寄存器

        UMCTL1 = 0x11; //波特率 調整寄存器

        */

        /**************************************/

        /*******************波特率為2400*******************/

        /* UTCTL1=SSEL0; //選擇ACLK為波特率發生器時鐘源(32.768K), UCLKI與UCLK極性相同

        UBR01 = 0x0D; // 波特率設置寄存器 波特率為2400

        UBR11 = 0x00; // // 波特率設置寄存器

        UMCTL1 = 0x6D; //波特率 調整寄存器

        */

        /**************************************/

        /*******************波特率為9600*******************/

        UTCTL1=SSEL0; //選擇ACLK為波特率發生器時鐘源(32.768K), UCLKI與UCLK極性相同

        UBR01 = 0x03; // 波特率設置寄存器

        UBR11 = 0x00; // // 波特率設置寄存器

        UMCTL1 = 0x4A; //波特率 調整寄存器

        /**************************************/

        /*******************波特率為19200*******************

        UTCTL1=SSEL0+SSEL1; //選擇SMCLK為波特率發生器時鐘源(8M), UCLKI與UCLK極性相同

        UBR01 = 0xA0; // 波特率設置寄存器 8M 下波特率為19200

        UBR11 = 0x01; // // 波特率設置寄存器

        UMCTL1 = 0x6d; //波特率 調整寄存器

        **************************************/

        /*******************波特率為115200*******************

        UTCTL1=SSEL0+SSEL1; //選擇SMCLK為波特率發生器時鐘源(8M), UCLKI與UCLK極性相同

        UBR01 = 0x45; // 波特率設置寄存器 SMCLK為8M下波特率為115200

        UBR11 = 0x00; // // 波特率設置寄存器

        UMCTL1 = 0x55; //波特率 調整寄存器

        /**************************************/

        ME2|= UTXE1 + URXE1; // 使能 USART1 TXD/RXD

        IE2|= URXIE1+UTXIE1; // 使能 USART1 接收和發送 中斷

        UCTL1&=~SWRST;

        P3SEL |= BIT6+BIT7; // P3.6,7 = USART1 TXD/RXD 選擇第二功能

        }

        #pragma vector=UART1RX_VECTOR

        __interrupt void OnRecieve(void) //將接收到的字符顯示到串口輸出

        {

        while((IFG2&URXIFG1)==0); //選擇的是USART1

        TXBUF1=RXBUF1;

        while((UTCTL1&0X01)==0);

        Delay(1);

        }

        //本程序包括自動發送數組里的數據或將接收到的數據再從新發回.多添加一條語句實現功能.

        while((UTCTL1&0X01)==0); 將接收到的數據發送完才能退出中斷. 少這一句 在串口調試助手中能看到TX加1 RX也加1 接收數據區卻沒有顯示. 原因就是數據沒有發送完就退出了中斷.

        //此程序只要修改頭文件就可運行. 其實還有很多的更為復雜的應用.歡迎交流! ^_^

        其實在任何一種單片機先看懂官方或者網上的一些程序,再在這些程序基礎上添加自己想要實現的功能,這是實現編程的最好也是最快方式,但是,不要認為這就可以了,不但要看懂理寫程序人的意思,將程序變成適應自己修改的程序,并完全正確.要一個學習的過程和時間.



        關鍵詞: msp430串口數據收

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 临城县| 新宁县| 红原县| 济宁市| 广南县| 南召县| 南投市| 松阳县| 遵义市| 吉木乃县| 清新县| 云梦县| 沽源县| 松阳县| 大安市| 乌海市| 晋中市| 沧州市| 喀喇沁旗| 石城县| 溧阳市| 都安| 麦盖提县| 巴青县| 凌云县| 古田县| 苍南县| 临漳县| 宜川县| 凭祥市| 玉田县| 金堂县| 庆云县| 阿拉尔市| 腾冲县| 阳泉市| 山东省| 察哈| 泗洪县| 鹤峰县| 英吉沙县|