6410 设置时钟频率,uart0

接到上一篇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();
void puts(const char *str);
void putHex(unsigned int nNum);

#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;
}

void puts(const char *str)
{
	while (*str)
	{
		putchar(*str);
		str++;
	}
}

void putHex(unsigned int nNum)
{
	int i;
	unsigned char arr[8];
	
	for (i=0; i<8; i++)
	{
		arr[i] = nNum & 0xf;
		nNum >>= 4;
	}
	
	puts("0x");
	for (i=7; i>=0; i--)
	{	
		if (arr[i]>=0 && arr[i]<=9)
		{
			putchar(arr[i] + '0');
		}
		else if(arr[i] >= 0xA && arr[i] <= 0xF)
		{
			putchar(arr[i] - 0xA + 'A');
		}
	}
}

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();
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值