• 串口控制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”来测试。

  • 相关阅读:
    apache的用户认证
    Apache的配置文件
    AH00052: child pid 25043 exit signal Segmentation fault (11)
    Apache的工作模式
    apache的目录别名
    RAID的几种级别
    网络服务--NFS服务
    MySQL 5.7元数据库
    [ERROR] COLLATION 'latin1_swedish_ci' is not valid for CHARACTER SET 'utf8'
    .Net MVC断点进不去
  • 原文地址:https://www.cnblogs.com/wuqi1003/p/2724368.html
Copyright © 2020-2023  润新知