串口控制FL2440(S3C2440)的LED

开发板:FL2440

芯片:S3C2440

功能:程序运行时点亮一个LED,然后利用PC机通过串口发送一个数,开发板读到这个数后点亮另外一个LED。最基本的串口控制。

代码:

Init.s

AREA |DATA|,CODE,READONLY 
ENTRY 
ldr r13, =0x1000 
IMPORT WuqiMain 
b WuqiMain 
END

include.h

 1 #define rUTRSTAT0   (*(volatile unsigned *)0x50000010)    //UART 0 Tx/Rx status
 2 #define rULCON0     (*(volatile unsigned *)0x50000000)    //UART 0 Line control
 3 #define rUCON0      (*(volatile unsigned *)0x50000004)    //UART 0 Control
 4 #define rUFCON0     (*(volatile unsigned *)0x50000008)    //UART 0 FIFO control
 5 #define rUBRDIV0    (*(volatile unsigned *)0x50000028)    //UART 0 Baud rate divisor
 6 #define WrUTXH0(ch) (*(volatile unsigned char *)0x50000020)=(unsigned char)(ch)
 7 #define RdURXH0()   (*(volatile unsigned char *)0x50000027)
 8 #define rURXH0          (*(volatile unsigned *)0X50000024)
 9 #define rUTXH0  (*(volatile unsigned *)0X50000020)
10 #define rURXH0  (*(volatile unsigned *)0X50000024)
11 
12 #define GPBCON (*(volatile unsigned *)0x56000010) 
13 #define GPBDAT (*(volatile unsigned *)0x56000014) 
14 #define GPBUP (*(volatile unsigned *)0x56000018)
15 
16 #define uchar unsigned char
17 #define uint unsigned int
18 #define U32 unsigned int
19 #define U16 unsigned short
20 #define S32 int
21 #define S16 short int
22 #define U8  unsigned char
23 #define    S8  char
24 
25 #define TRUE 1
26 #define FALSE 0
27 
28 #define OK 1
29 #define FAIL 0
30 
31 #define    ESC_KEY        0x1b

uart.h

 1 #include "include.h"
 2 #include <stdarg.h>
 3 
 4 
 5 
 6 void Uart_Init(int baud)
 7 {
 8     int i;
 9     rUFCON0 = 0x0;   //UART channel 0 FIFO control register, FIFO disable
10   
11  
12 //UART0
13     rULCON0 &=0XFFFFFF00;
14     rULCON0 |=0X03;           //1位起始位,8位数据位
15     rUCON0  =0X0805;          //串口时钟PCLK,查询方式
16     rUBRDIV0 =0X1A;
17     for(i=0;i<100;i++);
18 }
19 
20 
21     
22 //=====================================================================
23 void Uart_SendByte(int data)
24 {
25    
26         if(data=='\n')
27         {
28             while(!(rUTRSTAT0 & 0x2));
29            // Delay(1);                 //because the slow response of hyper_terminal 
30             WrUTXH0('\r');
31         }
32         while(!(rUTRSTAT0 & 0x2));   //Wait until THR is empty.
33       //  Delay(1);
34         WrUTXH0(data);
35   
36    
37 }               
38 
39 //====================================================================
40 void Uart_SendString(S8 *pt)
41 {
42     while(*pt)
43         Uart_SendByte(*pt++);
44 }
45 
46 //=====================================================================
47 //If you don't use vsprintf(), the code size is reduced very much.
48 void Uart_Printf(S8 *fmt,...)
49 {
50     va_list ap;
51     S8 str[255];
52 
53     va_start(ap,fmt);
54        vsprintf(str,fmt,ap);
55     Uart_SendString(str);
56     va_end(ap);
57 }
58 
59 //=====================================================================
60 
61 /*
62 char Uart_GetKey(void)
63 {
64     
65         if(rUTRSTAT0 & 0x1)    //Receive data ready
66         return rURXH0 ;
67         else
68             return 0;
69  
70 }
71 */

main.c

#include"include.h"
#include "uart.h"

void Delay(int count)
{
    unsigned int i;                
    while (--count != 0)        
    {
        for (i=0; i<255; i++);        // ";" 表示空语句,CPU空转。
    }                   
}

void WuqiMain(void)
{
    char buf;
    
    GPBUP = 0x00; 
    GPBCON &= ~(1<<13);
    GPBCON |= (1<<12);
    GPBCON &= ~(1<<21);    
    GPBCON |= (1<<20);
    
    while(1)
    {
        GPBDAT &= ~(1<<6);
        GPBDAT &= 0xffe;
        
        if(rUTRSTAT0 & 0X01)  //接收是否完毕 =1结束
        {
            buf=rURXH0;       //读取数据
            while(!(rUTRSTAT0 & 0X04));//是否允许发送 =1允许
            rUTXH0=buf;
        }            
        if(buf=='1')
        {
            GPBDAT &= ~(1<<10);
            
        }    

    }
}

测试一下,vc6,file——new——projects——win32consoleApplication——a simple application

 1 #include "stdafx.h"
 2 #include <stdio.h>
 3 #include <string.h>
 4 
 5 
 6 int main(int argc, char* argv[])
 7 {
 8     char lpBuf[]="1";
 9     FILE * pFile=fopen("COM1","w");
10     if(pFile==NULL)
11     {
12         return 1;
13     }
14     fwrite(lpBuf,sizeof(char),strlen(lpBuf),pFile);
15     fclose(pFile);
16     return 0;
17 }

运行后开发板两个LED亮,也可用串口调试助手发送“1”来测试。

原文地址:https://www.cnblogs.com/wuqi1003/p/2724368.html