完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、I.MUX6ULL串口UART
1、串口原理 UART,也就是异步串行收发器,使用UART与外界相连最少只要三条线:TXD(发送)、RXD(接收)和GND(地线)。UART串口的接口电平有TTL和RS-232两种,在正电原子的这款Mini Linux开发板上有CH340芯片,可以实现USB和串口TTL信号之间的转换,这里用到的是UART1,因此在电脑和开发板之间的串口UART通信只需要一条USB线即可。 下图是UART通信格式: 数据线一开始空闲状态的时候为高电平,要传输数据时先将数据线拉低,表示开始传输数据,后面即为要传输的数据(可以通过设置选择数据位数),数据发送完成后,如果使能了奇偶校验,就进行校验,如果关闭则跳过。最后就是停止位(位数可以选择)。 2、I.MUX6U的UART时钟源设置 根据I.MUX6U参考手册中的时钟树图,可以看出UART的时钟源可以通过设置CCM_CSCDR1中的UART_CLK_SEL位来选择是PLL3进行6分频(80MHz)或者是OSC时钟(24MHz)。之后还可以设置该寄存器的UART_CLK_PODF进行1~64分频,产生最终的UART时钟源。 3、I.MUX6U的UART波特率设置 I.MUX6U串口波特率的设置原理基于三个寄存器,分别是UART_UFCR、UART_UBIR和UART_UBMR寄存器。其中UART_UFCR寄存器用到其bit[9:7],可以在UART时钟源的基础上再进行分频。然后再根据公式设置UART_UBIR和UART_UBMR的bit[15:0]。下面为波特率设置的具体公式: 例程中给出了两种波特率设置的方式: ①、根据公式手动配置三个寄存器的值,达到理想的波特率(每次转换不同的波特率需要重新计算配置三个寄存器值的)。 ②、使用波特率配置函数void uart_setbaudrate(UART_Type *base, unsigned int baudrate, unsigned int srcclock_hz);(可以直接将想要的波特率写入函数,函数将自动配置)。 4、其他UART的寄存器的主要功能介绍 ①、UART_URXD寄存器 bit[7:0]保存着串口收到的数据。 ②、UART_UTXD寄存器 bit[7:0]保存着串口要发送的数据。 ③、UART_UCR1寄存器 bit0用来使能和禁止UART,bit14为自动控制波特率使能位(仅进行介绍,并没有使用)。 ④、UART_UCR2寄存器 bit0为软件复位位,为0时复位UART。 bit1,bit2分别是使能UART的接收和发送。 bit5设置数据为长度(0表示7位数据位,1表示8位数据位)。 bit6设置停止位(0表示1位停止位,1表示2位停止位)。 bit7设置奇偶校验(0表示偶校验,1表示奇校验)。 bit8时奇偶校验位的使能位,为1时使能,0时关闭。 ⑤、UART_UCR3寄存器 bit2必须为1(手册中NOTE写到必须一直置1)。 ⑥、UART_USR2寄存器 bit0为1的时候表示有数据可以读取。 bit3为1的时候表示数据发送完成。 UART还有许多其他的寄存器,本例程没有使用到,可以自行查阅。 二、部分例程代码 下面时总的UART初始化的代码。 /* UART1初始化总函数 */ void uart_init(void) { uart_io_init(); /* 初始化UART1的所有IO,包括IO的复用和电气属性设置 */ uart_disable(UART1); /* 关闭UART1,通过置零UART1_UCR1寄存器bit0 */ uart_softreset(UART1); /* 软复位UART1,通过置零UART1_UCR2寄存器bit0 */ /* 配置UART1的数据位、奇偶校验、停止位等等 */ UART1->UCR2 = 0; /* 先清零UCR2寄存器的值 */ UART1->UCR2 |= (1 << 1) | (1 << 2) | (1 << 5) | (1 << 14); UART1->UCR3 |= (1 << 2);} /* UCR3寄存器的bit2必须置1 */ /* 手动配置波特率 */ #if 0 /* 设置波特率为115200 */ UART1->UFCR &= ~(7 << 7); /* 对RFDIV进行清零 */ UART1->UFCR |= (5 << 7); /* 1分频,uart_clk = 80MHz */ UART1->UBIR = 71; UART1->UBMR = 3124; #endif /* 只用函数配置波特率 */ uart_setbaudrate(UART1, 115200, 80000000); uart_enable(UART1); /* 开启UART1,通过置1UART1_UCR1寄存器bit0 */ |
|
|
|
只有小组成员才能发言,加入小组>>
3311 浏览 9 评论
2994 浏览 16 评论
3493 浏览 1 评论
9058 浏览 16 评论
4087 浏览 18 评论
1178浏览 3评论
605浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
599浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2335浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1896浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 00:16 , Processed in 1.524195 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号