lesson05-设计主函数实现串口的初始化和运行

根据boot.S里的内容,最后会跳转到kernel_main里,在这里会进行设置gpio引脚配置串口的初始化,然后循环运行,不断打印接受到的内容。


//主函数
void kernel_main()
{
    //串口初始化
    uart_init();
    //串口发送hello world
    uart_send_string("Hello word!\n")
    //循环发送串口接收到的字符
    while(1)
    {
        uart_send(uart_rec());
    }
}

函数的实现如下:


#include "peripherals/gpio.h"
#include "peripherals/mini_uart.h"

#define GPIO_MODE_INPUT     0x000
#define GPIO_MODE_OUTPUT    0x001
#define GPIO_MODE_FUNCTION0 0x100
#define GPIO_MODE_FUNCTION1 0x101
#define GPIO_MODE_FUNCTION2 0x110
#define GPIO_MODE_FUNCTION3 0x111
#define GPIO_MODE_FUNCTION4 0x011
#define GPIO_MODE_FUNCTION5 0x010

#define GPIO_MODE_RESET     0x111

#define GPIO_PIN_10_BIT 0
#define GPIO_PIN_11_BIT 3
#define GPIO_PIN_12_BIT 6
#define GPIO_PIN_13_BIT 9
#define GPIO_PIN_14_BIT 12
#define GPIO_PIN_15_BIT 15
#define GPIO_PIN_16_BIT 18
#define GPIO_PIN_17_BIT 21
#define GPIO_PIN_18_BIT 24
#define GPIO_PIN_19_BIT 27

//串口初始化函数
void uart_init()
{
    //gpio14设置为uart1-tx gpio15设置位uart1-rx
    //通过设置寄存器实现
    unsigned int selector;

    selector = get32(GPFSEL1);
    selector &= ~(GPIO_MODE_RESET<<GPIO_PIN_14_BIT);
    selector |= GPIO_MODE_FUNCTION5<<GPIO_PIN_14_BIT;

    selector &= ~(GPIO_MODE_RESET<<GPIO_PIN_15_BIT);
    selector |= GPIO_MODE_FUNCTION5<<GPIO_PIN_15_BIT;

    put32(GPFSEL1, selector);

    put32(GPPUD, 0);
    delay(150);
    put(GPPUDCLK0, (1<<14)|(1<<15));
    delay(150);
    put32(GPPUDCLK0, 0);

    put32(AUX_ENABLES, 1);
    put32(AUX_MU_CNTL_REG, 0);
    put32(AUX_MU_IER_REG, 0);
    put32(AUX_MU_LCR_REG, 3);
    put32(AUX_MU_MCR_REG, 0);
    put32(AUX_MU_BAUD_REG, 270);
    put32(AUX_MU_IIR_REG, 6);

    put32(AUX_MU_CNTL_REG, 3);

}

posted @ 2024-09-13 22:37  蔚蓝蔷薇  阅读(1)  评论(0编辑  收藏  举报