国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

TQQ2440第三節(jié):串口

發(fā)布者:AngelicGrace最新更新時(shí)間:2024-11-06 來源: cnblogs關(guān)鍵字:串口  配置 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

嵌入式的基本上都清楚,板子基本上跑起來了,第一個(gè)肯定要配置的是串口,便于我們后面調(diào)試信息的輸出,和一些系統(tǒng)參數(shù)的輸出,讓我們有更直觀看見程序的運(yùn)行。

—————————————————————————————————————————————

硬件平臺(tái):TQ2440 (S3C2440A)

開發(fā)環(huán)境:ADS1.2

時(shí)      間:2010-12-12

—————————————————————————————————————————————

1:硬件電路:

  image image

                  底板電路                           核心板上的連接管腳

由于TQ2440的板子上只引出了一個(gè)串口,也就是用的UART0作為COM1,所以我嗎只需要配置相關(guān)的引腳為串口功能即可。

接著參考2440的說明文檔:

image

所以把GPH相關(guān)的GPH0-3都配置為第二功能UART功能。即可以上至完成了管腳的配置,接著對(duì)UART的功能進(jìn)行配置。

A:UART寄存器:

image


從2440的數(shù)據(jù)手冊(cè)上我們可以知道他的寄存器的地址都是連接著的,所以我們直接用結(jié)構(gòu)體來表示,因?yàn)樗?個(gè)串口,所以,我們這里就可以用3個(gè)不同的結(jié)構(gòu)體指針來操作不同的寄存器。代碼如下:


   1: #define IO_CON_BASE 0x56000000

   2: #define IO_DAT_BASE 0x56000004

   3:  

   4: #define UART0_BASE  0x50000000  // UART0 Base Address

   5: #define UART1_BASE  0x50004000  // UART1 Base Address

   6: #define UART2_BASE  0x50008000  // UART2 Base Address

   7:  

   8: #define REG8(x)  (*((volatile unsigned char  *)(x)))

   9: #define REG16(x) (*((volatile unsigned short *)(x)))

  10: #define REG32(x) (*((volatile unsigned long  *)(x)))

  11:  

  12: typedef volatile unsigned char  reg8;

  13: typedef volatile unsigned short reg16;

  14: typedef volatile unsigned long  reg32;

  15:                         

  16: /*

  17: GPIO_CFG_SET說明:   group--表示是那組IO(注意沒有GPA)

  18:                     index--表示這組中的那個(gè)引腳   

  19:                     type --表示是配置為輸入還是輸出等其他功能

  20: */

  21: #define GPIO_CFG_SET(group,index,type) do{

  22:                         (*(volatile unsigned int*)(IO_CON_BASE+group*0x10))&=~(0x3<  23:                         (*(volatile unsigned int*)(IO_CON_BASE+group*0x10))|=(type<  24:                         }while(0)

  25:                         

  26: /*

  27: GPIO_DAT_SET說明:   group--表示是那組IO(注意沒有GPA)

  28:                     index--表示這組中的那個(gè)引腳   

  29:                     val  --表示對(duì)此引腳寫入的數(shù)據(jù)

  30: */

  31: #define GPIO_DAT_SET(group,index,val) do{

  32:                         (*(volatile unsigned int*)(IO_DAT_BASE+group*0x10))&=~(0x1<  33:                         (*(volatile unsigned int*)(IO_DAT_BASE+group*0x10))|=(val<  34:                         }while(0)

  35: /*

  36: 因?yàn)镚PA的控制寄存器,每個(gè)引腳只只占用一位,所以為了能統(tǒng)一這里,就沒有把

  37: GPA加進(jìn)來,而后面的GPB-GPJ的控制寄存器每個(gè)引腳對(duì)應(yīng)2位

  38: */                        

  39: enum{GPB=1,GPC,GPD,GPE,GPF,GPG,GPH,GPI,GPJ};

  40: /*

  41: 從GPB開始由于用兩位表示此引腳的功能所以有四種可能

  42: 0代表INPUT,1代表OUTPUT,2代表第三功能,3代表第四功能

  43: */

  44: enum{INPUT=0,OUTPUT,THI_FUNC,FOR_FUNC};

  45: /*

  46: 定義高低電平

  47: */

  48: enum{LOW=0,HIG};

  49:  

  50: // UART Registers

  51: typedef struct {

  52:   reg32 ULCON;              // UART Line Control          由于控制數(shù)據(jù)格式,常用的為N-8-1模式 

  53:   reg32 UCON;               // UART Control                控制UART的工作狀態(tài),例如DMA,中斷等

  54:   reg32 UFCON;              // UART FIFO Control        控制UART的FIFO,這里沒有用到

  55:   reg32 UMCON;          // UART MODEM Control    在MODEM模式下的控制寄存器,這里沒有用到

  56:   reg32 UTRSTAT;        // UART Tx/Rx Status        UART發(fā)送和接受狀態(tài)寄存器

  57:   reg32 UERSTAT;        // UART Error Status            UART錯(cuò)誤狀態(tài)寄存器

  58:   reg32 UFSTAT;             // UART FIFO Status        UART---FIFO狀態(tài)寄存器

  59:   reg32 UMSTAT;         // UART MODEM Status    UART---MODEM狀態(tài)寄存器

  60:   reg8  UTXH;               // UART Tx Hold                UART發(fā)送數(shù)據(jù)寄存器 ##注意這里是一個(gè)char類型的

  61:   reg8  pad0[3];

  62:   reg8  URXH;               // UART RX Buffer            UART接受數(shù)據(jù)寄存器 ##注意這里是一個(gè)char類型的

  63:   reg8  pad1[3];

  64:   reg32 UBRDIV;             // UART Baud Rate Divisor UART的波特率產(chǎn)生器的分頻率

  65: } regUART;

  66:  

  67: #define pUART0 ((regUART *)UART0_BASE)

  68: #define pUART1 ((regUART *)UART1_BASE)

  69: #define pUART2 ((regUART *)UART2_BASE)

 2:2440的UART的配置


     上面已經(jīng)把相關(guān)的寄存器介紹的很清楚了,所以這里的配置就直接給出代碼了,因?yàn)榭梢灾苯訁⒖紨?shù)據(jù)手冊(cè)得到:


   1: void uart_init(void)

   2: {

   3:     //設(shè)置GPH[0..3]為uart0的輸出引腳

   4:     GPIO_CFG_SET(GPH,0,THI_FUNC);

   5:     GPIO_CFG_SET(GPH,1,THI_FUNC);

   6:     GPIO_CFG_SET(GPH,2,THI_FUNC);

   7:     GPIO_CFG_SET(GPH,3,THI_FUNC);

   8:     

   9:     pUART0->ULCON=    0x03;   //N-8-1

  10:     pUART0->UCON=    0x245; //中斷和查詢模式

  11:     pUART0->UFCON=    0x0;    //No Use

  12:     pUART0->UMCON=    0x0;      //No Use

  13:     pUART0->UBRDIV=    26;      //當(dāng)前板子的速度是FCLK:400M,HCLK=100M,PCLK=50M,UATR=115200

  14: }

 


   這樣串口就能工作起來的了,自己在把鏈接串口工具配置成相同的波特率就能正常工作了。


3: 相關(guān)代碼的實(shí)現(xiàn)


 接下來就是串口發(fā)送和接受數(shù)據(jù)的一些功能函數(shù)的實(shí)現(xiàn)了,下面也只實(shí)現(xiàn)了一些簡單的函數(shù):


輸出部分:


   1: void u_printf(char *fmt,...)  //格式化輸出

   2: {

   3:     va_list ap;

   4:     char str[100];

   5:     va_start(ap,fmt);

   6:     vsprintf(str,fmt,ap);

   7:     send_str(str);

   8:     va_end(ap);

   9: }

  10: void send_str(char *p_str)   //發(fā)送一個(gè)字符串

  11: {

  12:     while(*p_str!='