本文以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 位配置。振荡器模块可配置为以下八种时钟模式之一。
RC——外部阻容(RC),在OSC2/CLKOUT 上具有FOSC/4 输出。
RCIO—— 外部阻容(RC),在OSC2/CLKOUT上具有I/O。
INTOSC— 内部振荡器,在OSC2上具有FOSC/4输出,且在OSC1上具有I/O
INTOSCIO——内部振荡器,在OSC1 和OSC2 上都具有I/O。
EC——外部时钟,在OSC2/CLKOUT上具有I/O。
HS—— 高增益晶振或陶瓷谐振器模式。
XT—— 中等增益晶振或陶瓷谐振器振荡模式。
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