查看: 1633|回复: 0

【ADI EVAL-ADuCM360QSPZ开发套件】使用教程(三)---UART串口学习

[复制链接]
  • TA的每日心情
    奋斗
    2020-5-27 15:41
  • 签到天数: 868 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2015-3-26 13:17:16 | 显示全部楼层 |阅读模式
    分享到:
    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 &ltwmLib.h>#include <DioLib.h>#include <DmaLib.h>#include <FeeLib.h>#include &ltwrLib.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位字符串,而且不识别大小写,不知道是不是串口的问题。串口的发送大同小异,欢迎使用串口助手的高手赐教。
           
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-4-18 14:43 , Processed in 0.117441 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.