串口通讯是一个很成熟的通讯协议,几乎所有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!='\0')
{
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);
}
推荐阅读
- KEIL下载键变灰色,ST-link无法下载程序
- 在STM32F103C8T6上移植UCOS系统
- MCU|【PIC32MZ】按键中断
- MCU|【PIC32MZ】开发环境的搭建
- 7路PWM产生程序阅读
- 硬件|单片机mcu—time定时器详解
- stm32影子寄存器、预装载寄存器,TIM_OC1PreloadConfig和TIM_ARRPreloadConfig的作用
- Keil逻辑分析仪的使用