本文以PIC16F_LF722A_723A为例介绍PIC

基本特点

PIC是高性能RISC CPU,采用哈佛结构,35条指令,除跳转外都是单周期

指令周期=4震荡周期

闪存程序/数据存储器

  • 闪存程序存储器\[4K*14\]位(0000H~0FFFH),有编程保护,可以擦写1000次,数据保持时间>40年。PIC的指令CALL和GOTO只提供11位地址,因此只能在2K范围内跳转,因此要将程序存储器空间按2K为单位进行分页,用寄存器PCLATCH寄存器的D4和D3两位来选择页面。 程序存储器保留了两个特殊单元,一是地址为0000H的单元,存放复位矢量;另一个是地址为0004H的单元,专门存放中断矢量。复位矢量,就是主程序的入口地址,单片机复位后,都将从该地址执行主程序。所谓中断矢量,就是中断服务子程序的入口地址,无论何种原因引起的单片机中断,都将从该地址进入中断服务子程序。

  • 闪存数据存储器192B,是RAM。与51单片机类似使用RP1,RP0来选择存储区,00=Bank0,01=Bank1,10=Bank2,11=Bank3。

    每个存储区的低地址单元保留用于特殊功能寄存器。特殊功能寄存器的上方是通用寄存器,实现为静态RAM。所有实现的存储区都包含特殊功能寄存器。一些常用的特殊功能寄存器可从一个存储区镜像到另一个存储区,以缩减代码,加快访问速度

    通用寄存器:每个寄存器可直接访问,或通过选择寄存器(File Select Register,FSR)间接访问

    寻址:

    直接寻址使用RP1、RP0选择存储区,间接寻址使用STATUS寄存器的IRP位和FSR结合。

    程序寻址PC,高5位不可以直接读写,只能使用PCLATH来间接写入,任何复位都将清零PC

硬件堆栈

采用8级深硬件堆栈,堆栈具有8x13的独立空间,8级深度13位宽,栈指针不能读写,也没有堆栈操作专用指令。当执行CALL或者CPU响应中断而发生程序跳转时,把当前程序计数器PC的值自动压入堆栈;当执行RETURN、RETFIE或RETLW指令时,会从堆栈中弹出并恢复程序计数器PC原先的值。

PCLATH的值不受压栈或出栈操作的影响。也就是说只有PC的值会被改变但是PCLATH的值是不变的

在操作过程中,无法获取堆栈信息,没有指示堆栈满或未满的标志。堆栈是作为循环缓冲区使用的,当压栈超过8次后,第9次压栈时进栈的数据将覆盖第1次压栈存储的数据,而第10次压栈时进栈的数据将覆盖第2次压栈存储的数据,以此类推。

其实上述特征都是硬件堆栈的特征,相比较而言软件堆栈可以对栈指针进行读写,有push/pop操作,一般时编译器为了处理一些参数传递而构造的,会由编译器自动产生和处理,可以通过相应的编译选项对其进行编辑

振荡器

高精度内部振荡器

  • 工作频率:16MHz or 500kHz
  • 出厂时校准\(\pm1\%\)(典型值)
  • 1,2,4,8分频

优缺点:使用片内振荡器,可以节省IO引脚,降低成本,但是内部振荡器使用阻容(RC)震荡,其精度不高,如果使用了串口、或者PWM等对时钟比较敏感的功能,最好还是用外部晶体震荡

结构

时钟源可以由外部振荡器、石英晶体谐振器、陶瓷谐振器以及阻容(Resostor-Capacitor, RC)电路配置。此外,系统可以配置为使用内部校准高频振荡器作为时钟源,并可以通过软件选择可选速度。

配置

时钟源模式由配置字1 (CONFIG1)中的FOSC 位配置。振荡器模块可配置为以下八种时钟模式之一。

  1. RC——外部阻容(RC),在OSC2/CLKOUT 上具有FOSC/4 输出。

  2. RCIO—— 外部阻容(RC),在OSC2/CLKOUT上具有I/O。

  3. INTOSC— 内部振荡器,在OSC2上具有FOSC/4输出,且在OSC1上具有I/O

  4. INTOSCIO——内部振荡器,在OSC1 和OSC2 上都具有I/O。

  5. EC——外部时钟,在OSC2/CLKOUT上具有I/O。

  6. HS—— 高增益晶振或陶瓷谐振器模式。

  7. XT—— 中等增益晶振或陶瓷谐振器振荡模式。

  8. LP—— 低功耗晶振模式。

复位

特殊功能寄存器复位初值与复位原因的关系:

PD-:掉电标志,1--上电或执行CLRWDT指令后,0--执行SLEEP指令后。 TO-:超时标志,1--上电执行CLRWDT或SLEEP指令后,0--WDT超时溢出.

PD-和TO-可用来判断RESET的原因:00--WDT溢出时唤醒SLEEP,01--WDT溢出(非SLEEP),10--MCLR端加低电平唤醒SLEEP,11--电源上电。例如,对系统初始化时,需判断这次复位是否因上电引起的,如果不是上电复位,则不再进行初始化。

  • 上电复位(Power-on Reset,POR)在开机时初始化系统时,片上POR 电路将芯片保持在复位状态,直到VDD 达到正常工作所需的电平为止。

  • 上电延时器(Power-up Timer,PWRT)上电延时定时器仅在上电时(从上电复位或欠压复位)提供一个固定的64 ms(标称值)超时。配置位PWRTE 可以禁止(如果置1)或使能(如果清零或编程)上电延时定时器。

  • 振荡器起振定时器(Oscillator Start-up Timer,OST)如果振荡器模块配置为LP、XT 或HS 模式,则振荡器起振定时器(OST)将对OSC1 引脚上的1024 次振荡进行计数,然后该器件才能从复位释放。发生上电复位(POR)后且上电延时定时器(PWRT)延时已结束(如果配置了此延时)时或从休眠状态唤醒时发生该计数行为。在计数期间,程序计数器不会递增,程序执行暂停。

  • 欠压复位(Brown-out Reset,BOR)欠压复位通过编程配置寄存器中的BOREN<1:0>位来使能。就是在电压低于某一阈值(VBOR),并且持续时间大于参数TBOR时进入复位状态,会重新初始化上电延时器,VDD会上升。

  • 超时序列:POR结束:arrow_right:调用PWRT超时:arrow_right:激活OST

非上电复位的时候,很多特殊功能寄存器是保持原值的

开发

可以通过两个引脚进行在线串行编程(In-Circuit Serial Programming,ICSP)在线串行开发是将开发调试的功能集成在MCU内部,调试时用MCU自身的引脚功能,所以时真实的,和实际芯片运行一样。现在的开发都是ICSP

仿真开发是设计电路模拟所有MCU引脚,无论是速度还是驱动能力、输入电平的阈值都是硬件软件模拟的,和实际情况有差异,所以叫仿真。

芯片等级

民用级、商用级、工业级、军用级

AD转化

分辨率:8位

参考电压:1.024/2.048/4.096V

定时计数器

假如预分频跟后分频比都设置为1:256的话,意思就是: 预分频:输入信号只有达到256个电平后,计数器的值才会加1/减1。 后分频:只有中断发生256次后,才会置中断标志位。

timer0

带8位预分频器的8位定时器/计数器

timer1

是timer0的增强型,有专用低功耗32kHz振荡器,带16位预分频器的定时器/振荡器,有外部门控输入模式(具有翻转和单时间模式),门控输入完成时中断

timer2

带8位周期寄存器、预分频器和后分频器的8位定时器/计数器,有2个捕捉/比较/PWM (CCP: capture, compare, PWM)模块:16位捕捉,最大分辨率为12.5ns;16位比较,最大分辨率为200ns;10位PWM,最高频率为20kHz

捕获模式使内部16位定时器的内容在检测到第n个上升沿或下降沿时被写入板载特殊功能寄存器

当定时器与预设比较值匹配时,比较模式将产生中断或在输出引脚上进行更改

PWM模式会以用户设置的频率创建可重新配置的方波占空比输出。应用软件可以通过修改写入特定特殊功能寄存器的值来更改占空比(duty cycle)或周期。

中断

12个中断源,统一中断入口位为04H

无论GIE、PEIE 和各个中断允许位的状态如何,中断标志位都会在中断发生时置1。ISR 通过查询中断标志位来判断中断源。在退出ISR 之前必须将中断标志位清零,以避免重复的中断。

电平变化中断

分组与控制:

通 过将INTCON0寄存器的IPEN位置1,可以将中断分组为高优先级和低优先级两个级别。当高优先级和低优 先级中断请求同时发生时,始终先处理高优先级中断。高优先级中断信号也可以抢占正在进行的低 优先级ISR(中断服务程序)。

OPTION 寄存器的INTEDG 位确定中断发生在哪个边沿。当INTEDG 位置1 时,上升沿将触发中断。当INTEDG 位清零时,下降沿将触发中断。

LDO

LDO是一种低压差线性稳压器。LDO稳压器为内部数字逻辑提供3.2V 的工作电压,而为I/O 提供5.0V 工作电压(VDD)。LDO 稳压器需要外部旁路电容以确保其稳定性。三个引脚中的一个引脚(记为VCAP),可配置为连接外部旁路电容引脚。VCAP 引脚不为外部负载供电,外部器件也不应向VCAP引脚供电。

端口

上拉电阻的通俗解释

高拉 / 灌电流可直接驱动 LED

钳位二极管用来保持I/O引脚的电压

方向寄存器来控制是输入还是输出

上拉电阻用来稳定电压

PORT A:8位双向端口,弱上拉,方向寄存器是TRISA

PORT B:弱上拉,方向寄存器是TRISB,电平变化中断(所有PORTB 引脚都可独立配置为电平变化中断引脚)

PORT C:方向寄存器是TRISC

PORT E:弱上拉,方向寄存器是TRISE

看门狗

与一般器件复位不同,看门狗不能防止程序的中断,多数寄存器不受WDT唤醒的影响,因为WDT唤醒被视为恢复正常工作,不论何种原因,只要没有对看门狗定时器WDT进行周期性地及时清零,WDT就会出现超时溢出,也就会引起单片机复位。

简单的来说比如程序运行错误,那么看门狗就不能被即时的清零,但是此时看门狗还在累加,在达到一定时间后将会复位,回到原点,保证程序进入迷途之后可以自动恢复,以此来增强稳定性。

参考资料:http://www.dwenzhao.cn/profession/mcu/pic.html