接到上一篇OK6410 点亮LED,按键点灯,按键让蜂鸣器响文章继续设置cpu时钟和串口0.
添加clock.S文件如下,在start.S调用main函数前调用clock_init。设置 cpu频率为532MHZ,hclk为133MHZ,pclk为66.5MHZ
//设置时钟
.globl clock_init
clock_init:
//设置lock_time
ldr r0, =0x7e00f000
ldr r1, =0xffff
str r1, [r0]
str r1, [r0, #4]
str r1, [r0, #8]
ldr r0, =0x7e00f900
ldr r1, [r0]
bic r1, r1, #0xc0
str r1, [r0]
loop1:
ldr r0, =0x7e00f900
ldr r1, [r0]
and r1, r1, #0xf00
cmp r1, #0
bne loop1
ldr r0, =0x7e00f020
ldr r1, =(0)|(0<<4)|(1<<8)|(1<<9)|(3<<12)
str r1, [r0]
ldr r0, =0x7e00f00c
ldr r1, =(1<<31)|(266<<16)|(3<<8)|(1)
str r1, [r0]
ldr r0, =0x7e00f010
ldr r1, =(1<<31)|(266<<16)|(3<<8)|(1)
str r1, [r0]
ldr r0, =0x7e00f01c
ldr r1, =3
str r1, [r0]
mov pc, lr
可以看到led的闪烁加快了。
初始化uart0,添加uart目录添加uart0.c,uart0.h,如下
//uart0.h
#ifndef __UART0_H_
#define __UART0_H_
void uart0_init();
void putchar(char ch);
char getchar();
#endif //__UART0_H_
//uart0.c
#include "../s3c6410.h"
void uart0_init()
{
//配置引脚为Tx,Dx
//GPA0 [3:0] 0010 = UART RXD[0]
//GPA1 [7:4] 0010 = UART TXD[0]
GPACON_REG &= ~(0xff);
GPACON_REG |= 0x22;
ULCON0_REG = 0x3;
UCON0_REG = (0x01<<0)|(0x01<<2)|(2<<10);
UFCON0_REG = 1;
UMCON0_REG = 0;
//DIV_VAL = (PCLK / (bps x 16 ) ) −1 = 35.08
UBRDIV0_REG = 35;
UDIVSLOT0_REG = 0x0080;
}
void putchar(char ch)
{
while ( (UFSTAT0_REG & (1<<14)));
UTXH0_REG = ch;
}
char getchar()
{
while ( (UFSTAT0_REG & 0x7f) == 0 );
return URXH0_REG;
}
main.c中添加uart0_test()来通过串口得到数据控制led。
void uart0_test()
{
char ch;
while (1)
{
ch = getchar();
putchar(ch);
if (ch == '1')
{
led_on(1);
}
else if (ch == '2')
{
led_on(2);
}
else if (ch == '3')
{
led_on(3);
}
else if (ch == '4')
{
led_on(4);
}
else if (ch == '5')
{
led_all_on();
}
else
{
led_all_off();
}
}
}