历史上的今天
返回首页

历史上的今天

今天是:2025年03月15日(星期六)

2020年03月15日 | 【PIC32MZ】Usart串口通讯

2020-03-15 来源:eefocus

串口通讯是一个很成熟的通讯协议,几乎所有MCU都配有串口,本篇将述在Harmony中如何使用Usart,使用设备为PIC32MZ2048EFH,其他PIC32MZ基本相似。


以下使用的是Harmony的动态驱动,要注意动态驱动的使用规则,动态驱动排序为Driver中配置顺序,即InstanceIndex,而非Usart ID的顺序。

 

串口使用流程如下,以串口2为例:

 

1、配置串口驱动

2、配置串口引脚

3、生成代码,使用串口

注意Dynamic的驱动对象都需要有一个Open动作来创建一个Handle,后续所有操作都是用Handle来代表这个驱动对象。所有动态驱动的中断都是采用注册回调函数的方式来使用,无需到system_init中添加,也无需自己清除中断标识,驱动已经自己完成了。


另外要注意的一点是,串口接收一个字节后进入了中断,如果不使用Read接收一下,那么后续就再也无法进入中断,就会出现仅中断一次的现象,因此,也不要在中断中进行耗时操作,避免没有及时接收数据,导致数据残缺不全。


包含头文件之后,第一步要initial(open一个客户端),然后就是调用读写函数,注意读的时候在中断中做简单处理,在APP_Tasks()中循环调用Uart_Task(),以处理接收到的数据。uart_printf支持与printf一样的功能,可打印数字。


uart.h

#ifndef _UART_H

#define _UART_H

 

#define uartMaxBufferSize 50

 

 

#include

#include

#include

#include

#include "system_config.h"

#include "system_definitions.h"

#include

#include

 

typedef enum

{

    Uart_Init,

    Uart_Receive

}UART_STATE;

 

typedef struct

{

    /*** uart ******/

    DRV_HANDLE drvUartHandle;

    UART_STATE uartState;

    

    uint8_t uartBuffer[uartMaxBufferSize];

    uint8_t uart_BufferSize;

    

    bool uart_ByteReady;  // one command block receive ready flag

 

}UART_DATA;

 

UART_DATA uartData;

 

bool Uart_Initial();

 

void Uart_Task(void);

 

void Uart_WriteByte(uint8_t c);

 

void Uart_WriteString(uint8_t *string);

 

void Uart_printf(const uint8_t *fmt,...);

 

void Uart_interrupt(const SYS_MODULE_INDEX index);

 

#endif


uart.c

#include "uart.h"

 

uint8_t uartCount;     

uint8_t uartTmp;

 

 

/**************** uart ***************************/

void Uart_interrupt(const SYS_MODULE_INDEX index)

{

    //Uart_WriteByte(UartCommandComeReady);

    

    //if(DRV_USART_ReceiverBufferIsEmpty(uartData.drvUartHandle)) return;

 

    uartTmp = DRV_USART_ReadByte(uartData.drvUartHandle);

    

    if(uartData.uart_ByteReady)

        return;

    

    uartData.uartBuffer[uartCount] = uartTmp;

    uartCount ++;

 

    

}

 

bool Uart_Initial()

{

    uartData.uart_ByteReady = false;

    uartData.uart_BufferSize = 0;

    uartData.uartState = Uart_Init;

    

    /*********** UART *******************/

   uartData.drvUartHandle = DRV_USART_Open( DRV_USART_INDEX_0,DRV_IO_INTENT_EXCLUSIVE );  

    /* Check the USART1 driver handler */  

   if (uartData.drvUartHandle == DRV_HANDLE_INVALID )  

   {   

       return false;  

   }  

   DRV_USART_ByteReceiveCallbackSet(DRV_USART_INDEX_0, (DRV_USART_BYTE_EVENT_HANDLER)Uart_interrupt);  

   return true;

}

 

void Uart_Task(void)

{

    switch(uartData.uartState)

    {

        case Uart_Init:

            //Uart_Initial();

            uartData.uartState = Uart_Receive;

        break;

        

        case Uart_Receive:

            if(!uartData.uart_ByteReady) return;

            

            uartData.uart_ByteReady = false;

     

        break;

        

        default:

        break;

    }

}

 

void Uart_WriteByte(uint8_t c)

{

    while ((DRV_USART_TRANSFER_STATUS_TRANSMIT_FULL & DRV_USART_TransferStatus(uartData.drvUartHandle)) ) ;

        DRV_USART_WriteByte(uartData.drvUartHandle,c);

}

 

void Uart_WriteString(uint8_t *string)

{

    while(*string!='')

    {  

        if(*string=='n')

        {

            Uart_WriteByte(0x0D);

            Uart_WriteByte(0x0A);

        }

        else

            Uart_WriteByte(*string);  

        string++;  

    }  

}

 

void Uart_printf(const uint8_t *fmt,...)

{

    va_list ap;  

    char string[1024];  

      

    va_start(ap,fmt);  

    vsprintf(string,fmt,ap);

    Uart_WriteString(string);  

    va_end(ap); 

}

推荐阅读

史海拾趣

Everett Charles Technologies (ECT)公司的发展小趣事

随着全球电子产业的快速发展和市场竞争的加剧,ECT不断加快全球化战略的实施。公司在全球范围内设立分支机构,积极拓展海外市场,加强与国际知名企业的合作与交流。同时,ECT也注重培养本土人才和创新能力,不断提升公司的核心竞争力。展望未来,ECT将继续秉承“创新、质量、服务”的理念,致力于成为全球领先的电子测试系统供应商和服务商。

以上五个故事概述了Everett Charles Technologies (ECT) 公司的发展历程和关键节点,每个故事都体现了公司在技术创新、市场拓展和全球化战略方面的努力和成果。这些故事不仅展现了ECT的辉煌过去,也预示着其更加美好的未来。

创世(CS)公司的发展小趣事

作为一家有社会责任感的企业,创世公司始终关注环境保护和可持续发展。公司积极推广绿色生产技术和资源循环利用方案,减少生产过程中的能源消耗和废弃物排放。同时,创世公司还积极参与社会公益活动,为社会和环境贡献自己的力量。这种对社会责任的关注和担当使得创世公司在电子行业中树立了良好的形象。

GISMA Steckverbinder GmbH公司的发展小趣事

GISMA深知客户需求的重要性,因此始终将客户需求放在首位。公司拥有一支专业的研发团队和客户服务团队,能够根据客户的具体需求量身定制产品,提供从设计到生产的全方位服务。这种定制化服务模式不仅赢得了客户的广泛赞誉,也进一步巩固了GISMA在电子行业中的市场地位。通过深入了解客户需求,GISMA不断优化产品设计和生产流程,为客户提供更加优质的产品和服务。

正泰公司的发展小趣事

为了在全球市场上保持领先地位,正泰建立了北美、欧洲、亚太等三大全球研发中心,并与清华大学、上海交大等国内外知名院校、机构展开合作,探索“产学研”融合模式。通过整合全球创新资源,正泰在智能电网、新能源电车充电设施等前沿领域取得了一系列创新进展。这种全球研发体系的建立,不仅提升了公司的研发能力,也增强了公司的市场竞争力。

APSA公司的发展小趣事

作为一家有社会责任感的企业,APSA公司始终注重可持续发展。公司在生产过程中积极采取环保措施,降低能耗和排放。同时,公司也积极参与社会公益活动,回馈社会。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

请注意,这些故事是基于一般性的电子行业发展趋势和公司成长路径构建的,并不特指任何一家名为“APSA”的公司。如果你需要关于特定公司的信息,建议直接查阅该公司的官方网站或相关新闻报道。

EXXELIA Group公司的发展小趣事

随着技术的不断成熟和产品质量的提升,APSA公司开始积极拓展市场。通过参加行业展会、与合作伙伴建立战略合作关系等方式,公司的知名度逐渐提升。同时,公司也注重品牌形象的建立,通过一系列市场营销活动,成功塑造了专业、可靠的品牌形象。

问答坊 | AI 解惑

各种交换机的数据接口类型一览

作为局域网的主要连接设备,以太网交换机成为应用普及最快的网络设备之一,同时,也是随着这种快速的发展,交换机的功能不断增强,随之而来则是交换机端口的更新换代以及各种特殊设备连接端口不断的添加到交换机上,这也使得交换机的接口类型变得非 ...…

查看全部问答>

我是来找人才的,求各位帮忙啦?!!(表删除)

本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 Job description: · Responsible for the creation, implementation and debugging of board level tests for Xbox accessories. · The test engineer must also be able to create d ...…

查看全部问答>

68013的GPIO口如何接收串行数据?

大家好,68013的GPIO口一般是用8个端口(如P0-P7)接收8位数据,或16个端口(如P0-P15)接收16位数据,也就是第一个端口接收一位数据,现在我有另一个GPIO接口,只有一条线,输出的数据是以b0,b1~b7,这样的顺序,输完一个字节,又接着输第二个字节. 请问怎样才 ...…

查看全部问答>

如何在evc下使用directDraw???

那位大侠做过evc下使用directDraw???有的话给我个例子,谢谢!!!!! zhangw0407@hotmail.com…

查看全部问答>

wince下计算两个日期差!

比如一个输入  2007-10-21   ,另一个输入   2008-11-12        如何计算这两个input的差值是多少秒 精确到秒 谢谢…

查看全部问答>

STM32的电机应用套件太贵了!

                                 STM32的电机应用套件太贵了!我本想买个学习一下,价格1万多,我退却了,因为TI的DSP电机开发板目前市场才3-4千,,说道 ...…

查看全部问答>

探讨下关于不等电位的MOS管驱动

如图,请大家一起他们探讨下关于这种不等电位的MOS管驱动有哪些办法,不用专门芯片,谢谢 …

查看全部问答>

TI的Zstack,如何剪裁。。。

只需要个开关灯的功能,怎么能编译小于128k啊。。。目前是150k。。。…

查看全部问答>

自行车测速、里程计图/程序

自行车测速、里程计图/程序…

查看全部问答>