arm9 串口实验程序求助!!!!!
恒丰锐科的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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
不需要
你这程序是在bootloader之后,加载OS之前运行?
如果排除编译本身的错误,有可能是加载程序时的地址或运行程序时的地址不正确
寄存器地址也有可能不正确
楼上的问的在理啊板子上OS起来没?如果市\是linux环境下运行的,你的程序就在用户空间啊,还能直接,内存寻址吗?要通过驱动或其他手段了
第一,确实是加载了bootloader后,在加载os之前运行的
第二,寄存器的地址应该是正确的,反复核对过
我想应该是"加载程序时的地址或运行程序时的地址不正确"
不过你能说明白一点吗??? 我是学软件的,对硬件是一知半解-_-!
谢谢!!!
新进展:
#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用串口下载后运行没有出现任何中断, 但串口就是不出东西!!
3个解决方法: 最容易的1:ADS下,找一份相关的启动代码再加上你自己的程序就可以跑了
2:研究一下人家ADS下的启动代码,然后做一定的修改
3:在加载os后再跑你的代码,不过,明显,上述代码不能直接运行
问题是这样的。我在做GPRS,我使用PC上的LINUX中的minicom,设置正确后可以使用AT指令,打电话了。
或者设置完了后,在命令行输入#echo 'ATD******'>/dev/ttyS0,也可以正确连通。
因为我要移植 linux 到2410上,当然没有minicom可用,我需要在命令行来设置串口,包括波特率等,请问如何设置?
因为是新手,请高手指点。