MIPS架构下PIC32单片机的UART通信

1 PIC32 系列单片机简介
PIC32 系列单片机是Microchip Technology Inc. ( 美国微芯科技公司) 推出的高性能32 位单片机, 它是以MIPS32架构为基础设计的。目前推出的PIC32MX3XX 分支为通用型, PIC32MX4XX 分支带有USB 功能, PIC32MX5XX 分支带有USB 和CAN 功能, PIC32MX6XX 分支带有USB 和Ethernet 功能, PICMX7XX 分支则带有USB、CAN 和Ethernet 功能。PIC32 系列单片机采用哈佛结构, 带有5 级流水线, 工作频率最高80 MHz; 具有高效指令架构、高性能硬件乘法器/ 累加器及多至8 组32 个内核寄存器, 可实现1.56 一款DMIPS/ MHz 的运行速度。此外, PIC32 系统具有指令和ROM 数据预取缓冲器的64 字节高速缓存, 128 位宽的闪存, 可缩短单个指令的取指时间, 支持MIPS16e 16位指令集构架, 可最多减少40%的代码。

PIC32 系列单片机包括了闪存范围从32 KB 到512KB 的可扩展器件, 片上RAM 从8 KB 到128 KB, 引脚与64/ 100 引脚的16 位单片机PIC24FJXXXGA 系列兼容,新推出的PIC32MX5XX/ 6XX/ 7XX 提供XBGA 的封装。另外, PIC32 系列单片机带有丰富的外设资源5 个定时器、16 路通道的10 位A/ D 转换器及通信接口, 即SPI、I2C、UART 和PMP, 同时PIC32 还有集成的CRC 计算功能和基于模式的传输终端选择功能的DMA 控制器。此外, PIC32MX5/ 6/ 7 系列包括10/ 100 Mbps 以太网、CAN2. 0b 控制器、USB 主设备/ 从设备和OTG。

PIC32 系列单片机不仅比PIC 8 位、16 位单片机速度更快、性能更强, 同时相对于ARM 系列的32 位单片机也具有一定的优势。虽然Microchip 能选择的MISP 4K 最高时钟频率只有80 MH z, 但是由于MIPS 内核简洁, 多家处理器评估机构确认PIC32 的处理能力总体性能更高, 而且PIC32 的指令多为单周期指令, 比多周期指令执行速度更迅捷。PIC32 系列单片机多达128 KB 的RAM, 使其在数据处理上更具优势。Microchip 微公司还有一个非常独特的优势, 就是该公司所有8、16 和32 位的器件都是充分兼容的, 所有的这些全系列的产品使用的都是同样的开发工具, 单一的开发环境, 软件库也是全面兼容的, 这对于客户更为方便。此外, Ashling、Green Hills 及Hi Tech 提供了完整工具链支持, CMX、Express L ogic 等提供RTOS 支持, EasyGUI、Segger、RamT eX 及Micrium 等提供绘图工具支持。值得一提的是, 微芯公司为开发人员准备了入门工具包, 示例源文件, 同时免费提供了如USB、T CP/ IP 协议栈, 以及Graphics 和FAT 16 文件系统开发的中间件模块。PIC32 的MPLAB C32 编译器包括了16 位MicrochipMCU 兼容的软件外设函数库, 以更加方便快捷地使用外设模块。PIC32 系列单片机的结构框图如图1 所示。

图1 PIC32 系列单片机的结构框图

Microchip 集成开发工具支持所有PIC32 型号单片机, 包括MPLAB 集成开发环境( IDE) 、MPLAB C32 C 编译器、MPLAB REAL ICE 仿真系统、MPLAB ICD2 在线调试器及Explore 16 开发板等。PIC32 系列单片机要求MAPLAB IDE 版本要在8. 0 以上, 现最新版本为8. 43,MAPLAB IDE 软件可以从微芯公司官方网站ww w. microchip. com 免费下载。MPLAB ICD2 在线调试器是一款低价位的PIC 开发工具, 可设置一个1 次断点, 调试能力较弱。MPLAB ICD3 保留了与Microchip RJ11 接口的向后兼容, 可轻松连接目标板, 迅速进行器件编程; 可多达1000 个软件断点, 2~ 5. 5 V 工作电压; 可支持最低2. 0 V的低电压调试, 具有高速的编程能力, 比M PLAB ICD2 的编程速度快5~ 15 倍。MPLAB REAL ICE 仿真系统能够支持标准和先进的调试功能, 如复杂断点、应用代码的追踪和数据采集、代码执行计时及实时变量监控。新推出的MPLAB PM3 通用器件编程器支持全部的PIC 器件产品及最新dsPIC30 系列的编程。但是MPLAB REAL ICE,ICD3 和PM3 价格都比较昂贵, ICD2 尽管功能有限, 但价格便宜, 可实现PIC32 系列的编程仿真。关于具体PIC32各型号单片机所支持的编程器、仿真器、编译器以及各版本的IDE 所支持的PIC 系列型号可以在MPLAB IDE( 8.0 版本以上) 的Configure | Select device 进行查看。

2 PIC32 的UART 串口编程
下面以UART 串口模块为例来叙述PIC32 的开发过程, 电路原理如图2 所示。考虑到MAPLAB ICD3 和MPLAB REAL ICE 仿真器的价格较贵, 采用了USB 口的MPLAB ICD2 ( MPLAB IDE 支持USB 口的MPLABICD2, 不支持串口的ICD2) 。本实验采用MAPLAB IDE8. 33 集成开发环境, 选择PIC32MX320F128H。

图2 电路原理图

在PIC32 编程中, 需要对配置字进行配置( 主要是对系统时钟、外设时钟等进行配置) 。这一工作可在程序中定义,也可以通过MPLAB IDE 中的菜单Configure Configuration Bit s 对配置字进行设置; 同时可通过Project | Select Language T oolsuite 选择编译器, 通过Configure | Select Device 选择芯片型号。由于MPLAB IDE8. 33 集成开发环境程序只是对以前版本的升级改进, 因此使用过MAPLAB IDE 开发环境的开发人员可方便、快速地掌握其使用方法。本实验采用MPLAB C32 编译器, 程序1 为直接使用MPLAB C32 编译器中的软件外设函数库进行UART 的操作; 程序2 则是采用读写寄存器对UART 进行操作。程序实现上位机发送数据, PIC32 单片机收到数据后返回上位机。

程序1 ( 直接使用MAPLAB C32 compiler 库函数操作UART)
# include < plib. h>
/ / 配置字设置
/ / 系统时钟SYSCLK = 80 MHz= ( 8MHz
/ / Crystal/ FPLLIDIV * FPLLMUL / FPLLODIV)
/ / 外设时钟PBCLK = 40 MHz= SYSCLK/ FPBDIV
/ / 主晶振设置为w/ PLL ( XT+ , HS+ , EC+ PLL)
/ / 看门狗定时器关闭FWDT EN= OFF
# pragma config FPLLMUL = MUL _ 20, FPLLIDIV = DIV_2, FPLLODIV = DIV_1, FWDTEN = OFF
# pragma config POSCM OD = HS, FNOSC =
PRIPLL, FPBDIV = DIV_1
# define SYS_FREQ ( 80000000L)
/ / 系统时钟为80 MHz
# define DESIRED_BAUDRAT E ( 9600)
/ / 串口波特率
int main( vo id) {
int pbClk;
unsigned char data;
pbClk= SYSTEMConfig( SYS_FREQ, SYS_CFG
_WAIT_STATES | SYS_CFG_PCACHE) ;
/ / 配置设备使性能最高, 会改变Flash 和RAM
/ / 等待状态, 并使能预取缓冲, 但不改变已设置
/ / 的FPBDIV
OpenUART2( UART _ EN, UART _ RX_ ENABLE | UART_TX_ENABLE, pbClk/ 16/ DESIRED
_BAU DRATE- 1) ;
/ / 使能UART2, 允许接收发送, 设置波特率发
/ / 生寄存器
putsUART2( "* * * UART Simple Application
Ex ample * * * \ r \ n") ;
putsUART2( "* * * Type some characters and obser ve echo
* * * \ r\ n") ;
while( 1) {
while( ! DataRdyUART2( ) ) ; / / 等待U ART x 的数据
data = ( char) ReadUART2( ) ; / / 读U2RXREG
while( BusyUART2( ) ) ; / / 等待U ART 2 发送完成
putcUART2( data) ; / / 写数据到U2RXREG
} ;
return 0;
}

程序2( 使用寄存器操作UART)
# include < p32x xx x . h>
# include < plib. h>
void main( vo id) {
int pbClk;
char RxDat a;
pbClk= SYST EMConfig ( SYS _ FREQ, SYS _ CFG _WAI_
STATES | SYS_CFG_PCACHE) ;
U2BRG= 259; / / 设置波特率发生寄存器
U2MODE= 0x8000;
/ / 允许UART2 模块, 8 位数据, 无奇偶校验, 1 位停止位
U2STASET = 0x1400;
/ / UART 2 发送接收使能, 清接收溢出错误标志
while( 1) {
w hile( IFS1&0x200) { / / 等待接收数据
IFS1CLR= 0x200; / / 清接收标志位
RxData= ( char ) U2RXREG;
w hile( U2STA&0x200) ; / / 等待接收缓冲区空
U2TXREG= RxDat a; / / 将接收到的数据发送
}
}
}

作者:刘娟1, 王培勇2

--电子创新网--
粤ICP备12070055号