PIC32MZ

PIC32MZ——USB HID通信

在设备通信中,UART非常常见,也是最简单的,但是,PC尤其是笔记本基本都舍弃了传统的UART端口,只能使用usb转UART的IC来做信号转换,这样效率低,而且还要针对IC安装专门的驱动,非常不方便,而在有些特殊设备上,甚至驱动无法安装,是否可以不安装驱动与PC通信呢?

当然可以!

在USB盛行的今天,USB通信变得极其简单,而在USB中有一个重要的通信标准,就是HID(Human Interface Device),常见的鼠标键盘就是采用HID通信。由于它的标准性,几乎所有PC系统(Windows、Linux、OSX)都集成了它的驱动,所以,可以将它看做一个免驱的设备,类似的还有USB大容量存储。下面我们就用PIC32MZ2048EFH芯片实现USB HID的接口(PIC32MZ EF Start Kit开发板),与PC进行通信,PC端采用C#以及C++分别在windows和linux下实现hid读写,本篇不做描述,详细参考我的其它博客,关于两个平台的hid程序。

接口使用的是micro usb(j4接口)。

1、配置时钟(略)

2、配置USB Library,下图中红色部分要修改,其它默认。

PIC32MZ——OLED12864 I2C显式示例

本篇主要讲述如何使用PIC32MZ来点亮OLED12864。

OLED12864可以控制一个一个像素点,所以需要自建字库,有专门生成的软件,字库为字母字符,放到最后面。注意不同12864排列或者共极不同,则需要自行取模。

 PIC32MZ——OLED12864 I2C显式示例

本片需要调用I2C通信中的基础代码,需要delay和i2c-Hardware,以下不再贴这部分代码。

第一部分是字模文件

codetab.h

#ifndef _CODETAB_H  
#define _CODETAB_H  
  
  
/***************************16*16 Chinese, common gnd - column style - reverse output*********/  
extern uint8_t F16x16[];  
  

PIC32MZ——I2C通信

I2C跟串口一样,仅需2根线通讯即可,在某些引脚紧张的应用中非常有用,不过I2C相比于串口,通讯协议更简单一点,距离也更短一些,仅限于板间通信。大多数IC都支持I2C协议。

I2C的时序图为:

PIC32MZ——I2C通信

I2C数据传输是在起始条件和停止条件之间。

起始条件和停止条件都是SCL为高一段时间产生。起始条件为SDA从高变为低,停止条件为SDA从低变为高。

I2C数据传输规则为,第一字节必须为地址,一般器件地址都是7位(也有10位的),放在高7位,最后一位时读写标识,所以,读写地址是不相同的,并且很多IC都可以配置多个地址选择,这是为了在一组I2C上接多个IC,因为I2C是通过地址来识别从机的。

每传输一个字节,从机都要回复一个ACK来表示是否完成接受,回复0继续接受,回复1停止接受。

I2C写操作很简单,传输从机地址以及数据即可。

I2C读也是一样,传输从机地址即可。

写操作:

PIC32MZ——PWM呼吸灯

PWM类似于开关电源,将高电压中间插入地脉冲,来将有效电压降低,在某些电压不敏感器件中,可以实现电压降低的效果。例如LED的亮度变化。

前文有说过,Harmony的Dynamic还不是很完善,在PWM上就有体现,PWM需要OC与静态Timer配合,如果有其它Timer在在使用Dynamic,不想全部改为Static,可以直接使用PLIB函数,可以从其它Static函数往底层去看,也是通过static调用的PLIB函数。

所以,在这里我们只配置OC,而对应的Timer则采用直接调用底层函数的方法使用static驱动。

注意,PWM的占空比指的是高电位占空比,例如80%指的是80%为高电位。

1、配置驱动


2、配置输出引脚

PIC32MZ——Timer定时器

PIC32MZ有多达9组Timer,但是并非任何时候都能同时使用,主要是在使用32位计数器时的问题。

Timer的2、4、6、8定时器支持16位和32位,但是在使用32位,占用的ID并非自身,而是下一个。以Timer4为例,在system_interrupt中可以看到,若是使用16位模式,显示为Timer4,而使用32位时,其使用的是Timer5。如果同时使用Timer4的32位和Timer5,生成代码时,则会出现冲突提示。

还有就是设置系统频率时需要注意,若是要求较短间隔(us),最好使用32位模式,因为分频后的频率数值若是超过计数器长度,则无法正常使用,并且没有提示,你会看到定时器没有起作用。

以下使用timer4示例,事实上可以看到,不管配置的是哪个Timer,只要是相同的Instance ID,代码部分没有变化:

1、配置驱动

PIC32MZ——Timer定时器

2、生成代码,使用定时器

PIC32MZ——Usart串口通讯

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

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

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

1、配置串口驱动


2、配置串口引脚

3、生成代码,使用串口

PIC32MZ——按键中断

Harmony中,使用GPIO中断非常方便,仅需三步:一是将需要使用的GPIO设为Input;二是勾选ChangeNotify(如果想要设置默认状态,还可以设置上拉或者下拉);三是在system_interrupt中调用中断函数。

以下为示例,按键为RB12,这里是按下按键接地,低电平,包含长按以及短按处理:

PIC32MZ——按键中断

PIC32MZ——按键中断

PIC32MZ——点亮LED

MCU开发第一步都是点亮LED,就跟软件的Hello World一样,先开始第一步吧。
新建一个项目,参考开发环境搭建,具体我就不写了。

1、配置时钟,这个在Clock Diagram中配置,点击Auto-Calculate,输入系统主频即可,最高可达252MHz,这里没有涉及到其他外设,仅设置主频即可。

2、选择服务,由于GPIO只能使用Static,并且系统已经默认配好,那么就不需要自己配置Driver了。在System Services中勾选Clock和Ports即可。

PIC32MZ——点亮LED

3、配置端口,在PinSetting配置区,我们配置RH0,RH1,RH2三个LED,Order设为Ports,找到RH进行配置,Direction为Out,Mode为Digital。

PIC32MZ开发环境的搭建

Microchip在新一代的32位PIC芯片采用了一种新的架构来进行开发,这就是Harmony。

Harmony类似于ST的STM32CubeMX,将芯片Library封装到中间层,采用统一接口,仅底层不同,不过底层已经由Microchip已经写好,所以,用户上层的同一份代码,理论上稍加修改MHC配置,就可以很方便的移植,有点像Qt的意思了,一次编写,处处编译(不同于Java)。

Harmony还有一个优势,就是可以采用Dynamic驱动,同一类型的外设,仅需要一份驱动代码,非常节省空间,不过Dynamic到目前为止,还有一些瑕疵,例如PWM就没有办法实现完全Dynamic,对应的Tmr只能使用Static,若是其他的Tmr使用Dynamic,那么只能在使用PWM时,自己调用底层的PLIB_TMR来实现Static调用。这里先不讲这些。

实际上Harmony只是一个Library集合,开发仍然需要IDE,这就是MPLAB X IDE。开发工具清单如下:
1、MPLAB X IDEv3.51(集成了XC32编译器,后续版本会高于3.51)
2、Harmony_v2_02_00b(有新版本使用新版本即可)
3、com-microchip-mplab-modules-mhc.nbm(Harmony在MPLAB中调用的插件)

【视频】基于MIPS PIC32MZ EF——带FPU的嵌入式连接系列

本视频介绍了Microchip 基于MIPS PIC32MZ EF系列32位单片机。PIC32MZ EF系列是PIC32MZ高性能单片机系列的第二代产品,该系列新器件拥有更佳的性能、浮点单元和高度集成的存储器及外设,有助于嵌入式开发人员满足新一代高端应用的需求。

同步内容
--电子创新网--
粤ICP备12070055号