新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM入門筆記(6)

        ARM入門筆記(6)

        作者: 時間:2016-12-02 來源:網絡 收藏
        RS232串口通信

        ——串口USART0通訊實驗

        一.實驗目的

        利用串口調試軟件能夠正確接收到AT91SAM7S64發出的數據,AT91SAM7S64也能正確接收到調試軟件發出的數據。

        二.實驗程序和參數設置

        1>連接器選項設置和啟動代碼都與上個實驗相同
        2>C語言的代碼

        #i nclude "AT91SAM7S64.h"
        #i nclude "Board.h"
        unsigned char RBuff[256]; //定義接收緩沖區
        unsigned char index;
        int main(void)
        {
        unsigned int i, delay;
        *AT91C_CKGR_MOR = 0x701; //使能主振蕩器和設置起振時間
        *AT91C_PMC_MCKR = 0x01; //選擇Mster Clock is main clock, divided by 0
        *AT91C_PMC_SCER = AT91C_CKGR_MOSCEN;//使能系統時鐘寄存器的處理器時鐘
        *AT91C_PMC_PCER = AT91C_ID_US0; //使能USART0時鐘
        *AT91C_PIOA_PDR = US_RXD_PIN | US_TXD_PIN;//禁止該兩個管腳的I/O口功能
        *AT91C_PIOA_ASR= US_RXD_PIN | US_TXD_PIN;//將該兩個I/O口分配給外圍A
        *AT91C_US1_MR =0x8c0;//正常模式,時鐘為MCK,8位長度,無校驗,1位停止位,
        *AT91C_US0_IDR= 0xf3fff; //禁止所有UART相關的中斷
        *AT91C_US0_BRGR = 30;//設置波特率為38400Hz,AT91C_US0_BRGR為CD值
        //Baudrate=SelectedClock/(8(2-Over)CD) = MCK/16CD = 18432000/(16*30) = 38400
        *AT91C_US0_CR = 0x15c; //復位接收器、發送器和狀態位;使能接收與發送
        index = 0;
        while (1)
        {
        for (i = 0; i
        { //發送程序
        if ((*AT91C_US0_CSR) & AT91C_US_TXEMPTY) //判斷發送器是否為空
        {
        *AT91C_US0_THR = i; //空,則發送數據
        }
        for (delay = 0; delay
        }
        if ((*AT91C_US0_CSR) & AT91C_US_RXRDY)
        {//接收程序,在調試該部分時,要將發送部分程序注示掉
        RBuff[index++] = *AT91C_US0_RHR;
        }
        }
        }

        三.出現的問題與解決方法

        1> 狀態寄存器中的發送準備位(TXRDY)和發送空標志位(TXEMPTY)一直為0,表示發送器未準備好和緩沖區不空。

        原因是發送器復位后還未使能。不能同時進行發送器(或接收器)復位與使能操作(*AT91C_US0_CR= 0x15c),這樣使能操作會無效,必須將它們分開,即先進行復位(*AT91C_US0_CR= 0x10c),再進行使能(*AT91C_US0_CR = 0x50)。

        2> 串口接收、發送的數據不對

        原因是系統主時鐘和分頻后的時鐘計算錯誤,引起波特率也計算錯誤。很有必要深入研究關于時鐘的產生、分頻及波特率計算等內容。

        3> 每次從串口調試軟件收到的數據中,低四位正確,高四位錯誤。

        原因是將“*AT91C_US0_MR =0x8c0;”寫成了“*AT91C_US1_MR =0x8c0;”,而引起通訊模式根本不對??梢哉f這是一個非常低級的錯誤,但它卻花費了我很久的時間才找到癥結所在。在找原因的過程中,使我對串口相關的(如各種時鐘的產生、波特率的計算等)內容有了更深刻的理解。

        四.總結

        在本實驗中串口為異步模式,波特率的計算如下式所示:

        Baudrate = SelectedClock/(8(2-Over)CD)

        其中在USART模式寄存器(AT91C_US0_MR)中設置SelectedClock為MCK;Over為1則上式變成如下所示:

        Baudrate = SelectedClock/(8(2-Over)CD) = MCK/16CD

        在Master Clock Register(AT91C_PMC_MCKR)中將MCK設置為Main Clock且不分頻,即為外部振蕩時鐘(接在XIN和XOUT管腳間的晶振)的頻率,因為外部晶振是18.432MHz,所以MCK就為 18432000,則上式變成如下所示:

        Baudrate=SelectedClock/(8(2-Over)CD) = MCK/16CD = 18432000/(16*30) = 38400


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 突泉县| 淮安市| 衡阳县| 久治县| 浏阳市| 珲春市| 琼中| 武山县| 五家渠市| 盐城市| 星子县| 阳山县| 亚东县| 信宜市| 张北县| 定安县| 长沙市| 如皋市| 南乐县| 安陆市| 孝感市| 都江堰市| 平南县| 多伦县| 汝城县| 灵璧县| 武义县| 波密县| 土默特右旗| 瓦房店市| 青川县| 扎兰屯市| 常宁市| 宜良县| 曲麻莱县| 吕梁市| 原平市| 芦溪县| 醴陵市| 孝感市| 平阳县|