日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

s5pv210——串口(UART)通信实战

發布時間:2023/12/20 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 s5pv210——串口(UART)通信实战 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

以下內容源于朱有鵬嵌入式課程的學習,如有侵權,請告知刪除。

參考博客http://www.cnblogs.com/biaohc/p/6351253.html

?

一、主要代碼總覽

void main(void) {uart_init();while(1){uart_putc('a');delay();} } #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 #define rGPA0CON (*(volatile unsigned int *)GPA0CON) #define rUCON0 (*(volatile unsigned int *)UCON0) #define rULCON0 (*(volatile unsigned int *)ULCON0) #define rUMCON0 (*(volatile unsigned int *)UMCON0) #define rUFCON0 (*(volatile unsigned int *)UFCON0) #define rUBRDIV0 (*(volatile unsigned int *)UBRDIV0) #define rUDIVSLOT0 (*(volatile unsigned int *)UDIVSLOT0) #define rUTRSTAT0 (*(volatile unsigned int *)UTRSTAT0) #define rUTXH0 (*(volatile unsigned int *)UTXH0) #define rURXH0 (*(volatile unsigned int *)URXH0)// 串口初始化程序 void uart_init(void) {// 初始化Tx Rx對應的GPIO引腳rGPA0CON &= ~(0xff<<0); // 把寄存器的bit0~7全部清零rGPA0CON |= 0x00000022; // 0b0010, Rx Tx// 幾個關鍵寄存器的設置rULCON0 = 0x3;//0校驗位、8數據位、1停止位rUCON0 = 0x5;//發送和接收都是polling moderUMCON0 = 0;//禁止modem、afcrUFCON0 = 0;//禁止FIFO模式// 波特率設置 DIV_VAL = (PCLK / (bps x 16))-1// PCLK_PSYS用66MHz算 余數0.8//rUBRDIV0 = 34; //rUDIVSLOT0 = 0xdfdd;// PCLK_PSYS用66.7MHz算 余數0.18// DIV_VAL = (66700000/(115200*16)-1) = 35.18rUBRDIV0 = 35;// (rUDIVSLOT中的1的個數)/16=上一步計算的余數=0.18// (rUDIVSLOT中的1的個數 = 16*0.18= 2.88 = 3rUDIVSLOT0 = 0x0888; // 3個1,查官方推薦表得到這個數字 }// 串口發送程序,發送一個字節 void uart_putc(char c) { // 串口發送一個字符,其實就是把一個字節丟到發送緩沖區中去// 因為串口控制器發送1個字節的速度遠遠低于CPU的速度,所以CPU發送1個字節前必須// 確認串口控制器當前緩沖區是空的(意思就是串口已經發完了上一個字節)// 如果緩沖區非空則位為0,此時應該循環,直到位為1while (!(rUTRSTAT0 & (1<<1)));//緩沖區為空時(即狀態寄存器的第2bit為1),說明可以發送該字節到緩沖區了rUTXH0 = c; }// 串口接收程序,輪詢方式,接收一個字節 char uart_getc(void) {while (!(rUTRSTAT0 & (1<<0)));return (rURXH0 & 0xff);//為什么要與,bit0~bit3???????? }

?

二、流程分析

?

1、整個串口通信相關程序包含2部分

  • uart_init負責初始化串口;
  • uart_putc負責發送一個字節;

2、串口的初始化

(1)初始化串口的Tx和Rx引腳所對應的GPIO。

?

  • GPA0CON(0xE0200000)的 bit[3:0] = 0b0010,bit[7:4] = 0b0010,即把引腳設置為UART_?(這里為0)的作用狀態。

?

(2)初始化關鍵寄存器:ULCON0、UCON0、UMCON0、UFCON0、UBRDIV0、UDIVSLOT0;

A、ULCONn寄存器

  • 紅外模式:0:普通模式、1:紅外模式;
  • 奇偶校驗模式:0:無、1:奇數、2:偶數;
  • 終止位:0:1位,1:2位;
  • 字長:5-8bit。

?

B、UCONn寄存器

  • 時鐘選擇:0:PCLK_PSYS,1:SCLK_UART,我們設置為0;
  • 發送模式:輪詢/中斷;
  • 接收模式:輪詢/中斷;

?

C、UMCONn寄存器:禁止modem、afc

D、UFCONn寄存器:禁止FIFO模式

E、UTRSTATn寄存器,是狀態寄存器

  • Transmitter empty: 移位器和發送緩沖寄存器是否有可用數據發送,0:非空,1:空;
  • Transmitter buffer empty: 發送緩沖寄存器,0:非空,1:空;
  • Recieve buffer empty: 接收緩沖寄存器,0:非空,1:空。

?

F、UBRDIV0和UDIVSLOT0和波特率設置有關

波特率設置方法:DIV_VAL = (PCLK / (bps x 16)) ?1。

如66.7MHz/(115200*16) = 36.187,

則UBRDIV n中的值就是36-1=35,

0.187*16=2.992 ,則UDIVSLOTn中1的個數為3個,則UDIVSLOTn寄存器的值根據上表,應該寫入0x0888。

?

G、UTXHn寄存器、URXHn寄存器

?

總結

以上是生活随笔為你收集整理的s5pv210——串口(UART)通信实战的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。