串口UART原理
异步通讯:传输单位是一个字符,两个字符之间时刻距离不固定,时刻固定为同步。
通讯协议:通讯两边一起拟定的规矩,有数据格局:奇偶校验位、中止位…..,通讯流程上的标准.
UART(universal asynchronous receivertransmitter):通用异步收发器,用来串行传输数据,发送时,CPU将数据并行写入UART,UART依照必定格局在一位的数据线上串行发送,承受时,从一位数据线承受串行的数据。
S3c2440有三个独立的uart接口,而且每个uart包含64字节的承受和发送fifo。
串口根本作业原理:分为发送和接纳部分,发送部分:1接口用来接纳数据,数据由CPU经过BUS送到uart,首要进入transmitbuffer,然后会主动的把每字节送入transmitshift把8位数据依位移出发送,发送进程受波特率操控每秒发送位数。接纳:从数据依位收到放入 receive shift构成一个字节,放入buffer,经过机制(中止)告知CPU,完结承受。
串口UART程序设计
UART初始化:设置波特率–>设置串口数据传输格局–>挑选通道作业形式(DMA,中止……)。
1:经过UART Baud Rate Divisor Register即UBRDIV能够设置UART波特率,波特率的设置依靠一个公式 UBRDIV=(int)(uartclock / (baud rate * 16) ) -1
(uart clock :PCLK orFCLK /n or UEXTCLK)
CPU一作业clock就定下来,设置波特率便是设置UBRDIV。
2:设置传输格局,经过UART LINE CONTROL REGISTER即ULCON,能够设置传输格局。
3:设置通道作业形式:经过UART CONTROL REGISTER,即UCON。
完结初始化后发送数据
把要发送的数据写入UTXHn(4个字节),UART会把它保存到缓冲区,并主动发送。
接纳数据:一旦接纳到数据之后,假如没有DMA和中止,能够查询UTRSTATn寄存器的第0位,从URXHn寄存器拿数据。
串口发送数据程序:static void cal_cpu_bus_clk(void);void Set_Clk(void);void beep_init(void);void beep_run(void);void delay(int times) {int i,j;for(i=0;i串口通讯挑选for(i=0;i<10;i++) //串口发送数据Uart_Printf("\nHello World!\n");//串口输出的数据} void Set_Clk(void){int i;U8 key;U32 mpll_val = 0 ;i = 2 ; //dont use 100M!//boot_params.cpu_clk.val = 3;switch ( i ) {case 0: //200key = 12;mpll_val = (92<<12)|(4<<4)|(1);break;case 1: //300key = 13;mpll_val = (67<<12)|(1<<4)|(1);break;case 2: //400key = 14;mpll_val = (92<<12)|(1<<4)|(1);break;case 3: //440!!!key = 14;mpll_val = (102<<12)|(1<<4)|(1);break;default:key = 14;mpll_val = (92<<12)|(1<<4)|(1);break;}//init FCLK=400M, so change MPLL firstChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3); //set the register--rMPLLCONChangeClockDivider(key, 12); //the result of rCLKDIVN [0:1:0:1] 3-0 bitcal_cpu_bus_clk(); //HCLK=100M PCLK=50M}/static void cal_cpu_bus_clk(void){static U32 cpu_freq;static U32 UPLL;U32 val;U8 m, p, s;val = rMPLLCON;m = (val>>12)&0xff;p = (val>>4)&0x3f;s = val&3;//(m+8)*FIN*2 不要超出32位数!FCLK = ((m+8)*(FIN/100)*2)/((p+2)*(1< >1)&3;p = val&1; val = rCAMDIVN;s = val>>8;switch (m) {case 0:HCLK = FCLK;break;case 1:HCLK = FCLK>>1;break;case 2:if(s&2)HCLK = FCLK>>3;elseHCLK = FCLK>>2;break;case 3:if(s&1)HCLK = FCLK/6;elseHCLK = FCLK/3;break;}if(p)PCLK = HCLK>>1;elsePCLK = HCLK;if(s&0x10)cpu_freq = HCLK;elsecpu_freq = FCLK;val = rUPLLCON;m = (val>>12)&0xff;p = (val>>4)&0x3f;s = val&3;UPLL = ((m+8)*FIN)/((p+2)*(1<>1):UPLL;}void beep_init(void){rGPBCON &= ~(0x3<<0);rGPBCON |= (0x1<<0);}void beep_run(void){rGPBDAT |= (0x1<<0);delay(5000);rGPBDAT &= (0x0<<0);delay(5000);}void Uart_Init(int pclk,int baud){int i;if(pclk == 0)pclk = PCLK; //串口运用PCLKrUFCON0 = 0x0; //UART channel 0 FIFO control register, FIFO disablerUFCON1 = 0x0; //UART channel 1 FIFO control register, FIFO disablerUFCON2 = 0x0; //UART channel 2 FIFO control register, FIFO disable//关掉fiforUMCON0 = 0x0; //UART chaneel 0 MODEM control register, AFC disablerUMCON1 = 0x0; //UART chaneel 1 MODEM control register, AFC disable rULCON0 = 0x3; //Line control register : Normal,No parity,1 stop,8 bitsrUCON0 = 0x245; // Control registerrUBRDIV0=( (int)(pclk/16./baud+0.5) -1 ); //Baud rate divisior register 0//UART1rULCON1 = 0x3;rUCON1 = 0x245;rUBRDIV1=( (int)(pclk/16./baud+0.5) -1 );//UART2rULCON2 = 0x3;rUCON2 = 0x245;rUBRDIV2=( (int)(pclk/16./baud+0.5) -1 ); for(i=0;i<100;i++);}