打印
[PIC®/AVR®/dsPIC®产品]

PIC 16F18系列单片机开发 IO口配置与stm32的区别

[复制链接]
187|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2025-2-18 11:50 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
前言
由于在之前学习嵌入式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配置成输入,这才才能读取到引脚上面的外部电压。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/Lushengshi/article/details/128304093

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2127

主题

16259

帖子

16

粉丝