540429224 发表于 2013-6-7 23:15:22

苦思已久,关于裸机串口控制LED(自己想的)

程序如下:
#include"s3c2440.h"
#include<stdio.h>
#include<stdarg.h>

char num=1;

void Uart_Init()
{
        //ULCON0 &=0xffffff00;
        //ULCON0 |=0x03;
        //UCON0=0x0805;
        ULCON0=0x03;
        UCON0=0x245; //发送中断为电平方式,接收中断为边沿方式,禁止超时中断,允许产生错误状态中断,禁止回送模式,禁止中止               
                        //信号,传输模式为中断请求模式,接收模式也为中断请求模式。
        UFCON0=0x0;
        UBRDIV0=0x1A;//((int)(400000000/16/baud+0.5)-1);//Baud rate is 115200
       
        GPHUP=0X00;
        GPHCON=(2<<6)|(2<<4);        //选择TXD0 RXD0
}

//*************************
//发送单字节函数
//*************************
void Uart_SendByte(char data)
{
        if(data=='\n')                        //判断是否为回车
        {
                while(!(UTRSTAT0&0x2));        //等待发送数据,寄存器为空
                UTXH0='\r';
        }
        while(!(UTRSTAT0&0x2));                //等待发送数据,寄存器为空
        UTXH0=data;
}

//*************************
//接受单字节函数
//************************
char Uart_ReciveByte()
{
        while(!(UTRSTAT0&0X01));        //等待接受数据
        return URXH0;                                //返回寄存器中的数据
}

//**************************
//发送字符串函数
//**************************
void Uart_SendString(char *p)
{
        while(*p)
                Uart_SendByte(*p++);
}

//**************************
//打印函数
//**************************
void Uart_Printf(char *fmt,...)
{
    va_list ap;
    char str;
    va_start(ap,fmt);
    vsprintf(str,fmt,ap);
    Uart_SendString(str);
    va_end(ap);
}

void LED_Init()
{
        GPBCON|=((1<<10)|(1<<12)|(1<<16)|(1<<20));
        //GPBCON = 0x1dd7fc;
        GPBDAT=((1<<5)|(1<<6)|(1<<8)|(1<<10));
       
        GPBUP=0x00;                //禁止上拉
}

void LED_Light(int n)
{
        Uart_Init();
        LED_Init();
        switch(n)
        {
        case 1:GPBDAT=~(1<<5);
                        break;
        case 2:GPBDAT=~(1<<6);
                        break;
        case 3:GPBDAT=~(1<<8);
                        break;
        case 4:GPBDAT=~(1<<10);
                        break;
        default:GPBDAT=((1<<5)|(1<<6)|(1<<8)|(1<<10));
        }
       
        if(n<5)
                Uart_Printf("nuber %d is lighting\n",n);
        else
                Uart_Printf("none!\n");
}

int main()
{
        Uart_Init();
        LED_Init();
        while(1)
        {
                Uart_Printf("Please enter which light:\n");
                num=Uart_ReciveByte();
                LED_Light(num);
        }
        return 0;
}
在思路上是通过串口接收到所需要点亮的灯号,从而点亮。用ADS仿真的时候卡在了刚进入main函数位置。难道是初始化的问题?求大神解答。两个初始化函数分别测试过没有问题。




飞凌-peacelove 发表于 2013-6-9 17:12:01

那楼主可以查查是不是两个函数有冲突的地方,或是某些变量寄存器的配置

guxlgzs 发表于 2013-6-10 11:12:43

飞凌-peacelove 发表于 2013-6-13 09:03:23

没初始化堆栈的话是不是调用C函数会出问题呢

guxlgzs 发表于 2013-6-13 17:08:40

飞凌-peacelove 发表于 2013-6-14 08:44:32

guxlgzs 发表于 2013-6-13 17:08 static/image/common/back.gif
嗯纯裸机状态下不初始化堆栈会出现程序无法返回或者返回后运行错误

楼上正解啊~在start.s里边做一下

飞凌-路飞 发表于 2013-6-15 08:46:41

不知道楼主是怎么调试的,是把bootloader启动后,将裸机代码直接烧写,还是用jlink仿真。你的代码卡在了初始化,是不是对寄存器的声明没有在头文件中声明》楼主建议您吧您的详细过程说下。
页: [1]
查看完整版本: 苦思已久,关于裸机串口控制LED(自己想的)