arm9 串口实验程序求助!!!!!

发布于 2022-09-28 22:05:49 字数 3188 浏览 14 评论 0

恒丰锐科的arm9板子

这是我自己的串口程序:
#define ULCON0                 (*(volatile unsigned*)0x50000000)
#define UCON0                  (*(volatile unsigned*)0x50000004)
#define UFCON0                (*(volatile unsigned*)0x5000000
#define UMCON0                (*(volatile unsigned*)0x5000000C)
#define UTRSTAT0                        (*(volatile unsigned*)0x50000010)
#define UERSTAT0                        (*(volatile unsigned*)0x50000014)
#define UFSTAT0                (*(volatile unsigned*)0x5000001
#define UMSTAT0                (*(volatile unsigned*)0x5000001C)
#define UTXH0                (*(volatile unsigned*)0x50000020)
#define UBRDIV0                (*(volatile unsigned*)0x5000002
#define WRUTXH0(ch)        (*(volatile unsigned char*)0x50000020)=(unsigned char)(ch)

#define FCLK 203000000
#define HCLK (FCLK/2)
#define PCLK (HCLK/2)
//#define PCLK (HCLK)
#define UCLK 48000000

void putch(char data){
            while(!(UTRSTAT0 & 0x2)){
                if(data == '\n') WRUTXH0('\r');
                else WRUTXH0(data);
        }
}

int main(){
    char* p="hello world!!\n";
    /******** initialize **********/
    ULCON0 = 0x3;
    UCON0 = 0x245;
    UBRDIV0 = ((int)(PCLK/16./115200)-1);
    UFCON0 = 0x0;
    UMCON0 = 0x0;
    /******************************/

    /****** output ****************/
    while(*p)        putch(*p++);

    /******************************/
    return 0;

}

通过bootloader下载到内存上运行(未进任何系统),始终得到的是: Undefined instruction exception!!!!!!!
交叉编译器是crosstools-0.43 编译的arm9tdmi其中的一个,
gcc-4.1.1
cgcc-3.3.6
glibc-2.3.2
binutils-2.16.1
linux-2.6.15.4
hdrs-2.6.12.0

是不是要把中断禁掉???
求高手帮助!!!!!!

[ 本帖最后由 nick811125 于 2007-3-13 21:28 编辑 ]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

颜漓半夏 2022-10-05 22:05:49

是不是要把中断禁掉???

不需要

你这程序是在bootloader之后,加载OS之前运行?
如果排除编译本身的错误,有可能是加载程序时的地址或运行程序时的地址不正确
寄存器地址也有可能不正确

比忠 2022-10-05 22:05:49

楼上的问的在理啊板子上OS起来没?如果市\是linux环境下运行的,你的程序就在用户空间啊,还能直接,内存寻址吗?要通过驱动或其他手段了

迷爱 2022-10-05 22:05:49

原帖由 yidou 于 2007-3-14 09:56 发表于 2楼  
  不需要

你这程序是在bootloader之后,加载OS之前运行?
如果排除编译本身的错误,有可能是加载程序时的地址或运行程序时的地址不正确
寄存器地址也有可能不正确

第一,确实是加载了bootloader后,在加载os之前运行的
第二,寄存器的地址应该是正确的,反复核对过

我想应该是"加载程序时的地址或运行程序时的地址不正确"

不过你能说明白一点吗??? 我是学软件的,对硬件是一知半解-_-!
谢谢!!!

奈何桥上唱咆哮 2022-10-05 22:05:49

新进展:
#define ULCON0                 (*(volatile unsigned*)0x50000000)
#define UCON0                  (*(volatile unsigned*)0x50000004)
#define UFCON0                (*(volatile unsigned*)0x5000000
#define UMCON0                (*(volatile unsigned*)0x5000000C)
#define UTRSTAT0                        (*(volatile unsigned*)0x50000010)
#define UERSTAT0                        (*(volatile unsigned*)0x50000014)
#define UFSTAT0                (*(volatile unsigned*)0x5000001
#define UMSTAT0                (*(volatile unsigned*)0x5000001C)
#define UTXH0                (*(volatile unsigned*)0x50000020)
#define UBRDIV0                (*(volatile unsigned*)0x5000002
#define WRUTXH0(ch)        (*(volatile unsigned char*)0x50000020)=(unsigned char)(ch)

#define FCLK 203000000
#define HCLK (FCLK/2)
#define PCLK (HCLK/2)
//#define PCLK (HCLK)
#define UCLK 48000000

void putch(char data){
            while(!(UTRSTAT0 & 0x2)){
                if(data == '\n') WRUTXH0('\r');
                else WRUTXH0(data);
        }
}

/////////////////////////int main(){
void _start(void){
    char* p="hello world!!\n";
    /******** initialize **********/
    ULCON0 = 0x3;
    UCON0 = 0x245;
    UBRDIV0 = ((int)(PCLK/16./115200)-1);
    UFCON0 = 0x0;
    UMCON0 = 0x0;
    /******************************/

    /****** output ****************/
    while(*p)        putch(*p++);

    /******************************/
   // return 0;

}

arm-9tdmi-linux-gnu-gcc -mlittle-endian -nostdlib -nostdinc -static -o hello uart.c
arm-9tdmi-linux-gnu-objcopy -O binary -S hello hello.bin
这样得到的binary文件hello.bin用串口下载后运行没有出现任何中断, 但串口就是不出东西!!

偏爱自由 2022-10-05 22:05:49

3个解决方法: 最容易的1:ADS下,找一份相关的启动代码再加上你自己的程序就可以跑了
2:研究一下人家ADS下的启动代码,然后做一定的修改
3:在加载os后再跑你的代码,不过,明显,上述代码不能直接运行

逆蝶 2022-10-05 22:05:49

问题是这样的。我在做GPRS,我使用PC上的LINUX中的minicom,设置正确后可以使用AT指令,打电话了。
或者设置完了后,在命令行输入#echo 'ATD******'>/dev/ttyS0,也可以正确连通。
因为我要移植 linux 到2410上,当然没有minicom可用,我需要在命令行来设置串口,包括波特率等,请问如何设置?
因为是新手,请高手指点。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文