TA的每日心情 | 奋斗 2020-5-27 15:41 |
---|
签到天数: 868 天 连续签到: 1 天 [LV.10]以坛为家III
|
UART串口通讯的使用非常广泛,是一个全双工通用异步收发器,兼容工业标准16450,支持DMA。能在串行和并行数据之间可靠的转换。程序的调试常常通过串口发送和接收数据,来修改程序。 异步串行通讯协议包括:a: 5到8比特数据 b:1、2或1.5个停止位,c:无、奇、或偶校验。d:波特率。所有的数据字要求一位起始位和至少一位停止位,产生了支持7至12位范围的字长。
UART有一个中断输出到中断控制器(包括TX和RX中断)通过软件读中断识别寄存器COMIIR来判断引起中断的原因。在DMA模式,break和modem不能用。在I/O模式,接收时,产生中断的包括以下情况: 接收寄存器满,接收溢出错误,接收校验错误,接收帧错误,break中断, Modem状态中断,发送寄存器空。UART是一个双缓冲器,包括holding寄存器和移位寄存器。
UART相关寄存器共有有11个,支持6种中断,可以根据程序需要,对中断使能寄存器COMIEN相关位使能。
COMIEN(读写)寄存器:
Bits | 7:6 | 5 | 4 | 3 | 2 | 1 | 0 | 中断名称 | 保留 | EDMAR | EDMAT | EDSSI | ELSI | ETBEI | ERBFI | 说明 | 保留 | 发送模式的DMA请求
0:失能 1:使能 | 接收模式的DMA请求
0:失能 1:使能 | Modem状态(COMMSR[3:0]位置1
时产生)0:失能 1:使能 | RX状态(COMLSR[4:1]位置1时产生
0:失能 1:使能 | 发送缓冲器空
0:失能 1:使能 | 接收缓冲器满
0:失能 1:使能 | 串口小数波特率分频寄存器:
看到公式,是不是感觉有点复杂,ADI提供的库函数和函数生成工具Elves.exe就可简单配置。
为了降低功耗,波特率选择9600,拷贝代码:
UrtCfg(pADI_UART,B9600,COMLCR_WLS_8BITS,0);//波特率9600,8bit数据长,1个停止位。
UART串口由UART控制寄存器COMCON(读写)使能或失能。UART的TX和RX由GPIO管脚GP0CON配置P0.1、P0.2或P0.6、P0.7为复用模式。
使用串口助手发送字符并显示在串口助手上。
使用KEIL建立新的工程
代码如下:
#include <stdio.h>#include <string.h>#include <aducm360.h>#include <AdcLib.h>#include <IexcLib.h>#include <DacLib.h>#include <DasLib.h>#include <UrtLib.h>#include <ClkLib.h>#include <WutLib.h>#include <WdtLib.h>#include <GptLib.h>#include <I2cLib.h>#include <IntLib.h>#include <wmLib.h>#include <DioLib.h>#include <DmaLib.h>#include <FeeLib.h>#include <wrLib.h>#include <rstLib.h>#include <spiLib.h>#include <cportabl.h>int fputc(int ch, FILE *f); void SendChar (unsigned char uDat);void delay(long int);void UARTINIT (void); void SendString (unsigned char *upStr) ; unsigned char GetChar (void); //接收字符unsigned char RxBufferFull = 0; //定义一个接收满标志unsigned char TxBufferEmpty = 0; // 定义一个发送空标志unsigned char TEMP=0; // 存储接收字符的临时变量unsigned char upStr[64];unsigned char i = 0;int main (void){ WdtCfg(T3CON_PRE_DIV1,T3CON_IRQ_EN,T3CON_PD_DIS); //失能看门狗 /*失能不用的外设时钟*/ ClkDis(CLKDIS_DISSPI0CLK|CLKDIS_DISSPI1CLK|CLKDIS_DISI2CCLK|CLKDIS_DISPWMCLK|CLKDIS_DIST0CLK|CLKDIS_DIST1CLK|CLKDIS_DISDMACLK); // Only enable clock to used blocks ClkCfg(CLK_CD0,CLK_HF,CLKSYSDIV_DIV2EN_DIS,CLK_UCLKCG); // 配置CD0 为 CPU 时钟 ClkSel(CLK_CD7,CLK_CD7,CLK_CD0,CLK_CD7); // 选择 CD0 为 UART 时钟 UARTINIT(); // Uart初始化 NVIC_EnableIRQ(UART_IRQn); //中断 printf("/*ADI评估板初始化完毕*/\r\n"); printf("\"hello world\"!\r\n"); while (1) { TEMP= GetChar(); //接收字符 printf("接收的字符:%x\r\n",TEMP); delay(10000000); }}void UARTINIT (void) //串口初始化{ pADI_GP0->GPCON |= 0x3C; // 配置 P0.1/P0.2 为 UART UrtCfg(pADI_UART,B9600,COMLCR_WLS_8BITS,0); // 配置波特率 9600, 8-bits,1个停止位 UrtIntCfg(pADI_UART,COMIEN_ETBEI|COMIEN_ERBFI); // 配置中断源}/*发送一个字符*/void SendChar (unsigned char uDat){ UrtTx(pADI_UART,uDat); while (!TxBufferEmpty); TxBufferEmpty = 0; } void SendString (unsigned char *upStr) //发送字符串{ while(*upStr) { SendChar(*upStr++); }}unsigned char GetChar (void) //接收一个字符{ unsigned char temp; while(!RxBufferFull); temp=UrtRx(pADI_UART); RxBufferFull=0; return (temp); } int fputc(int ch, FILE *f) //printf重定向{ while(!TxBufferEmpty); UrtTx(pADI_UART,ch); TxBufferEmpty = 0; return (ch); }void delay (long int length){ while (length >0) length--;}void UART_Int_Handler () //中断处理{ volatile unsigned char UART_IntID = 0; //定义中断识别变量 UART_IntID= UrtIntSta(pADI_UART); // 读UART 中断识别寄存器 if((UART_IntID & 0x02) == 0x02) // 判断中断发送为空,置发送空标志为1 { TxBufferEmpty = 1; } if((UART_IntID & 0x4) == 0x4) //判断中断接收满,置位接收满标志为1 { RxBufferFull=1; }}在调试的时候发现,单个字符(图中的9)程序接收不到,只能接收2位字符串,而且不识别大小写,不知道是不是串口的问题。串口的发送大同小异,欢迎使用串口助手的高手赐教。
|
|