Mini2440A bare metal programming: serial port control LED light on and off

Require

Send L11 on the PC to control the development board led1 on, send L10 to control the development board led1 off;

Send L21 on the PC to control the development board led2 on, send L20 to control the development board led2 off;

Send L31 on the PC to control the development board led3 on, send L30 to control the development board led3 off;

Send L41 on the PC to control the development board led4 on, send L40 to control the development board led4 off;

PC uses serial port assistant to send;

code

#include <string.h>
#include <stdlib.h>

//0x50000020(L)
//0x50000023(B)
//(字节) UART 通道0 发送缓冲寄存器
#define UTXH0       (*(volatile unsigned int *)0x50000020)//UTXH0
#define UTRSTAT0    (*(volatile unsigned int *)0x50000010)  //R UART 通道0 Tx/Rx 状态寄存器
#define ULCON0      (*(volatile unsigned int *)0x50000000)//  //R/W UART 通道0 线路控制寄存器
#define UCON0       (*(volatile unsigned int *)0x50000004)//  //R/W UART channel 0 control register
#define UBRDIV0     (*(volatile unsigned int *)0x50000028) //  R/W 波特率分频寄存器0
#define GPHCON      (*(volatile unsigned int *)0x56000070)   //R/W 配置端口H 的引脚
//URXH0
//0x50000024(L)
//0x50000027(B)
//W
//(字节) UART 通道0 接收缓冲寄存器 –
#define URXH0       (*(volatile unsigned int *)0x50000024)//URXH0
//UFCON0 0x50000008 R/W UART 通道0 FIFO 控制寄存器 0x0
#define UFCON0      (*(volatile unsigned int *)0x50000008)//URXH0
//UMCON0 0x5000000C R/W UART 通道0 Modem 控制寄存器 0x0
#define UMCON0      (*(volatile unsigned int *)0x5000000c)//URXH0
//灯
//GPBCON  0x56000010  R/W  配置端口 B 的引脚 
#define GPBCON  (*(unsigned int *)0x56000010)
//GPBDAT  0x56000014  R/W  端口 B 的数据寄存器
#define GPBDAT  (*(unsigned int *)0x56000014)

#define PCLK    (50000000)
#define BPS     (115200)

unsigned char buff[3];
char len = 0;

void delay(int time)
{
   int i;
   for(i=0; i<time; i++);
}
void uart0_init(void)
{
    GPHCON = (2<<4) | (2<<6);//配置串口引脚功能
    ULCON0 = 0x3;//设置串口0的数据位8,停止位1,校验位无
    UCON0 = (1<<2)|(1<<0);//使能发送,接受模式
    //UBRDIVn = (int)( UART 时钟 / ( 波特率 × 16) ) –1
    UFCON0 = 0;
    UMCON0 = 0;
    UBRDIV0 = PCLK/(BPS*16) -1;
}
void uart0_sendchar(unsigned char date)
{
  UTXH0 = date;
    while((UTRSTAT0&0x04)==0); 
 // UTXH0 = date;  
}

char uart0_recvchar(void)
{
    while((UTRSTAT0&0x01)==0);
    return URXH0;
}
void uart0_recvstring(char *ch,int len)
{
    while(len--)
    {
        *ch = uart0_recvchar();
          ch++;
    }
    *ch = '\0';
}
void uart0_sendstring(char* string)
{
    while(*string != 0)
    {
       uart0_sendchar(*string);
       string++; 
    }
}
void led_init(void)
{
  GPBCON = (1<<10)|(1<<12)|(1<<14)|(1<<16);
    GPBDAT = (1<<5)|(1<<6)|(1<<7)|(1<<8);
}
void judge_led(char *recv)
{
    if(strcmp(recv,"L10")==0)
        {
           GPBDAT = (1<<5)|(1<<6)|(1<<7)|(1<<8);
        }
        else if(strcmp(recv,"L11")==0)
        {
           GPBDAT = (0<<5)|(1<<6)|(1<<7)|(1<<8);
        }
        else if(strcmp(recv,"L21")==0)
        {
           GPBDAT = (1<<5)|(0<<6)|(1<<7)|(1<<8);
        }
        else if(strcmp(recv,"L20")==0) 
        {
           GPBDAT = (1<<5)|(1<<6)|(1<<7)|(1<<8); 
        }
        else if(strcmp(recv,"L31")==0) 
        {
           GPBDAT = (1<<5)|(1<<6)|(0<<7)|(1<<8); 
        }
        else if(strcmp(recv,"L30")==0) 
        {
           GPBDAT = (1<<5)|(1<<6)|(1<<7)|(1<<8); 
        }
        else if(strcmp(recv,"L41")==0) 
        {
           GPBDAT = (1<<5)|(1<<6)|(1<<7)|(0<<8); 
        }
        else if(strcmp(recv,"L40")==0) 
        {
           GPBDAT = (1<<5)|(1<<6)|(1<<7)|(1<<8); 
        }
}
int main(void)
{
    char recv[4]={0};

  uart0_init();
    led_init();

    while(1)
    {    
      uart0_recvstring(recv,3);  
        uart0_sendstring(recv);
        delay(0x2000);

        judge_led(recv);

        memset(recv,0,strlen(recv)+1);
    }
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324809890&siteId=291194637