[PIC®/AVR®/dsPIC®产品] xc8下指定配置位方法

[复制链接]
 楼主| 598330983 发表于 2024-3-12 15:57 | 显示全部楼层 |阅读模式
#pragma config 伪指令可用于编程器件的配置位。 pragma 伪指令具有以下形式:
#pragma config setting = state|value
其中,setting 是配置设置描述符(如 WDT),state 是一个描述性的值(如 ON),value 是一个数值。使用 “差别”一节中讨论的本机关键字来查找关于该伪指令语义的信息。

以下显示了使用该 pragma 伪指令指定配置位。
#pragma config WDT=ON, WDTPS = 0x1A


对于一些尚不支持 #pragma config 的目标器件, 8 位编译器使用了 __CONFIG()宏。
16 位编译器使用了许多宏来指定配置设置。
32 位编译器支持使用 #pragma config。


移植到 CCI
对于 8 位编译器,更改每一处 __CONFIG() 宏为 #pragma config 伪指令,例如,
将:
__CONFIG(WDTEN & XT & DPROT)
更改为:
#pragma config WDTE=ON, FOSC=XT, CPD=ON
如果已使用了 #pragma config,则无需进行移植。
对于 16 位编译器,更改每一处 _FOSC() 或 _FBORPOR() 宏属性,例如,将:
_FOSC(CSW_FSCM_ON & EC_PLL16);
更改为:
#pragma config FCKSMEM = CSW_ON_FSCM_ON, FPR = ECIO_PLL16
对于 32 位代码,无需进行移植。



 楼主| 598330983 发表于 2024-3-12 15:57 | 显示全部楼层
那么你会自己编写配置位吗?
 楼主| 598330983 发表于 2024-3-12 15:59 | 显示全部楼层
配置位访问
PIC 器件具有几个包含配置位或熔丝的存储单元。这些位指定基本的器件操作,例如振荡器模式、看门狗定时器、编程模式和代码保护。未正确设置这些位可能导致代码失败或器件无法运行。
可以使用配置 pragma 伪指令来设置这些位。该 pragma 伪指令具有以下形式。
#pragma config setting = state|value
#pragma config register = value
其中, setting 是配置设置描述符 (如 WDT), state 是所需状态的文本描述 (如OFF)。 value 字段是一个可以优先用于描述符的数值。
假设存在以下示例:
#pragma config WDT = ON // turn on watchdog timer
#pragma config WDTPS = 0x1A // specify the timer postscale value
通过用逗号分隔每个设置 / 值对,可以使用一条 pragma 伪指令来编程多个设置。例如,
以上示例可以使用一条 pragma 伪指令指定,如下所示。
#pragma config WDT=ON, WDTPS = 0x1A
此外,可以为设置 / 值对加上引号,以确保预处理器不会对这些标记执行替换,例如:
#pragma config "BOREN=OFF"
举例来说,如果不加引号且定义了预处理器宏 OFF,则会在 pragma 伪指令内发生替换。请勿假定在配置宏中使用的 OFF 和 ON 标记分别等同于 0 和 1,因为经常会出现不是如此的情形。
可以使用一个数值来编程整个寄存器,而不需要单独指定各个设置,例如:
#pragma config CONFIG1L = 0x8F
每个寄存器的高半部分和低半部分必须单独编程。
 楼主| 598330983 发表于 2024-3-12 15:59 | 显示全部楼层
配置位遗留支持
对于旧项目,可以继续使用配置宏,但对于新项目,请使用 pragma 伪指令。
编译器支持 __CONFIG 和 __PROG_CONFIG 宏,它们分别用于指定配置位符号或配置字值,例如:
#include <xc.h>
__CONFIG(WDTDIS & HS & UNPROTECT);
对于具有多个配置字的 PIC10/12/16 器件,随后每次调用 __CONFIG() 都将按顺序修改下一个配置字。对这些器件使用旧式宏时,宏的顺序必须与配置字的顺序匹配。通常它具有以下形式:
#include <xc.h>
__CONFIG(WDTDIS & XT & UNPROTECT); // Program config. word 1
__CONFIG(FCMEN);
用于 PIC18 器件的 __CONFIG 宏需要一个指定配置字单元编号的额外参数。例如:
__CONFIG(2, BW8 & PWRTDIS & WDTPS1 & WDTEN); // specify symbols
如果要使用字面值来编程整个配置字,则必须使用__PROG_CONFIG宏。对于PIC10/12/16器件,其形式可能如下:
__PROG_CONFIG(0xFFFA);
而对于 PIC18 器件,必须再次指定要编程的字,如下所示:
__PROG_CONFIG(1, 0xFE57); // specify a literal constant value
在 __PROG_CONFIG 宏中不能使用设置符号,在 __CONFIG 宏中不能使用字面值。
配置单元不需要按顺序进行编程,以上说明的对于多字 PIC10/12/16 器件使用旧式宏的情况除外。
要使用旧式宏,请确保在源文件中包含 <xc.h>。这些宏的符号可以在 .cfgmap 文件中找到,这些文件包含在编译器安装的 dat/cfgmap 目录中。
 楼主| 598330983 发表于 2024-3-12 16:00 | 显示全部楼层
配置注意事项
config pragma 伪指令和 __CONFIG 宏都不会生成可执行代码。它们都应放置在函数定义之外,以免影响函数代码的操作。
MPLAB X IDE 不允许对配置位进行调整。它们必须在源代码中使用 pragma 伪指令(或旧式宏)指定。
配置字中的所有位都应进行编程,以防止意外的程序行为。不要将它们保留为默认 / 未编程状态。并不是所有配置位的默认状态都为逻辑高电平;一些配置位的默认状态为逻辑低电平。更多信息,请查看您所使用器件的数据手册
cen9ce 发表于 2024-3-28 11:53 | 显示全部楼层
这XC8是不是给PIC32使用的啊?
d1ng2x 发表于 2024-3-28 13:01 | 显示全部楼层
配置位的操作确实麻烦,不会玩,但是好像芯片固件会安全点
q1ngt12 发表于 2024-3-28 14:08 | 显示全部楼层
这种配置没有一键配置位操作么
y1n9an 发表于 2024-3-28 15:14 | 显示全部楼层
以前操**特梅尔的时候,还有勾选配置位的
w2nme1ai7 发表于 2024-3-28 16:20 | 显示全部楼层
这种是不是就是属于宏定义啊,针对这配置位的操作
tax2r6c 发表于 2024-3-28 17:26 | 显示全部楼层
PLL16?这不是PLL倍频操作吗
l1uyn9b 发表于 2024-3-28 18:35 | 显示全部楼层
话说配置位的优势是干啥的啊?
q1d0mnx 发表于 2024-3-29 07:05 | 显示全部楼层
编写配置位之后烧录芯片之中?让固件受到保护?
kaif2n9j 发表于 2024-3-29 08:10 | 显示全部楼层
单独编程?是需要编译两次固件的吗?
su1yirg 发表于 2024-3-29 09:46 | 显示全部楼层
感觉配置位的配置有点费劲啊,如果配置不好,会让芯片挂掉吗?
xuanhuanzi 发表于 2024-3-30 15:33 | 显示全部楼层
在软件设置比较容易些。
xuanhuanzi 发表于 2024-3-30 15:33 | 显示全部楼层
配置不好,可能会锁死芯片。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

266

主题

5573

帖子

22

粉丝
快速回复 在线客服 返回列表 返回顶部