正点原子linux串口驱动下载,【正点原子Linux连载】第二十一章UART串口通信实验-摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南 (amobbs.com 阿莫电子论坛)...

示例代码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}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值