历史上的今天
今天是:2024年10月14日(星期一)
2018年10月14日 | Tiny4412的Uart操作
2018-10-14 来源:eefocus
#include "regs.h"
void enable_mmu(unsigned long ttb);
void init_ttb(unsigned long *ttb_base);
void mmap(unsigned long *ttb_base, unsigned long va, unsigned long pa);
void memset(char *buf, char ch, int size);
void memcpy(char *dst, char *src, int size);
void do_irq(unsigned long regs[]);
void uart3_putc(unsigned char ch);
unsigned char uart3_getc(void);
void uart3_puts(char *s);
void uart3_gets(unsigned char *s);
void (*printf)(char *, ...) = 0x43e11434;
void main(void)
{
init_uart();
uart3_puts("\n------------welcome--------------\n");
while(1) {
unsigned char cmd[512];
uart3_puts("[ Li Baizhang @Yogurt]# ");
uart3_gets(cmd);
uart3_puts(cmd);
uart3_puts("is not supported.\n");
}
}
void init_uart(void)
{
//配置引脚
GPA1CON &= ~(0xff << 16);
GPA1CON |= (0x22 << 16);
//SCLK_user_t == 800M
//DIVuart3 = 7
//SCLKuart3 = 800 / (7 + 1) == 100M
ULCON3 = 3 ; //8N1
UCON3 = 1 | ( 1 << 2); //接收和发送都设为1:中断或者轮询模式
UFCON3 = 0; //禁用FIFO
// 54.25 - 1 = 53.3
UBRDIV3 = 0x35;
UFRACVAL3 = 0x4;
}
void uart3_putc(unsigned char ch)
{
while(!(UTRSTAT3 & ( 1 << 1)));
UTXH3 = ch;
}
unsigned char uart3_getc(void)
{
unsigned char ch;
while(!(UTRSTAT3 & ( 1 << 0)));
ch = URXH3;
return ch;
}
void uart3_puts(char *s)
{
while(*s) {
uart3_putc(*s);
if (*s == '\n') {
uart3_putc('\r');
}
s ++;
}
}
void uart3_gets(unsigned char *s)
{
unsigned char ch = 0;
while(1) {
ch = uart3_getc();
uart3_putc(ch);
if ((ch == '\r')) {
uart3_putc('\n');
break;
}
*s = ch;
s ++;
}
*s = 0;
}
void do_irq(unsigned long regs[])
{
printf("PWM Timer0: Time Out\n");
TINT_CSTAT |= (1 << 5);
}
void enable_mmu(unsigned long ttb)
{
unsigned long c1_flags;
init_ttb(ttb);
c1_flags = 1 | (1 << 3) | ( 1 << 11) | ( 1 << 13) | (1 << 28);
__asm__ __volatile__ (
"mvn r0, #0 \n"
"mcr p15, 0, r0, c3, c0, 0\n"
"mcr p15, 0, %1, c2, c0, 0\n" //configure ttb
"mrc p15, 0, r0, c1, c0, 0\n"
"orr %0, r0, %0\n"
"mcr p15, 0, %0, c1, c0, 0\n" //enable mmu
:
: "r" (c1_flags), "r" (ttb)
: "r0"
);
}
void init_ttb(unsigned long *ttb_base)
{
unsigned long va, pa;
for (va = 0x00000000; va < 0x10000000; va += 0x100000) { //Others
pa = va;
ttb_base[ va >> 20] = (pa & 0xfff00000) | 2;
}
for (va = 0x10000000; va < 0x14000000; va += 0x100000) { //SFR
pa = va;
ttb_base[ va >> 20] = (pa & 0xfff00000) | 2;
}
for (va = 0x40000000; va < 0x80000000; va += 0x100000) { //DRAM
pa = va;
ttb_base[ va >> 20] = (pa & 0xfff00000) | 2;
}
}
void mmap(unsigned long *ttb_base, unsigned long va, unsigned long pa)
{
ttb_base[ va >> 20] = (pa & 0xfff00000) | 2;
}
void memset(char *buf, char ch, int size)
{
int i;
for (i = 0; i < size; i ++)
buf[i] = ch;
}
void memcpy(char *dst, char *src, int size)
{
int i;
for (i = 0; i < size; i ++)
dst[i] = src[i];
}
__asm__ (
"vectors:\n"
"b reset\n"
"b und\n"
"b swi\n"
"b pre_abt\n"
"b dat_abt\n"
".word 0\n"
"b irq\n"
"b fiq\n"
"reset:\n"
"und:\n"
"mov sp, #0x74000000\n"
"stmfd sp!, {r0-r12, lr}\n"
"mov r0, sp\n"
"mov r3, #0x74000000\n"
"ldr r3, [r3]\n"
"blx r3\n"
"mov sp, #0x74000000\n"
"ldmea sp, {r0-r12, pc}^\n"
"swi:\n"
"pre_abt:\n"
"dat_abt:\n"
"fiq:\n"
"irq:\n"
"mov sp, #0x75000000\n"
"sub lr, lr, #4 \n"
"stmfd sp!, {r0-r12, lr}\n"
"mov r0, sp\n"
"mov r3, #0x75000000\n"
"ldr r3, [r3]\n"
"blx r3\n"
"mov sp, #0x75000000\n"
"ldmea sp, {r0-r12, pc}^\n"
"EOV:\n"
"vectors_start:\n"
".word vectors\n"
"vectors_end:\n"
".word EOV\n"
);
===================================================================
Makefile文件:
default:
arm-linux-gcc -c test.c -o test.o
arm-linux-ld -Ttext=0x70003000 test.o -o test
arm-linux-objcopy -O binary test test.bin
clean:
rm -f test.o test test.bin *~
==============================================================
上一篇:Tiny4412的LCD操作
史海拾趣
|
最近在研究一块板子,就是用书上说的tftp、nfs之类的方法,现在把文件系统已经移到了SD卡上,但板子加电启动的时候中间还是要经过漫长的一段过程……最后再找SD卡挂载上面得fs…… Sending DHCP requests ...eth0: no IPv6 routers present ... t ...… 查看全部问答> |
|
有谁在 vista x64 下 安装过 passthru 驱动的,来指点下 我使用微软提供的 WDK 6000 bindview 程序(超级用户权限, X64的版本)在 vista x64 下安装 passthru 驱动 发现,只有使用 pncClassSetup->SelectAndInstall 方法才能反复安装成功, pncClassSetup->Install 只能在没安装过 自己驱动的机器上安装 ...… 查看全部问答> |
|
如题,选用的是Altera的Cyclone芯片,具体型号是EP1C12,有点搞不清楚IO输出电平,看资料好像有LVTTL,LVCMOS等形式的,我的电路输出接口要求是用OC门输出,打算加入一篇74LS06或者74LS04,但是不知道输入的电平是否匹配。 有人用过FPGA输出OC门么 ...… 查看全部问答> |
|
如果不是宽字符可以用长度辨别 但是在宽字符下不管是中文还是英文都是 长度都是1 这个怎么辨别是中文呢? 还有 如果我要出字符串中搜索到是否含有某个汉字 这个是通过怎么搜呢? 我在 edit控件中输入 方 然后把这个方放入wchar_t *st ...… 查看全部问答> |
|
wince 5/6能访问asp的商务网站么?有可能么? 我想在以下的开发板上跑wince 5或6,做商务网站客户端 通过有线或无线网卡浏览asp的商务网站可行不? 硬件平台: arm 2410 sdram &nb ...… 查看全部问答> |
|
如题,EPIAddressMapSetEPIConfigSDRAMSetEPIAddressMapSet这些函数的使用说明找不到啊。请有的兄弟给分享下。先谢过了。… 查看全部问答> |
|
小弟我虚心请教,跪求各位高手解答!在线等!!!!!!! 在线等!!!!!!! 小弟我虚心请教,跪求各位高手解答。我想用单片机实现电压的转换。大致要求如下: 输出端有2个:x和y. 输入端为p1到p9. p1,p2,p3为一组,p4,p5,p6为一组,p7,p8,p9为一组。p1端输入5v电压时,x端输出5v,y端输出0v;p3端输入5v时,x端输 ...… 查看全部问答> |




