前言
由于在之前学习嵌入式IDE时候都是直接接触到的是STM32 ARM内核的32位看偏激,现在开发使用的是美国微芯公司推出的PIC系列的单片机,这对于有经验的工程师而言已经没有什么,但是对于我这个刚开始出来参加工作的,对于不同的单片机之间的配置方式的不同,还是觉得有必要记录下来的,这对于自己的学习以及以后后面的开发都会有所帮助,毕竟工作经验都是要积累起来的嘛!
PIC单片机配置字
在PIC系列的单片机当中,其中的内部大豆油设置一个特殊的程序存储单元,地址为2007,由单片机的用户自由配置,用来定义一些单片机功能电路单元的性能选项,我们就会将这一些单元叫做器件配置字(Configuration Bits)。
PIC单片机在烧写必须配置字,配置字还必须要正确,如PIC单片机有四种可选振荡方式,RC、XT、HS、LP,这样你就必须根据你的设计电路图选择方式,选择好配置字,芯片才能工作,配置字选的不对,芯片就不能正常工作。
用途:
上图是PIC16F877配置字的情形,对配置字的各位的解释是:
CP1-CP0:代码保护位,说明如下:
11 = 代码保护关;
10 = 参见器件数据手册;
01 = 参见器件数据手册;
00 = 所有存储器均受代码保护。
注:有些器件使用较多或较少的位数来配置代码保护。目前就一些只使用一位(CP0) 的器件,保护位的说明如下:
1 = 代码保护关;
0 = 代码保护开。
DP:数据EEPROM 存储器的代码保护位,说明如下:
1 = 代码保护关;
0 = 数据EEPROM 存储器受代码保护。
注:对于具有数据EEPROM 存储器的ROM 程序存储器器件,使用该位。BODEN:欠压复位(BOR) 使能位,说明如下:
1 = BOR 使能;
0 = BOR 禁止。
PWRTE:上电定时器(PWRT) 使能位,说明如下:
1 = PWRT 禁止;
0 = PWRT 使能。
注1:无论PWRTE 位的值为何,使能欠压复位即自动使能了上电定时器(PWRT)。请确保使能欠压复位时,也使能了上电定时器。
注2:在一些早期的PICmicro? 单片机中,该位的极性被保留。
MCLRE:MCLR 引脚功能选择位,说明如下:
1 = 引脚功能为MCLR;
0 = 引脚功能为数字I/O,MCLR 在内部连接到VDD 上。
WDTE:看门狗定时器(WDT) 使能位,说明如下:
1 = WDT 使能;
0 = WDT 禁止。
电路需要IO口来发挥作用
我们知道,一个单片机只要有最小的系统,单片机就可以工作了,然而我们回到单片机发挥作用的话,还得考引脚。比如想要LED灯亮起来,那么我们就要将二极管进行导通,就比如要将副段设为低电位,让二极管亮起来,就需要在正端加上高电平,这样LED灯才会亮起来。所以我们可以通过某个引脚控制输出电平的高低,从而来控制led灯的亮灭。高位亮,低为灭。
寄存器和特殊功能寄存器
我们可以看下图:PIC16F18344芯片:
上面这个部分叫做特殊功能寄存器,他们有特定的用途,像PORTA、TRISA就是用来配置IO口端口的,像TCON等等这一类的寄存器是用来与定时器有关的。旁边的这个16进制数就是寄存器的地址。
I/O口
什么是io口,这个就是单片机而言最为核心的东西,其实单片机当中矗了模数、数模转换之外,其他大部分的事情都是可以使用IO口来完成。单片机在大部分应用当中做的事情,莫过于输入高低电平,输出高低电平,就是通过这一些简单的控制电平来实现大多数的应用控制。
I代表了输入,O代表了输出;那么IO具体能做什么呢?IO口输出一个高低电平可以点亮一个LED灯,可以接通一个继电器来启动电机等等,也可以用于通信等等,输入一个高低电平可以用来检测按键,也可以用来检测红外线输入,检测信号等等。
I/O口和单片机内部寄存器之间的对应关系
我们可以从相关的文档、开发手册来看到这一些端口都有用于控制器操作的10个校准的寄存器,他们分别是:
三个标准的工作寄存器:
• PORTx寄存器(读取器件引脚的电平)
• LATx寄存器(输出锁存器)
• TRISx寄存器(数据方向)
还有一些端口
• ANSELx寄存器(模拟选择)
• WPUx寄存器(弱上拉)
• INLVLx(输入电平控制)
• SLRCONx寄存器(压摆率)
• ODCONx寄存器(漏极开路 )
所以我们要进行配置的时候:
1、先配置ANSELx,将IO口定义为摸你还是数字;
2、在进行配置TRISx,将这个IO口定义为输入还是输出;
3.如果定义IO是输入,要得到IO端口的实际电平,那么就要读取PORTx寄存器;如果定义的是IO输出,那么就要通过写LAIx来达到IO口置高还是置低电平操作。
但是要注意的是,如果直接写PORTx,实际上会写到LATx当中,所以一般不会写入PORTx寄存器。如果是直接读取LATx寄存器,读取到的是锁存在GPIOLatch里面的值,而不是真正的端口的值,所以一般也不会读取LATX寄存器。
当某个引脚配置成m模拟IO的时候,必须将其相应的TRISx配置成输入,这才才能读取到引脚上面的外部电压。