亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ARM cortex a 之串口通信2

發布時間:2020-06-21 21:03:04 來源:網絡 閱讀:706 作者:飛寞 欄目:開發技術

現在開始編程。

先寫一個大的函數:

void main(void)

{

uart_init();

uart_putc('a');  //發送數據

//uart_getc();  //接收數據

}

然后分別寫三個小的子函數

先在宏定義中聲明各個寄存器的地址,然后我們開始使用它們。

#define GPA0CON 0xE0200000

#define UCON0 0xE2900004

#define ULCON0 0xE2900000

#define UMCON0 0xE290000C

#define UFCON0 0xE2900008

#define UBRDIV0 0xE2900028

#define UDIVSLOT0 0xE290002C

#define UTRSTAT0 0xE2900010

#define UTXH0 0xE2900020

#define URXH0 0xE2900024

//下面是串口初始化程序

void uart_init(void)

{

//首先先選擇GPA0CON控制寄存器,這個寄存器的作用是把IO口設置為串口模式

//先把這個寄存器的bit0~bit7清除,再寫入0x22,則Rx Tx就設置成功了。

(*(volatile unsigned int *)GPA0CON) &= ~(0xff<<0);

(*(volatile unsigned int *)GPA0CON) |= 0x00000022;


//然后就是根據上一章講的,我們來設置ULCON:設置串口的數據位,校驗位和停止位

//這個寄存器的[31:7] 沒有功能,這里寫0x3的意思是:

//[1:0] 為11表示八位數據位,[2] 為0表示一位停止位,[5:3] 為0表示不需要校驗位,

//[6] 為0表示正常模式(若選擇1則表示紅外模式);

(*(volatile unsigned int *)ULCON0)   = 0x3;


//然后我們再設置UCONn寄存器

//這個寄存器的[1:0] 為01,表示中斷請求或者輪詢方式,[3:2] 為01,表示中斷請求或者輪詢方式

//[10]設置0,選擇PCLK為時鐘來源。剩下很多與中斷有關的位我們先不需要管,畢竟我們用串口來做實驗,

//不需要中斷,不斷來回檢查就行了。

(*(volatile unsigned int *)UCON0)    = 0x5;


//我們不使用流控,所以直接讓UMCON全都為0,禁止掉。

(*(volatile unsigned int *)UMCON0)   =0;


//我們不使用FIFO模式,所以同樣把它們都設置為0就可以了。

(*(volatile unsigned int *)UFCON0)   =0;


//然后就要計算配置波特率了

//PCLK_PSYS通過時鐘系統分析為66.7MHz

//DIV_VAL = (66700000/(115200*16)-1) = 35.18,余數0.18

(*(volatile unsigned int *)UBRDIV0) = 35;

//(rUDIVSLOT中的1的個數 = 16*0.18= 2.88 = 3

//然后查閱手冊,得知為0x888

(*(volatile unsigned int *)UDIVSLOT0) = 0x0888;

}


初始化完成了,現在開始寫發送程序。

void uart_putc(char c)

{

 //與uart功能有關的狀態寄存器,記錄了發送數據是否完成

 //這個寄存器的bit3~bit31都沒有功能,

 //第bit2是transmitter empty位,發送緩沖器里面沒有可供發送的數據的時候置1,有的話置0

 //bit1位是如果有數據進入緩沖區則硬件自動置0,如果進入的數據被發送了出去,硬件再自動置一

 //FIFO就是在發送器里面存一大堆數據,所以對于FIFO模式下,檢測每次發送的數據是否發送了只能用

 //檢測bit1的方法,對于不使用FIFO模式來說,一次只發送一幀數據,而且都存在發送器里面,因此

 //檢測bit2和bit1都可以使用。

 //首先一直循環檢測,直到置1的時候,才能發送第二幀數據。

 //

 //bit0表示的是接收區的置位狀態

while (!((*(volatile unsigned int *)UTRSTAT0) & (1<<1)));

(*(volatile unsigned int *)UTXH0) = c;

}


//會寫發送程序以后,接收程序就簡單多了。

char uart_getc(void)

{

while (!((*(volatile unsigned int *)UTRSTAT0) & (1<<0)));

return (*(volatile unsigned int *)URXH0);

}




向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

衡阳县| 寿宁县| 高台县| 罗定市| 科技| 敦煌市| 韶关市| 云霄县| 宁德市| 民乐县| 屯昌县| 类乌齐县| 铜梁县| 靖江市| 皋兰县| 沂水县| 叶城县| 额尔古纳市| 瓮安县| 鄂尔多斯市| 两当县| 乌苏市| 东海县| 利津县| 连江县| 电白县| 宁阳县| 珠海市| 邵阳县| 新干县| 泰来县| 通化市| 酒泉市| 柳江县| 定襄县| 香河县| 乌鲁木齐县| 德江县| 德安县| 平安县| 玉环县|