嵌入式爱好者

查看: 3968|回复: 6

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

[复制链接]

1

主题

1

帖子

10

积分

扫一扫,手机访问本帖
发表于 2013-6-7 23:15:22 | 显示全部楼层 |阅读模式
程序如下:
#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[255];
    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函数位置。难道是初始化的问题?求大神解答。两个初始化函数分别测试过没有问题。




回复

使用道具 举报

0

主题

972

帖子

900

积分

i.MX6Q通行证i.MX6UL通行证TCU通行证AM335x通行证

发表于 2013-6-9 17:12:01 | 显示全部楼层
那楼主可以查查是不是两个函数有冲突的地方,或是某些变量寄存器的配置
点评回复 支持 反对

使用道具 举报

guxlgzs 该用户已被删除
发表于 2013-6-10 11:12:43 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
点评回复 支持 反对

使用道具 举报

0

主题

972

帖子

900

积分

i.MX6Q通行证i.MX6UL通行证TCU通行证AM335x通行证

发表于 2013-6-13 09:03:23 | 显示全部楼层
没初始化堆栈的话是不是调用C函数会出问题呢
技术支持电话:0312-3119192
技术支持邮箱:Hardware@forlinx.com
点评回复 支持 反对

使用道具 举报

guxlgzs 该用户已被删除
发表于 2013-6-13 17:08:40 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
点评回复 支持 反对

使用道具 举报

0

主题

972

帖子

900

积分

i.MX6Q通行证i.MX6UL通行证TCU通行证AM335x通行证

发表于 2013-6-14 08:44:32 | 显示全部楼层
guxlgzs 发表于 2013-6-13 17:08
嗯  纯裸机状态下不初始化堆栈会出现程序无法返回或者返回后运行错误

楼上正解啊~在start.s里边做一下
技术支持电话:0312-3119192
技术支持邮箱:Hardware@forlinx.com
点评回复 支持 反对

使用道具 举报

110

主题

1358

帖子

1443

积分

A40i/T3/T507/T527通行证i.MX6Q通行证i.MX6UL通行证i.MX8MM通行证i.MX8MP通行证RK3568通行证RK3588通行证RK3399通行证LS1028A通行证G2L通行证LS1012A通行证LS1043A\46A通行证TCU通行证FDU产品通行证FCU1401通行证FCU1301通行证FCU11xx通行证FCU1201通行证FCU2201通行证FCU2301/FCU2302通行证FCU2401通行证5G转接卡通行证FCU3001通行证AM5718通行证Hi3519A通信证AM335x通行证i.MX RT通行证XX18通行证AM62x资料下载FDU070K02\FDU101K02通行证i.MX9352通行证

发表于 2013-6-15 08:46:41 | 显示全部楼层
不知道楼主是怎么调试的,是把bootloader启动后,将裸机代码直接烧写,还是用jlink仿真。你的代码卡在了初始化,是不是对寄存器的声明没有在头文件中声明》楼主建议您吧您的详细过程说下。
该会员没有填写今日想说内容.
点评回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2024-12-23 06:33

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表