示例代码21.3.1 bsp_uart.h文件代码
1 #ifndef _BSP_UART_H
2 #define _BSP_UART_H
3 #include "imx6ul.h"
4/***************************************************************
5 Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
6文件名 : bsp_uart.h
7作者 : 左忠凯
8版本 : V1.0
9描述 : 串口驱动文件头文件。
10其他 : 无
11论坛 : www.openedv.com
12日志 : 初版V1.0 2019/1/15 左忠凯创建
13 ***************************************************************/
14
15/* 函数声明 */
16void uart_init(void);
17void uart_io_init(void);
18void uart_disable(UART_Type *base);
19void uart_enable(UART_Type *base);
20void uart_softreset(UART_Type *base);
21void uart_setbaudrate(UART_Type *base,
unsignedint baudrate,
unsignedint srcclock_hz);
22void putc(unsignedchar c);
23void puts(char*str);
24unsignedchar getc(void);
25void raise(int sig_nr);
26
27 #endif
文件bsp_uart.h内容很简单,就是一些函数声明。继续在文件bsp_uart.c中输入如下所示内容:
示例代码21.3.2 bsp_uart.c文件代码
/***************************************************************
Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
文件名 : bsp_uart.c
作者 : 左忠凯
版本 : V1.0
描述 : 串口驱动文件。
其他 : 无
论坛 : www.openedv.com
日志 : 初版V1.0 2019/1/15 左忠凯创建
***************************************************************/
1 #include "bsp_uart.h"
2
3/*
4 * @description : 初始化串口1,波特率为115200
5 * @param : 无
6 * @return : 无
7 */
8void uart_init(void)
9{
10/* 1、初始化串口IO */
11 uart_io_init();
12
13/* 2、初始化UART1 */
14 uart_disable(UART1); /* 先关闭UART1 */
15 uart_softreset(UART1); /* 软件复位UART1 */
16
17 UART1->UCR1 =0; /* 先清除UCR1寄存器 */
18 UART1->UCR1 &=~(1<<14); /* 关闭自动波特率检测 */
19
20/*
21 * 设置UART的UCR2寄存器,设置字长,停止位,校验模式,关闭硬件流控
22 * bit14: 1 忽略RTS引脚
23 * bit8: 0 关闭奇偶校验
24 * bit6: 0 1位停止位
25 * bit5: 1 8位数据位
26 * bit2: 1 打开发送
27 * bit1: 1 打开接收
28 */
29 UART1->UCR2 |=(1<<14)|(1<<5)|(1<<2)|(1<<1);
30 UART1->UCR3 |=1<<2; /* UCR3的bit2必须为1 */
31
32/*
33 * 设置波特率
34 * 波特率计算公式:Baud Rate = Ref Freq / (16 * (UBMR + 1)/(UBIR+1))
35 * 如果要设置波特率为115200,那么可以使用如下参数:
36 * Ref Freq = 80M 也就是寄存器UFCR的bit9:7=101, 表示1分频
37 * UBMR = 3124
38 * UBIR = 71
39 * 因此波特率= 80000000/(16 * (3124+1)/(71+1))
40 * = 80000000/(16 * 3125/72)
41 * = (80000000*72) / (16*3125)
42 * = 115200
43 */
44 UART1->UFCR =5<<7; /* ref freq等于ipg_clk/1=80Mhz */
45 UART1->UBIR =71;
46 UART1->UBMR =3124;
47
48 #if0
49 uart_setbaudrate(UART1,115200,80000000);/* 设置波特率 */
50 #endif
51
52 uart_enable(UART1);/* 使能串口 */
53}
54
55/*
56 * @description : 初始化串口1所使用的IO引脚
57 * @param : 无
58 * @return : 无
59 */
60void uart_io_init(void)
61{
62/* 1、初始化串口IO
63 * UART1_RXD -> UART1_TX_DATA
64 * UART1_TXD -> UART1_RX_DATA
65 */
66 IOMUXC_SetPinMux(IOMUXC_UART1_TX_DATA_UART1_TX,0);
67 IOMUXC_SetPinMux(IOMUXC_UART1_RX_DATA_UART1_RX,0);
68 IOMUXC_SetPinConfig(IOMUXC_UART1_TX_DATA_UART1_TX,0x10B0);
69 IOMUXC_SetPinConfig(IOMUXC_UART1_RX_DATA_UART1_RX,0x10B0);
70}
71
72/*
73 * @description : 波特率计算公式,
74 * 可以用此函数计算出指定串口对应的UFCR,
75 * UBIR和UBMR这三个寄存器的值
76 * @param - base : 要计算的串口。
77 * @param - baudrate : 要使用的波特率。
78 * @param - srcclock_hz : 串口时钟源频率,单位Hz
79 * @return : 无
80 */
81void uart_setbaudrate(UART_Type *base,
unsignedint baudrate,
unsignedint srcclock_hz)
82{
83uint32_t numerator =0u;
84uint32_t denominator =0U;
85uint32_t divisor =0U;
86uint32_t refFreqDiv =0U;
87uint32_t divider =1U;
88uint64_t baudDiff =0U;
89uint64_t tempNumerator =0U;
90uint32_t tempDenominator =0u;
91
92/* get the approximately maximum divisor */
93 numerator = srcclock_hz;
94 denominator = baudrate <<4;
95 divisor =1;
96
97while(denominator !=0)
98{
99 divisor = denominator;
100 denominator = numerator % denominator;
101 numerator = divisor;
102}
103
104 numerator = srcclock_hz / divisor;
105 denominator =(baudrate <<4)/ divisor;
106
107/* numerator ranges from 1 ~ 7 * 64k */
108/* denominator ranges from 1 ~ 64k */
109if((numerator >(UART_UBIR_INC_MASK *7))||(denominator >
UART_UBIR_INC_MASK))
110{
111uint32_t m =(numerator -1)/(UART_UBIR_INC_MASK *7)+1;
112uint32_t n =(denominator -1)/ UART_UBIR_INC_MASK +1;
113uint32_t max = m > n ? m : n;
114 numerator /= max;
115 denominator /= max;
116if(0== numerator)
117{
118 numerator =1;
119}
120if(0== denominator)
121{
122 denominator =1;
123}
124}
125 divider =(numerator -1)/ UART_UBIR_INC_MASK +1;
126
127switch(divider)
128{
129case1:
130 refFreqDiv =0x05;
131break;
132case2:
133 refFreqDiv =0x04;
134break;
135case3:
136 refFreqDiv =0x03;
137break;
138case4:
139 refFreqDiv =0x02;
140break;
141case5:
142 refFreqDiv =0x01;
143break;
144case6:
145 refFreqDiv =0x00;
146break;
147case7:
148 refFreqDiv =0x06;
149break;
150default:
151 refFreqDiv =0x05;
152break;
153}
154/* Compare the difference between baudRate_Bps and calculated
155 * baud rate. Baud Rate = Ref Freq / (16 * (UBMR + 1)/(UBIR+1)).
156 * baudDiff = (srcClock_Hz/divider)/( 16 * ((numerator /
divider)/ denominator).
157 */
158 tempNumerator = srcclock_hz;
159 tempDenominator =(numerator <<4);
160 divisor =1;
161/* get the approximately maximum divisor */
162while(tempDenominator !=0)
163{
164 divisor = tempDenominator;
165 tempDenominator = tempNumerator % tempDenominator;
166 tempNumerator = divisor;
167}
168 tempNumerator = srcclock_hz / divisor;
169 tempDenominator =(numerator <<4)/ divisor;
170 baudDiff =(tempNumerator * denominator)/ tempDenominator;
171 baudDiff =(baudDiff >= baudrate)?(baudDiff - baudrate):
(baudrate - baudDiff);
172
173if(baudDiff
174{
175 base->UFCR &=~UART_UFCR_RFDIV_MASK;
176 base->UFCR |= UART_UFCR_RFDIV(refFreqDiv);
177 base->UBIR = UART_UBIR_INC(denominator -1);
178 base->UBMR = UART_UBMR_MOD(numerator / divider -1);
179}
180}
181
182/*
183 * @description : 关闭指定的UART
184 * @param – base : 要关闭的UART
185 * @return : 无
186 */
187void uart_disable(UART_Type *base)
188{
189 base->UCR1 &=~(1<<0);
190}
191
192/*
193 * @description : 打开指定的UART
194 * @param – base : 要打开的UART
195 * @return : 无
196 */
197void uart_enable(UART_Type *base)
198{
199 base->UCR1 |=(1<<0);
200}
201
202/*
203 * @description : 复位指定的UART
204 * @param – base : 要复位的UART
205 * @return : 无
206 */
207void uart_softreset(UART_Type *base)
208{
209 base->UCR2 &=~(1<<0); /* 复位UART */
210while((base->UCR2 &0x1)==0); /* 等待复位完成 */
211}
212
213/*
214 * @description : 发送一个字符
215 * @param - c : 要发送的字符
216 * @return : 无
217 */
218void putc(unsignedchar c)
219{
220while(((UART1->USR2 >>3)&0X01)==0);/* 等待上一次发送完成 */
221 UART1->UTXD = c &0XFF; /* 发送数据 */
222}
223
224/*
225 * @description : 发送一个字符串
226 * @param - str : 要发送的字符串
227 * @return : 无
228 */
229void puts(char*str)
230{
231char*p = str;
232
233while(*p)
234 putc(*p++);
235}
236
237/*
238 * @description : 接收一个字符
239 * @param : 无
240 * @return : 接收到的字符
241 */
242unsignedchar getc(void)
243{
244while((UART1->USR2 &0x1)==0); /* 等待接收完成 */
245return UART1->URXD; /* 返回接收到的数据 */
246}
247
248/*
249 * @description : 防止编译器报错
250 * @param : 无
251 * @return : 无
252 */
253void raise(int sig_nr)
254{
255
256}