[国嵌攻略][056][串口驱动程序设计]
初始化串口
1.配置引脚功能
在原理图上找到串口引脚,配置成RXD和TXD功能
2.设置数据格式
ULCON(0x50000000)用来设置数据格式
3.设置工作模式
在操作系统中,串口一般工作在中断模式或DMA模式,但是在引导中串口一般工作在轮询模式,UCON(0x50000004)用来设置工作模式
4.设置波特率
UBRDIV(0x50000028)用来设置波特率,串口使用的时钟是PCLK。
UBRDIV = (int)(PCLK/BAUD*16)-1
发送数据
1.判断发送缓冲是否为空
UTRSTAT(0x50000010)的第2位用来判断发送FIFO是否为空
2.发送数据
UTXH(0x50000020)用来发送数据
接收数据
1.判断接收缓冲是否不为空
UTRSTAT(0x50000010)的第1位用来判断接收FIFO是否不为空
2.接收数据
URXH(0x50000024)用来接收数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | /******************************************************************** *名称:uart *作者:D *时间:2015.11.08 *功能:串口驱动 ********************************************************************/ /******************************************************************** * 宏定义 ********************************************************************/ #define GPHCON ( (*(volatile unsigned long *)0x56000070) ) //GPH组控制寄存器 #define ULCON0 ( (*(volatile unsigned long *)0x50000000) ) //UART0线控制寄存器 #define UCON0 ( (*(volatile unsigned long *)0x50000004) ) //UART0控制寄存器 #define UBRDIV0 ( (*(volatile unsigned long *)0x50000028) ) //UART0波特率分频寄存器 #define UTRSTAT0 ( (*(volatile unsigned long *)0x50000010) ) //UART0发送接收状态寄存器 #define UTXH0 ( (*(volatile unsigned long *)0x50000020) ) //UART0发送接缓冲寄存器 #define URXH0 ( (*(volatile unsigned long *)0x50000024) ) //UART0接收接缓冲寄存器 #define PCLK 50000000 //PCLK=1/8*FCLK=50MHz #define BUAD 115200 //波特率 /******************************************************************** * 函数原型声明 ********************************************************************/ /******************************************************************** *名称:init_uart *功能:初始化串口 *********************************************************************/ void init_uart(){ //配置串口引脚 GPHCON &= ~(0xF<<4); //清零GPH[3-2]:0000 GPHCON |= 0xA<<4; //设置GPH2:10 TXD[0],GPH3:10 RXD[0] //设置数据格式 ULCON0 = 0x00000003; //设置word length[1-0]:11 8bit, number of stop bit:0 0bit, parity mode:000 no //设置工作模式 UCON0 = 0x00000005; //设置recevi mode:01, transmit mode:01 polling mode, clock selection:00 PCLK //设置波特率 UBRDIV0 = ( int )(PCLK/(BUAD*16))-1; } /******************************************************************** *名称:putc_uart *参数: ch 发送字符 *返回: none *功能:发送数据 *********************************************************************/ void putc_uart(unsigned char ch){ //等待发送缓冲为空 while ( !(UTRSTAT0&(1<<2)) ); //等待发送缓冲和移位寄存器都为空 //发送数据 UTXH0 = ch; } /******************************************************************** *名称:getc_uart *参数: none *返回: ch 接收字符 *功能:接收数据 *********************************************************************/ unsigned char getc_uart(){ unsigned char ch; //等待接收缓冲不为空 while ( !(UTRSTAT0&(1<<0)) ); //接收数据 ch = URXH0; return ch; } |
1 2 3 4 5 6 7 8 9 10 11 | while (1){ ch = getc_uart(); if (ch == 0x0D || ch == 0x0A){ //如果输入的是回车或换货,那么输出回车和换行 putc_uart(0x0D); putc_uart(0x0A); } else { putc_uart(ch); } } |
分类:
嵌入式
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术