UART两个例程分析

UART学习
UART基本概念
在编写具体程序之前 , 可以先了解下UART大致的概念 , 之后再在内寻找例程进行分析 。最后再参照手册就可以做出具体的东西了
通用异步收发传输器(/) , 通常称作UART 。它将要传输的资料在串行通信与并行通信之间加以转换 。作为把并行输入信号转成串行输出信号的芯片 , UART通常被集成于其他通讯接口的连结上 。在嵌入式设计中 , UART用于主机与辅助设备通信 , 如汽车音响与外接AP之间的通信 , 与PC机通信包括与监控调试器和其它器件 , 如通信 。
可以理解为一种输入并行信号 , 输出串行信号的用于串口通信的传输器 。也可以理解为是通信协议的一种
可以把单片机进行通信的过程分为三个部分:即获取信息 → \ → 编码 → \ →解码
当获取信息后编码时 , 除了原来的八位数据 , 还有起始位和中止位 。
b 0 b_0 b0?– b 8 b_8 b8?代表着每一位的时间长度 。定义波特率为一位时间长度的倒数 , 即:
?b a u t r a t e baut rate = 1 b i t ? t i m e \frac{1}{bit-time} bit?time1?
而带宽可以理解为数据位(看几位数据)与帧位(包括起始结束)的比值
而对于来说 , 共有四对串口通信的地址 , 如下图所示
可发现这与GPIO口的引脚是重叠的 。为了让芯片明白是怎么样的引脚 , 所有uart的定义都有=1且=1 , 这样就可以区分开了 。下图是发送的UART端口的示意图 。
可以发现包括四部分:寄存器 , 数据 , 状态标志字 , 起始和终止位
下面来进行传输过程中的分析
两个缓冲寄存器是起到暂存的作用的 。比如当TXIFG=1时,数据先写入的  , 将数据写入上面的段(P1.3)并加上起始位和终止位 。之后进行传输至P1.2对应的口 。
八位数据被读入段(P1.2)后检查起始和终止位是否未出错 , 若不出错就把数据传至
之后若RXIFG=0 , 就进行读取数据的工作 。
需要注意的是这里传送的数据为0x61 , 即一位字符的地址
一般有4个基本参数 , 可以通过TI公司给出的转换器 , 只需输入波特率和时钟频率 , 以及是USCI/EUSCI模式就可以计算出参数 。这些参数在初始设置中需要用到
UART例程1
下面来看一个关于UART的基本例程 , 路径为以下:D:\TI\\\\\\rclk\rclk.c
代码如下 。先上代码再解释
/* DriverLib Includes */#include /* Standard Includes */#include #include //![Simple UART Config]/* UART Configuration Parameter. These are the configuration parameters to* make the eUSCI A UART module to operate with a 9600 baud rate. These* values were calculated using the online calculator that TI provides* at:*http://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/MSP430BaudRateConverter/index.html*//*关于串口的基本配置*/const eUSCI_UART_ConfigV1 uartConfig ={EUSCI_A_UART_CLOCKSOURCE_SMCLK,// SMCLK Clock Source78,// BRDIV = 782,// UCxBRF = 20,// UCxBRS = 0EUSCI_A_UART_NO_PARITY,// No ParityEUSCI_A_UART_LSB_FIRST,// LSB FirstEUSCI_A_UART_ONE_STOP_BIT,// One stop bitEUSCI_A_UART_MODE,// UART modeEUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION,// OversamplingEUSCI_A_UART_8_BIT_LEN// 8 bit data length};//![Simple UART Config]int main(void){//关闭看门狗MAP_WDT_A_holdTimer();//选择P1.2和P1.3为UART功能引脚MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P1,GPIO_PIN2 | GPIO_PIN3, GPIO_PRIMARY_MODULE_FUNCTION);/* Setting DCO to 12MHz (改后面的数字 , xMHZ)*/CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_12);//![Simple UART Example]//配置UART模块MAP_UART_initModule(EUSCI_A0_BASE, &uartConfig);//使能UART模块MAP_UART_enableModule(EUSCI_A0_BASE);//中断使能MAP_UART_enableInterrupt(EUSCI_A0_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT);MAP_Interrupt_enableInterrupt(INT_EUSCIA0);MAP_Interrupt_enableSleepOnIsrExit();MAP_Interrupt_enableMaster();while(1){MAP_PCM_gotoLPM0();}}//用户配置的中断服务程序void EUSCIA0_IRQHandler(void){uint32_t status = MAP_UART_getEnabledInterruptStatus(EUSCI_A0_BASE);//获取中断标志位//如果接收到的中断 , 进行信息传递if(status & EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG){MAP_UART_transmitData(EUSCI_A0_BASE, MAP_UART_receiveData(EUSCI_A0_BASE));}}