• ARM接口编程—UART(exynos 4412平台)


    UART简介

    • UART

    Universal Asynchronous Receiver Transmitter即通用异步收发器,是一种通用的串行、异步通信总线该总线有两条数据线,可以实现全双工的发送和接收在嵌入式系统中常用于主机与辅助设备之间的通信
    波特率用于描述UART通信时的通信速度,其单位为bps(bit per second)即每秒钟传送的bit的数量
    • UART帧格式

    在这里插入图片描述

    UART寄存器配置

    电路原理图上可以看到CON7连接到UART_AUDIO_TXD和UART_AUDIO_RXD,最后连接到芯片的GPA1_0和GPA1_1引脚上
    在这里插入图片描述

    在这里插入图片描述

    将GPA1_0和GPA1_1引脚设置成UART模式

    在这里插入图片描述

    串口控制寄存器

    设置UART的帧格式,8位数据位,1位停止位,无校验,正常模式
    在这里插入图片描述

    设置UCON接收和发送为轮训模式

    在这里插入图片描述

    串口状态寄存器

    存储各个模式的状态及收发的buffer状态
    在这里插入图片描述
    在这里插入图片描述

    发送/接收寄存器

    在这里插入图片描述

    波特率寄存器

    设置波特率的寄存器,公式为DIV_VAL = UBRDIVn + UFRACVALn/16

    如果想设置波特率为115200,并且时钟频率为40Mhz:

    DIV_VAL = (40000000/(115200 x 16)) – 1
    = 21.7 – 1
    = 20.7
    在这里插入图片描述
    代码:

    #include "exynos_4412.h"
    
    void uart_Init(void)
    {
    	// 将GPA1_0, GPA1_1引脚设置成UART收发模式
    	GPA1.CON &= ~(0xFF) | 0x22;
    
    	// 设置帧格式,8位数据位,1位停止位,无校验位
    	UART2.ULCON2 &= ~(0x7F) | 0x3;
    
    	// 设置串口收发为轮训模式
    	UART2.UCON2 &= ~(0xF) | 0x5;
    
    	// 设置串口波特率:DIV_VAL = (100000000 / (115200 x 16)) – 1 = 53.25
    	UART2.UBRDIV2 = 53;
    	UART2.UFRACVAL2 = 4;
    }
    
    void uart_Send(unsigned char c)
    {
    	// 等待发送缓冲区为空
    	while(!(UART2.UTRSTAT2 & (1 << 1)));
    
    	// 发送数据
    	UART2.UTXH2 = c;
    }
    
    char uart_Revice(void)
    {
    	char ret = 0;
    	// 等待接收缓冲区为1
    	if ((UART2.UTRSTAT2 & 1))
    	{
    		ret = UART2.URXH2;
    		return ret;
    	}
    	
    	return 0;
    }
    
    void uart_Send_Str(char * pstr)
    {
    	while(*pstr != '\0')
    		UART_Send_Byte(*pstr++);
    }
    
    int main()
    {
    	char ret = 0;
    
    	uart_Send_Str("hello world");
    	// 串口初始化
    	uart_Init();
    	while(1)
    	{
    		ret = uart_Revice();
    		if (ret)
    		{
    			uart_Send(ret + 1);
    		}
    	}
    
    	return 0;
    }
    
    • 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
  • 相关阅读:
    澄海区图书馆《乡村振兴战略下传统村落文化旅游设计》许少辉八一新著
    LinkedIn技巧-领英怎么只给选择的好友群发消息?
    数据库和sql语句
    开源项目管理工具Helper的安装及汉化
    Java SE 15 新增特性
    I/O性能与可靠性
    Java入门刷题篇 基础语法>>运算符>>JAVA3四舍五入
    java面向对象(二)
    【数据结构】单链表的尾插法
    Prometheus AlertManager 生产实践-直接根据 to_email label 发 alert 到对应邮箱
  • 原文地址:https://blog.csdn.net/hhltaishuai/article/details/132765478