×
单片机 > 单片机程序设计 > 详情

PIC32MX单片机外设库使用(Ⅱ)-- UART篇

发布时间:2020-06-16 发布时间:
|
4.4 串口应用
  因为笔者硬件设计使用UART4口,然而在《PIC32 Peripheral Libraries for MPLAB C32 Compiler》库里却找不到使用UART4的库函数。历经百度百般搜索,终于获得了一点蛛丝马迹:原文如下

PIC32MX 5/6/7系列的C32用法,已經完全變了一個方式。
範例程式所用的是依新版的用法,也可以相容PIC32MX 3/4系列。
用法說明在
\MPLAB C32\doc\pic32-lib-help\下的UART-PLIB-Help.chm
另外APP1632實驗版及說明書也有提及這部份,可以參考使用。
感叹一句,神奇的万能的百度啊!
结合例程,及笔者的实际硬件,做出如下调试
实验目标:1.指示灯点亮,用于表示接收数据成功。
  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));
    }
 
 
}

关键字:PIC32MX  单片机  外设库  UART 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析