一、串口UART
串口看手册介绍具有异步收发功能…一大串不说了。可以将数据显示在终端打印出来,我们主要作用用于调试工具。
对于编程,只需要驱动TXD与RXD寄存器。它们分别是对于数据的收发存储的register。
对于串口内部结构,而言一个收一个发。编程而言设置时钟源以及设置各类寄存器,对于收发数据挂靠DCE/DTE接口中,我们需要使用TX_DATA,RX_DATA.。
二、串口寄存器
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的头文件。