13.UART串口驱动

一、串口UART

​ 串口看手册介绍具有异步收发功能…一大串不说了。可以将数据显示在终端打印出来,我们主要作用用于调试工具。

​ 对于编程,只需要驱动TXD与RXD寄存器。它们分别是对于数据的收发存储的register。

​ 对于串口内部结构,而言一个收一个发。编程而言设置时钟源以及设置各类寄存器,对于收发数据挂靠DCE/DTE接口中,我们需要使用TX_DATA,RX_DATA.。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tuks2d5C-1590056605196)(\图片\20_UART_Init.png)]

​		[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TGj1wvuT-1590056605204)(\图片\19_UART.png)]

二、串口寄存器

​ UART_URxD寄存器保存串口接收的数据

​ UART_UT XD寄存器用于发送数据。

​ UART_UCR1 设置bit 0, 14, UCR2寄存器设置 bit 0 ,1 ,2 ,5 , 6, 7, 8 ,UCR3 bit 2 必须设置为1。

​ UART_UFCR 的bit 9-7设置分频值。UART的时钟源是PLL3/6=80M

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GcZg21ko-1590056605207)(\图片\18_UARTCLK.png)]

​ UART_UFCR,UART_BIR, UART_BMR寄存器决定了波特率。

​ UART_USR2寄存器的状态寄存。

三、串口程序

bsp_uart.c
/*115200 Baut Rate*/
void Uart_Init_115200(UART_Type *base)
{
    CCM->CSCDR1 &= ~(1 << 6);
    CCM->CSCDR1 &= ~0x3f;
    Uart_IO_Init(base);

    Uart_Disable(base);
    Uart_Reset(base);
    /*Configure UART*/
    base->UCR1 = 0;
    base->UCR1 &= ~(1<<14);
    
    base->UCR2 = 0;
    base->UCR2 |= (1<<1) | (1<<2) | (1<<5) | (1<<14) ;
    
    base->UCR3 |= (1<<2);
    /*Configure BautRate*/
    base->UFCR &= ~(7 << 7);
    base->UFCR |= (5<<7);      //1 divide prescale
    base->UBIR = 71;
    base->UBMR = 3124;

    Uart_Enable(base);
}

/*Uart1 IO Init*/
void Uart_IO_Init(UART_Type *base){
    unsigned char uart = 0;
    if(base == UART1)   uart = 1;
    switch(uart){
        case 1:
            IOMUXC_SetPinMux(IOMUXC_UART1_TX_DATA_UART1_TX , 0);
            IOMUXC_SetPinMux(IOMUXC_UART1_RX_DATA_UART1_RX , 0);
            
            IOMUXC_SetPinConfig(IOMUXC_UART1_TX_DATA_UART1_TX , 0x10b0);
            IOMUXC_SetPinConfig(IOMUXC_UART1_RX_DATA_UART1_RX , 0x10b0);
            break;
    }
}
/*Disable Uart*/
void Uart_Disable(UART_Type *base){
    base->UCR1 &= ~(1<<0);
}
/*Enable Uart*/
void Uart_Enable(UART_Type *base){
    base->UCR1 |= (1<<0);
}
/*Reset Uart*/
void Uart_Reset(UART_Type *base){
    base->UCR2 &= ~(1<<0);
    while( (base->UCR2 & 0x1 ) == 0 );
}
/*Transfer one char*/
void putc(unsigned char c)
{
    while(((UART1->USR2 >> 3) & 0x1) == 0);     //Idle State
    UART1->UTXD = c;
}

unsigned char getc(void)
{
    while(( UART1->USR2 & 0X1 ) == 0);
    return UART1->URXD;
}

void puts(char *str){
    char *p = str;
    while(*p){
        putc(*p++);
    }
}

四、移植stdio库函数

​ 通过移植stdio库可以使用printf函数,通过串口直接打印输出。

​ 前提:移植好交叉编译工具

​ 1.将stdio库移植入程序中.

​ 2.修改文件索引将stdio/include添加进来

​ 3.修改Makefile

LIBPATH		:= -lgcc -L /usr/local/toolchain/arm-gcc/lib/gcc/arm-linux-gnueabihf/4.9.3
#在链接过程中假如索引
$(LD) -Timx6u.lds -o $(TARGET).elf $^ $(LIBPATH)
#在INCLUDE,SRCDIRS中添加stdio.h的索引

#由于引入putc函数,所以加入-fno-builtin引进库的覆盖。
$(SOBJS) : obj/%.o : %.S
	$(CC) -Wall -nostdlib -fno-builtin -c -O2 $(INCLUDE) -o $@ $<
#  -Wa,-mimplicit-it=thumb  是由于
$(COBJS) : obj/%.o : %.c
	$(CC) -Wall -Wa,-mimplicit-it=thumb -nostdlib -fno-builtin -c -O2 $(INCLUDE) -o $@ $<

​ 4.会发现编译错误之类的,缺少raise函数

那就添加raise空函数

​ 然后就可以用printf函数了,但是必须要添加标准io的头文件。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值