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

xc8下指定配置位方法

[复制链接]
499|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 目录中。

使用特权

评论回复
5
598330983|  楼主 | 2024-3-12 16:00 | 只看该作者
配置注意事项
config pragma 伪指令和 __CONFIG 宏都不会生成可执行代码。它们都应放置在函数定义之外,以免影响函数代码的操作。
MPLAB X IDE 不允许对配置位进行调整。它们必须在源代码中使用 pragma 伪指令(或旧式宏)指定。
配置字中的所有位都应进行编程,以防止意外的程序行为。不要将它们保留为默认 / 未编程状态。并不是所有配置位的默认状态都为逻辑高电平;一些配置位的默认状态为逻辑低电平。更多信息,请查看您所使用器件的数据手册

使用特权

评论回复
6
cen9ce| | 2024-3-28 11:53 | 只看该作者
这XC8是不是给PIC32使用的啊?

使用特权

评论回复
7
d1ng2x| | 2024-3-28 13:01 | 只看该作者
配置位的操作确实麻烦,不会玩,但是好像芯片固件会安全点

使用特权

评论回复
8
q1ngt12| | 2024-3-28 14:08 | 只看该作者
这种配置没有一键配置位操作么

使用特权

评论回复
9
y1n9an| | 2024-3-28 15:14 | 只看该作者
以前操**特梅尔的时候,还有勾选配置位的

使用特权

评论回复
10
w2nme1ai7| | 2024-3-28 16:20 | 只看该作者
这种是不是就是属于宏定义啊,针对这配置位的操作

使用特权

评论回复
11
tax2r6c| | 2024-3-28 17:26 | 只看该作者
PLL16?这不是PLL倍频操作吗

使用特权

评论回复
12
l1uyn9b| | 2024-3-28 18:35 | 只看该作者
话说配置位的优势是干啥的啊?

使用特权

评论回复
13
q1d0mnx| | 2024-3-29 07:05 | 只看该作者
编写配置位之后烧录芯片之中?让固件受到保护?

使用特权

评论回复
14
kaif2n9j| | 2024-3-29 08:10 | 只看该作者
单独编程?是需要编译两次固件的吗?

使用特权

评论回复
15
su1yirg| | 2024-3-29 09:46 | 只看该作者
感觉配置位的配置有点费劲啊,如果配置不好,会让芯片挂掉吗?

使用特权

评论回复
16
xuanhuanzi| | 2024-3-30 15:33 | 只看该作者
在软件设置比较容易些。

使用特权

评论回复
17
xuanhuanzi| | 2024-3-30 15:33 | 只看该作者
配置不好,可能会锁死芯片。

使用特权

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

本版积分规则

227

主题

5279

帖子

22

粉丝