因为笔者硬件设计使用UART4口,然而在《PIC32 Peripheral Libraries for MPLAB C32 Compiler》库里却找不到使用UART4的库函数。历经百度百般搜索,终于获得了一点蛛丝马迹:原文如下
2.用串口调试助手给单片机发送数据0x01, 0x02,0x03,0x04, 0x05;串口调试助手接收到同样的数据0x01, 0x02,0x03,0x04, 0x05。表示串口驱动调试成功。
#define pbclk 1000000
#define desired_rate 4800
/**********************************************************************************************
*函数名 字: UART4Config
*功能描 述:串口1硬件驱动配置
*输 入: 无
*输 出: 无
*返 回: 无
*全局变量: 无
*调用模块: 使用内部8M FRC作为时钟源+ 8分频 = 1 M 外设时钟
**-------------------------------------------------------------------------
**项 目 组:
**创建日期:
**作 者: **
**版 本: **
**
**-------------------------------------------------------------------------
**修 改 者:
**修 改 日 期:
**版 本:
**版 本 描 述:
**
***********************************************************************************************/
void UART4Config(void)
{
//配置和使能UART4, 关闭CTS, RTS数据流信号,只启用TX,RX
UARTConfigure(UART4, UART_ENABLE_PINS_TX_RX_ONLY);
//设置FIFO中断方式
//TX FIFO缓冲区未填充满时中断-- 缓冲区未填满。
//RX缓冲器非空时中断-- 缓冲区有数据。
UARTSetFifoMode(UART4,
UART_INTERRUPT_ON_TX_NOT_FULL
| UART_INTERRUPT_ON_RX_NOT_EMPTY);
//设置为数据位8,无校验位,1位停止位
UARTSetLineControl(UART4, UART_DATA_SIZE_8_BITS | UART_PARITY_NONE | UART_STOP_BITS_1);
//设置波特率,后面两个参数分别是PBCLK和期望的波特率
UARTSetDataRate(UART4, pbclk, desired_rate);
//使能UART模块,使能发送,使能接收
UARTEnable(UART4, UART_ENABLE_FLAGS(UART_PERIPHERAL | UART_RX | UART_TX));
// 配置UART4接收中断
INTEnable(INT_SOURCE_UART_RX(UART4), INT_ENABLED);
INTSetVectorPriority(INT_VECTOR_UART(UART4), INT_PRIORITY_LEVEL_2);
INTSetVectorSubPriority(INT_VECTOR_UART(UART4), INT_SUB_PRIORITY_LEVEL_0);
// configure for multi-vectored mode
INTConfigureSystem(INT_SYSTEM_CONFIG_MULT_VECTOR);
// enable interrupts
INTEnableInterrupts();
}
/**********************************************************************************************
*函数名 字: WriteString(const char *string)
*功能描 述: UART4数据流发送函数
*输 入: string -- 需要发送的字符串
*输 出: 无
*返 回: 无
*全局变量: 无
*调用模块:
**-------------------------------------------------------------------------
**项 目 组:
**创建日期:
**作 者: **
**版 本: **
**
**-------------------------------------------------------------------------
**修 改 者:
**修 改 日 期:
**版 本:
**版 本 描 述:
**
***********************************************************************************************/
void WriteString(const char *string)
{
while (*string != '\0')
{
while (!UARTTransmitterIsReady(UART4))
;
UARTSendDataByte(UART4, *string);
string++;
while (!UARTTransmissionHasCompleted(UART4))
;
}
}
/**********************************************************************************************
*函数名 字: PutCharacter(const char character)
*功能描 述: UART4发送单字节字符函数
*输 入: 无
*输 出: 无
*返 回: 无
*全局变量: 无
*调用模块:
**-------------------------------------------------------------------------
**项 目 组:
**创建日期:
**作 者: **
**版 本: **
**
**-------------------------------------------------------------------------
**修 改 者:
**修 改 日 期:
**版 本:
**版 本 描 述:
**
***********************************************************************************************/
void PutCharacter(const char character)
{
while (!UARTTransmitterIsReady(UART4))
;
UARTSendDataByte(UART4, character);
while (!UARTTransmissionHasCompleted(UART4))
;
}
/**********************************************************************************************
*函数名 字: __ISR(4, ipl2) _Timer1Handler(void)
*功能描 述:UART1发送中断函数
*输 入: 无
*输 出: 无
*返 回: 无
*全局变量: 无
*调用模块: 无
**-------------------------------------------------------------------------
**项 目 组:
**创建日期:
**作 者: **
**版 本: **
**
**-------------------------------------------------------------------------
**修 改 者:
**修 改 日 期:
**版 本:
**版 本 描 述:
**
***********************************************************************************************/
/* Timer 1 ISR */
/* Specify Interrupt Priority Level = 2, Vector 49 */
void __ISR(49, ipl2) _UART1_TX_handle(void)
{
unsigned char Receivedata;
// Is this an RX interrupt?
if (INTGetFlag(INT_SOURCE_UART_RX(UART4)))
{
// 发送接受到的数据,用于验证通信是否正确
PutCharacter(UARTGetDataByte(UART4));
// 清除接收中断标志
INTClearFlag(INT_SOURCE_UART_RX(UART4));
// 点亮接收数据指示灯,用以表示接收数据成功
OPEN_LED_D4();
}
//我们不关心发送中断
if ( INTGetFlag(INT_SOURCE_UART_TX(UART4)) )
{
INTClearFlag(INT_SOURCE_UART_TX(UART4));
}
}