产品选型

pic 32位单片机 「话说嵌入式」 PIC32快速上手指南

小编 2024-11-24 产品选型 23 0

「话说嵌入式」 PIC32快速上手指南

在ARM Cortex-M3/M4大行其道的今天,可能大家都遗忘了在很久很久以前还有MIPS架构的单片机,MIPS架构的芯片在路由器上应用得很多,单片机上也是有,没错今天说的就是Microchip的PIC系列单片机。和当年如火如荼的AVR类似,PIC32的知名度是越来越小,现在PIC32可能也只剩下所谓的稳定性了吧(难怪Microchip会收购Atmel, 简直臭味相投啊?)

相信大家对STM32应该了如指掌,今天就带大家从STM32的角度,简单过一下如何从新上手PIC32,从以下方面进行对比,并尝试总结一下PIC32为什么流行不起来

快速制作自己的PIC32开发板如何搞定Hex文件的烧写如何使用Microchip MPIDE进行代码编译,运行,调试Harmony的使用

1)快速制作自己的PIC32开发板

为什么不是PIC8/PIC16/PIC24?因为没必要,就是这么简单,32位的成本已经相当相当低了。这里使用的是PIC32MX795F512H, 拥有512K Flash, 128K RAM,运行频率在80MHz,支持USB 2.0 Full Speed, 以太网MAC,淘宝价格在35左右。

黑人问号脸?!!

什么这个价格要35?相类似的STM32F407ZGT6也才24左右,嘤嘤嘤。

最小系统板,我们就直接参考开源项目Fubarino SD,这里对其的SD卡和USB部分进行了DIY,让手工制作更加容易,希望拿到eagle文件的同学,留下你的邮箱。

实际的焊接出来的效果图如下

2)如何搞定Hex文件的烧写

PIC32代码的开发,即可以使用Linux下MIPS gcc进行编译,也可以使用XC32在Windows/Linux/MacOS里编译。编译的问题相对简单,但是烧录略有不同,这个涉及到PIC32的内存分布,较ARM上手更为复杂。

PIC32通常需要烧写一个bootloader,就算是仅App的工程,他也需要一个bootloader来进行代码的跳转。

这里我们使用的是PICKit3.5,淘宝88块。

PICKit3.5功能强大,亮点在于支持脱机固件烧写,支持目标板电源检测与供电,但恰恰是其功能过于强大,导致其使用也相对复杂,稳定性也更差。

首先下载安装mpalb-x-ide及xc32 compiler,当前最新mplab-x-ide是v5.40版本

https://www.microchip.com/mplab/mplab-x-ide

https://www.microchip.com/mplab/compilers

建议先安装好XC32 compiler并添加到系统PATH当中。

这里需要注意的是XC32有Free版本,Free版本不支持代码的优化,一般情况下也是够用了,如果需要Pro License,可以申请60天的试用。安装完成,会出现2个程序,一个是MPLAB X IDE,一个是MPLAB X IPE, 其中IPE就是单独的烧写工具,而IDE是开发环境后面会单独聊到。

你可能注意到,安装一个IDE需要占用可能近10个G的空间,真的是很夸张。

这里我们需要烧录Fubaino的SD 512K版本固件,

https://github.com/chipKIT32/PIC32-avrdude-bootloader

不带512字眼的是基于32MX440F256H的V1.4版本

打MPLAB X IDE明显能感觉到这个软件加载的速度异常的慢,这都是2020年了,i7 8代+SSD+16G内存加速的速度也能明显感觉迟滞。

这个界面还是挺正常的吧,没有什么奇怪的,当点击Connect之后选择好Hex并进行Program时,你有可能会发现在真正Program之前需要先下载PICKit3的固件?

什么神仙操作,而且这个过程相当缓慢,有时甚至会失败!为什么要这么做?前面有提到过为了让PICKit3支持更多功能,PICKit3可以加载不同的固件大大提高灵活性,而随之而来的就是复杂性,不稳定性,烧写个代码真的不轻松,不干脆。

3)如何使用Microchip MPIDE进行代码编译,运行,调试

打开MPLAB X IDE,不过在这之前,如果你的电脑配置不行还是建议不要打开了,这感觉能让你回想到之前在老古董上用Eclipse上开发Android应用的痛苦经历。

这里以Bootloader的source code为例,从File->Open Project导入工程,进行编译Production->Build Project进行编译,如果需要进行代码的下载调试,直接点击Debug->Debug Project,操作的方式倒是大同小异,

不过你可能又会发现,启动慢可能是因为太吃内存的原因?和Chrome真的有得一拼!

等到下载下程序时,有可能你又会发现,MPLAB X IDE在做和IPE一毛一样的事情,重新给PICKIT3下下载固件,真是***。

事实上既然有了toolchain也可以不使用IDE,直接用Makefile进行软件的开发,不是更香?

另外,还有一个叫PicKit3的精简的软件是用来专门烧写固件的

好了,又要切换固件,简直了,然而,切换完之后,你还会发现,他不支持PIC32!

4)Harmony的使用

Harmony是一套可以使用GUI配置芯片的工具,非常类似STM32CubeMX, 但这在Microchip里是一段痛苦的过程,首先要从MPIDE X 的Plugin里启用Harmony

这里选择gitee的URL,在国内速度会快很多

疯狂地吃掉CPU和硬盘,虽然我这个是1T的机械

终于看到熟悉的界面,但是真的再没有兴趣再继续,这是一段痛苦的旅程。

5)总结

从PIC32的简单试用来看,PIC32失败真的不冤枉它,总结以下几点,欢迎补充

PIC32的价格不便宜,MX的价格己经较高,后续出来的MZ系列,甚至内置了最高2M的ROM和512K的RAM,但价格完全没有优势,一旦量起不来就是一个恶性循环,越没人用,价格越高推广力度较ST等其它厂商严重不足,可能是和其定位的客户有关,在汽车领域追求稳定性的行业可能有一些应用,其它领域比较少见。上手难度大,MIPS的架构在单片机上的应用,不自然,比如内存布局,PIC32上来就是内核和用户态,在写第一行代码时就要花不少时间研究,相比ARM Cortex M3/M4简单的内存布局,真是良心透了。开发环境差,生态更差,更不用说得上技术支持。开发环境差,软件臃肿,想一想2020年电脑的配置,要跑一个IDE都如此困难,更不用说以前只有几个G的开发环境,越少人用,生态越差,又一个恶性循环。相比MDK Keil,IAR,虽然安装包大但运行起来完全不卡,哦,不MDK,你的armcc编译还是很卡的。奇葩的下载器设计,让软件开发过程异常不顺利,不流畅Microchip的不重视,就像是被收购的ATmel, 32位的MCU也基本是半残,没有竞争力,现在它收购了FPGA厂商Microsemi,不然会不会又被他玩残。

PIC系列单片机配置字详细介绍(长期实践总结的压箱底资料)

(注:本文档主要根据PIC16F193X数据手册编写,对于其他型号的单片机,其配置字可能略有不同,此外本文部分参考了PIC18F78K22数据手册,因而部分注释了两个系列单片机的区别)

1、FCMEN:故障保护时钟监视器使能位

FCMEN_ON:使能 FCMEN_OFF: 禁止(红色表示本人使用PIC单片机所选择的配置,下同)

详细说明:在使器件能在外部振荡器发生故障时继续运行。 FSCM 可以检测当振荡器起振定时器(OST)延时结束后的任何时刻发生的振荡器故障。

如图所示,故障检测器模块内部有一个锁存器。在外部时钟的每个下降沿上将锁存器置1。 在采样时钟的每个上升沿将锁存器清零。 如果采样时钟的一个完整半周期在外部时钟变为低电平之前结束,则将检测到故障。

FC时钟监控框图

FC时钟监控时序

结论:若外部时钟在采样时钟为高电平时间内(约1ms)没有下降沿,则当采样时钟为低电平时认为时钟故障。

注:外部时钟没有经过PLL倍频

2、IESO:内部/外部时钟切换位

IESO_ON:使能切换 IESO_OFF:禁止切换

详细说明:使能后,当外部晶振出错后,单片机会自动切换到内部RC震荡电路作为其工作时钟。

16F1936资料:当MCU上电复位或从休眠模式唤醒时,由于外部震荡电路可能还没稳定,此时可允许先使用内部时钟,然后再切换到外部时钟。

3、CLKOUTEN:时钟输出使能位

CLKOUTEN_ON: 使能 CLKOUTEN_OFF: 禁止

详细说明:使能RA6/CLKOUT 引脚上的CLKOUT 功能,若MPU连接外部石英晶振或陶瓷谐振器,不能使用该功能

4、BOREN<1:0>:欠压复位使能位

BOREN_ON:使能BOR

BOREN_NSLEEP: BOR 在工作时使能,在休眠时禁止

BOREN_SBODEN: BOR 由PCON 寄存器的SBOREN 位控制

BOREN_OFF: 禁止

详细说明:当Vdd 到达可选的最低电平时, BOR 电路将器件保持在复位状态。 在BOR 和POR 之间的整个电压范围内,可实现执行保护功能。可配合PWRT(复位延迟)使用。

BOR原理

5、CPD:数据代码保护位

CPD_ON:使能 CPD_OFF:禁止

详细说明:使能/禁止数据存储器代码保护,擦除操作期间关闭代码保护时,将擦除整个数据EEPROM 的内容。在数据存储器受代码保护时,只有CPU 可对数据EEPROM进行读写操作。

6、CP:代码保护位

CP_ON:使能 CP_OFF:禁止

详细说明:使能/禁止程序存储器代码保护,当关闭代码保护时,将擦除整个程序存储器的内容。使能后,禁止对程序存取器的外部读写操作,若进行读操作,返回0。

7、MCLRE:MCLR/VPP 引脚功能选择位

MCLRE_ON:使能 MCLRE_OFF:禁止

详细说明:仅当LVP=0时有效,外部复位

MCLRE引脚

8、PWRTE:上电延 时定时器使能位

(如果电源上电慢,防止无法启动,MCU必须具有该功能,且必须使能)

PWRET_ON:使能 PWRET_OFF:禁止

详细说明:上电、欠压复位后提供64ms的延迟。

(注:16F1936,16F1946中仅说有64ms的延迟,18F87K22资料中有如下说明:采用LF-INTOSC时钟(31.25KHz,周期为32us)计数,计数寄存器为11bits,因而延迟时间为2048*32us=65.5ms)

复位原理图

9、WDTE<1:0>:看门狗定时器使能位

WDTE_ON:使能

WDTE_NSLEEP:在运行时使能,休眠时禁止

WDTE_SWDTEN:由WDTCON 寄存器中的SWDTEN 位控制

WDTE_OFF:禁止

详细说明:看门狗定时器是系统定时器,如果固件在超时周期内未发出CLRWDT 指令,看门狗定时器将产生复位。

看门狗原理图

通过配置WDTPS,可是设置复位时间2ms-256s(18F为4ms-4196s)。

(注:任何复位,进入休眠模式,从休眠模式唤醒,振荡器故障都会使WDT清0,且复位后默认超时周期为2秒)

10、FOSC<2:0>:振荡器选择位

111 = ECH:外部时钟,高功耗模式:RA7/OSC1/CLKIN 引脚为CLKIN 功能

110 = ECM:外部时钟,中等功耗模式:RA7/OSC1/CLKIN 引脚为CLKIN 功能

101 = ECL:外部时钟,低功耗模式:RA7/OSC1/CLKIN 引脚为CLKIN 功能

100 = INTOSC振荡器:RA7/OSC1/CLKIN 引脚为I/O 功能

011 = EXTRC 振荡器:RA7/OSC1/CLKIN 引脚为RC 功能

010 = HS振荡器:高速晶振/ 谐振器连接到RA6/OSC2/CLKOUT 和RA7/OSC1/CLKIN 引脚

001 = XT振荡器:晶振/ 谐振器连接到RA6/OSC2/CLKOUT 和RA7/OSC1/CLKIN 引脚

000 = LP振荡器:低功耗晶振连接到RA6/OSC2/CLKOUT 和RA7/OSC1/CLKIN 引脚

详细说明:EC模式将外部产生的逻辑电平作为系统时钟源,其中ECH对应4-32 MHz,ECM对应0.5-4 MHz,ECL对应0-0.5 MHz。INTOSC模式采用内部时钟源作为其工作时钟,通过PLL倍频、分频,可产生31KHz-16MHz时钟。LP、XT 和HS 模式支持在OSC1 和OSC2 引脚之间连

接石英晶振或陶瓷谐振器的应用,EXTRC模式支持使用外部RC 电路。

时钟源整体框图

EC模式

石英晶振(LP、XT 或HS模式)

陶瓷谐振器(XT或HS模式)

RC模式

“pic系列单片机有rc、lp、xt、hs等振荡模式。除rc模式外,振荡模式的选择实际上就是环路增益的选择。低增益对应低振荡频率,高增益对应高振荡频率。一般根据实际需要的工作频率可参考数据手册来选择。

11、LVP:低压编程使能位

LVP_ON = 使能低压编程

LVP_OFF = 必须使用MCLR/VPP 引脚上的高压进行编程

详细说明:允许器件在没有高压的情况下仅使用VDD 进行编程。如果使能了低压编程(LVP = 1),将自动使能MCLR复位功能,且无法禁止。

12、DEBUG:在线调试器模式位

DEBUG_OFF = 禁止在线调试器, RB6/ICSPCLK 和RB7/ICSPDAT 是通用I/O 引脚

DEBUG_ON = 使能在线调试器, RB6/ICSPCLK 和RB7/ICSPDAT 专用于调试器

13、BORV:欠压复位电压选择位

BORV_19 = 欠压复位电压设置为1.9V

BORV_= 欠压复位电压设置为2.5V (注:1936,1946资料为2.5V,代码注释为2.7V)

(注:18F87K22为BORV<1:0>,1.8V,2.0V,2.7V,3.0V)

14、STVREN:堆栈上溢/ 下溢复位使能位

STVREN_ON = 堆栈上溢或下溢将导致复位

0STVREN_OFF = 堆栈上溢或下溢不会导致复位

详细说明:MPC在执行调用函数、中断函数等操作时,进行对当前PC值进行堆栈操作,若不使能该功能,堆栈将作为循环缓冲区使用,溢出的PC值将覆盖最早进入堆栈的PC值。

15、PLLEN:PLL 使能位

PLLEN_ON = 使能4xPLL

PLLEN_OFF = 禁止4xPLL

注:配置字禁止该功能时,可在程序中通过设置SPLLEN,选择是否使能4xPLL功能。 (软件启动时,需一段时间后锁相环倍频才能稳定,可查询PLLR,测试PIC16F1946,采用外部4M晶振,震荡器选择HS模式,软件SPLLEN置1,约600指令周期后PLLR为1)

16、 VCAPEN<1:0>:稳压器电容使能位

00 = 在RA0 引脚上使能VCAP 功能

01 = 在RA5 引脚上使能VCAP 功能

10 = 在RA6 引脚上使能VCAP 功能

11 = VCAP 引脚上无电容

详细说明:Vcap是提供给内部稳压器使用的,如果你5V的系统,必须在三个Vcap脚上选择一个接上Cap,而且要在配置位中指定该引脚。如果系统只需要3.3V,无需选择Vcap.

17、WRT<1:0>:闪存自写保护位

4 kW 闪存(仅PIC16F1933/PIC16LF1933 和PIC16F1934/PIC16LF1934):

11 = 写保护关闭

10 = 000h 至1FFh 受写保护, 200h 至FFFh 可以由EECON 控制寄存器修改

01 = 000h 至7FFh 受写保护, 800h 至FFFh 可以由EECON 控制寄存器修改

00 = 000h 至FFFh 受写保护,无可由EECON 控制寄存器修改的地址址

8 kW 闪存(仅PIC16F1936/PIC16LF1936 和PIC16F1937/PIC16LF1937):

11 = 写保护关闭

10 = 000h 至1FFh 受写保护, 200h 至1FFFh 可以由EECON 控制寄存器修改

01 = 000h 至FFFh 受写保护, 1000h 至1FFFh 可以由EECON 控制寄存器修改

00 = 000h 至1FFFh 受写保护,无可由EECON 控制寄存器修改的地址

16 kW 闪存(仅PIC16F1938/PIC16LF1938 和PIC16F1939/PIC16LF1939):

11 = 写保护关闭

10 = 000h 至1FFh 受写保护, 200h 至3FFFh 可以由EECON 控制寄存器修改

01 = 000h 至1FFFh 受写保护, 2000h 至3FFFh 可以由EECON 控制寄存器修改

00 = 000h 至3FFFh 受写保护,无可由EECON 控制寄存器修改的地址

详细说明:写保护用于保护器件不受意外的自写访问。在允许修改程序存储器其他区域的同时可以保护应用程序,例如引导加载程序软件。

推荐配置:__CONFIG(FOSC_HS & WDTE_ON(1) & PWRTE_ON & MCLRE_ON&CP_ON & CPD_OFF & BOREN_ON &CLKOUTEN_OFF & IESO_OFF & FCMEN_ON);

__CONFIG(WRT_OFF & VCAPEN_OFF(2)& PLLEN_ON(3)& STVREN_ON & BORV_19 (4)& DEBUG_OFF & LVP_OFF);

注:

1、关于看门狗配置字WDTE,若某些单片机超时时间较短,而程序初始化时间较长,可选择软件启动,WDTE_SWDTEN,注意对相关寄存器定时设置,或者在初始化程序中 多次清狗

2、如果MCU采用+3.3V供电,则可以不使能VCAP,如果采用+5.0V供电必须使用VCAP。

3、若采用4M外部晶振,采用FOSC_HS 或FOSC_XT可能还需测试确认。

4、复位电压根据MCU工作电压、电源电压范围以及RAM保持电压确认。+3.3V工作推荐为1.9V,+5.0V工作推荐为+5.0V。

相关问答

PIC单片机 ···两个十六位二进制数求和.(30H)(31H)+(32H)(3...

[最佳回答]CLRF35HCLRF34HMOVF31HADDWF33H,WMOVWF36HBTFSCSTATUS,CINCF35HMOVF30HADDWF32H,WBTFSCSTATUS,CI...

如何在 pic32单片机 输入端配置上拉电阻?

RB端口虽在单片机内部加了上拉电阻,但是是用于输入的,当你把端口设为输出时,上拉电阻就不起作用,不信可以参考Datasheet;RB作为输出时一般不需要加上拉电阻...

STM32 是什么啊,是 32位 单片机 吗 - 135****2256 的回答 - 懂得

是32位单片机,嵌入式入门建议你从51开始stm32是一种32位的单片机。单片机是嵌入式系统中最常用的核心部件,stm32本质上也是一种单片机。从事嵌入式...

pic单片机 指令左右循环是怎么回事

[回答]在这里介绍一种定时程序,说明循环程序在PIC单片机上的应用。笔者仍以PIC16F84单片机为例建立其定时源程序清单。该定时器源程序只需改变一条指令的...

51单片机和 32单片机 对比?

51单片机是对所有兼容Intel8031指令系统的单片机的统称,这一系列的单片机的始祖是Intel的8031单片机,后来随着flashROM技术的发展,8031单片机取得了长足的进...

pic单片机 指令左右循环是怎么回事

在这里介绍一种定时程序,说明循环程序在PIC单片机上的应用。笔者仍以PIC16F84单片机为例建立其定时源程序清单。该定时器源程序只需改变一条指令的...

有些OTP 单片机 ROM怎么是1k*14位的,为什么不是8位或是16位?

PIC的部分单片机就是14位的,这是由其指令系统格式决定的,每一条指令都包含有操作数和数据,是一种压缩的指令格式,14位就可以涵盖了整个指令系统,所以能省就...

pic单片机 芯片作用?

PIC单片机芯片作用:是一种用来开发和控制外围设备的集成电路。一种具有分散作用功能的CPU。与人类相比,大脑就是CPU,PIC共享的部分相当于人的神经系统。PIC...

PIC 的标准编程语言分别是?

一、PIC汇编语言指令格式PIC系列微控制器汇编语言指令与MCS-51系列单片机汇编语言一样,每条汇编语言指令由4个部分组成,其书写格式如下:标号操作...实例中...

请问初学 PIC单片机 那种型号最合适?

PIC目前各种型号销售都挺多的。没有说那个最常用,用什么型号不是说开发者会用就用什么型号,而是项目需要用什么就用什么型号。对于入门来说,推荐PIC16F877或者...

猜你喜欢