2024年5月7日发(作者:公孙青枫)
学习的路上,越努力越渺小。
——单片机初学者
本篇文章以“PIC18F25K80.h”与PIC18F25K80的datasheet进行阐述(PIC18F25K80.h可
在PICC18的安装目录下Include下查找,例:E:MPLABPICC18include)。
//配置寄存器:CONFIG1L
XINST://扩展指令集使能位
1=指令集扩展和变址寻址模式被启用
0=指令集扩展和变址寻址模式被禁用(传统模式)
#defineXINST_ON0xFFFF
#defineXINST_OFF0xFFBF
SOSCSEL<1:0>:SOSC电源选择和模式配置位
11=选择的高功率电路SOSC
10=数字(SCLKI)模式;I/O端口RC0和RC1的功能启用
01=选择低功耗SOSC电路
00=保留
#defineSOSCSEL_HIGH0xFFFF
#defineSOSCSEL_LOW0xFFEF
#defineSOSCSEL_DIG0xFFF7
INTOSCSEL:LF-INTOSC低功耗使能位
1=休眠期间LF-INTOSC在高功率模式下
0=休眠期间LF-INTOSC在低功耗模式下
#defineINTOSCSEL_HIGH0xFFFF
#defineINTOSCSEL_LOW0xFFFB
______________
RETEN:
Vreg
休眠使能位
1=在休眠模式下超低功耗稳压电源关闭,由REGSLP(WDTCON<7>)控制
0=在休眠模式下超低功耗稳压电源使能,由SRETEN(WDTCON<4>)控制,超低功耗调节
器被启用
#defineRETEN_ON0xFFFE
#defineRETEN_OFF0xFFFF
//配置寄存器:CONFIG1H
IESO:内部/外部振荡器切换位
1=双速启动时启用
0=双速启动时禁用
#defineIESO_OFF
#defineIESO_ON
0xFFFF
0x7FFF
FCMEN:故障保护时钟监视器使能位
1=故障保护时钟监视器使能
0=故障保护时钟监视器被禁用
#defineFCMEN_OFF0xFFFF
#defineFCMEN_ON0xBFFF
PLLCFG:4XPLL使能位
1=振荡器乘以4
0=振荡器直接使用
#definePLLCFG_ON
#definePLLCFG_OFF
0xEFFF
0xFFFF
FOSC<3:0>:振荡器选择位
1101=EC1,EC振荡器(低功耗,DC-160KHZ)
1100=EC1IO,EC振荡器,RA6上CLKOUT功能(低功耗,DC-160KHZ)
1011=EC2,EC振荡器(中功率,160KHZ-16MHZ)
1010=EC2IO,EC振荡器,RA6上CLKOUT功能(中功率,160KHZ-16MHZ)
1001=INTIO1,内部RC振荡器,RA6上CLKOUT功能
1000=INTIO2,内部RC振荡器
0111=RC,外部RC振荡器
0110=RCIO,外部RC振荡器,在RA6CKLOUT功能
0101=EC3,EC振荡器(高功率,16MHZ-64MHZ)
0100=EC3IO,EC振荡器,RA6上CLKOUT功能(高功率,16MHZ-64MHZ)
0011=HS1,HS振荡器(中功率,4MHZ-16MHZ)
0010=HS2,HS振荡器(高功率,16MHZ-25MHZ)
0001=XT振荡器
0000=LP振荡器
#defineFOSC_RCIO
#defineFOSC_RC
#defineFOSC_EC1
#defineFOSC_EC1IO
#defineFOSC_EC2
#defineFOSC_EC2IO
#defineFOSC_INTIO1
#defineFOSC_INTIO2
#defineFOSC_EC3
#defineFOSC_EC3IO
#defineFOSC_HS1
#defineFOSC_HS2
0xF0FF
0xF1FF
0xFAFF
0xFBFF
0xFCFF
0xFDFF
0xFEFF
0xFFFF
0xF2FF
0xF3FF
0xF4FF
0xF5FF
#defineFOSC_XT
#defineFOSC_LP
0xF6FF
0xF7FF
注:该处发现PIC18F25K80.h与datasheet说明不一致,具体可以参照实验效果。(目
前,我以PIC18F25K80.h为准设置了外部振荡器,以定时器时钟进行测试,实验未发现异常)
//配置寄存器:CONFIG2L
BORPWR<1:0>:BORMV功率电平位
11=ZPBORVMV而不是BORMV选择
10=BORMV被设置为一个高功率电平
01=BORMV被设置为中功率电平
00=BORMV被设置为低功率电平
#defineBORPWR_ZPBORMV0xFFFF
#defineBORPWR_HIGH0xFFDF
#defineBORPWR_MEDIUM0xFFBF
#defineBORPWR_LOW0xFF9F
BORV<1:0>:欠压复位电压位
11=VBORMV被设定为1.8V
10=VBORMV被设定为2.0V
01=VBORMV被设定为2.7V
00=VBORMV被设定为3.0V
#defineBORV_3
#defineBORV_2
#defineBORV_1
#defineBORV_0
0xFFFF
0xFFF7
0xFFEF
0xFFE7
BOREN<1:0>:欠压复位使能位
11=欠压复位是只在硬件启用(SBOREN被禁用)
10=欠压复位只在硬件下启用,在休眠模式下禁止(SBOREN被禁用)
01=欠压复位使能时,由软件控制(使能SBOREN)
00=欠压复位是在硬件和软件禁用
#defineBOREN_SBORDIS0xFFFF
#defineBOREN_NOSLP0xFFFD
#defineBOREN_ON0xFFFB
#defineBOREN_OFF0xFFF9
PWRTEN:上电延时定时器使能位
1=PWRT被禁用
0=PWRT启用
#definePWRTEN_OFF0xFFFF
#definePWRTEN_ON0xFFFE
//配置寄存器:CONFIG2H
WDTPS<4:0>:看门狗定时器分频选择位
10101-11111=保留
10100=1:1,048,576(4,194.304s)
10011=1:524,288(2,097.152s)
10010=1:262,144(1,048.576s)
10001=1:131,072(524.288s)
10000=1:65,536(262.144s)
01111=1:32,768(131.072s)
01110=1:16,384(65.536s)
01101=1:8,192(32.768s)
01100=1:4,096(16.384s)
01011=1:2,048(8.192s)
01010=1:1,024(4.096s)
01001=1:512(2.048s)
01000=1:256(1.024s)
00111=1:128(512ms)
00110=1:64(256ms)
00101=1:32(128ms)
00100=1:16(64ms)
00011=1:8(32ms)
00010=1:4(16ms)
00001=1:2(8ms)
00000=1:1(4ms)
#defineWDTPS_1048576
#defineWDTPS_524288
#defineWDTPS_262144
#defineWDTPS_131072
#defineWDTPS_65536
#defineWDTPS_32768
#defineWDTPS_16384
#defineWDTPS_8192
#defineWDTPS_4096
#defineWDTPS_2048
#defineWDTPS_1024
#defineWDTPS_512
#defineWDTPS_256
#defineWDTPS_128
0xFFFF
0xCFFF
0xCBFF
0xC7FF
0xC3FF
0xBFFF
0xBBFF
0xB7FF
0xB3FF
0xAFFF
0xABFF
0xA7FF
0xA3FF
0x9FFF
#defineWDTPS_64
#defineWDTPS_32
#defineWDTPS_16
#defineWDTPS_8
#defineWDTPS_4
#defineWDTPS_2
#defineWDTPS_1
0x9BFF
0x97FF
0x93FF
0x8FFF
0x8BFF
0x87FF
0x83FF
WDTEN<1:0>:看门狗定时器使能位
11=WDT在硬件中启用;SWDTEN位被禁用
10=WDT由SWDTEN位设置控制
01=仅当设备处于活动状态WDT启用,休眠模式禁用;SWDTEN位禁用
00=WDT是硬件禁用;SWDTEN位被禁用
#defineWDTEN_SWDTDIS0xFFFF
#defineWDTEN_ON0xFEFF
#defineWDTEN_NOSLP0xFDFF
#defineWDTEN_OFF0xFCFF
//配置寄存器:CONFIG3H
MCLRE:MCLR引脚使能位
1=MCLR引脚使能;RG5输入引脚被禁用
0=RG5输入引脚使能;禁止MCLR
#defineMCLRE_ON0xFFFF
#defineMCLRE_OFF0x7FFF
MSSPMSK:MSSPV37位地址掩码模式使能位
1=7位地址掩码模式已启用
0=5位地址掩码模式已启用
#defineMSSPMSK_MSK70xFFFF
#defineMSSPMSK_MSK50xF7FF
T3CKMX:Timer3时钟输入引脚复用位
1=Timer3从64引脚封装的RG2/T3CKI引脚获得时钟输入
0=Timer3从64引脚封装的RB5/T3CKI引脚获取时钟输入
T0CKMX:Timer0时钟输入引脚复用位
1=Timer0从64引脚封装的RB5/T0CKI引脚获得时钟输入
0=Timer0从64引脚封装的RG4/T0CKI引脚获得时钟输入
CANMX:ECAN引脚复用位
1=CANTX和CANRX引脚分别位于RB2和RB3上
0=CANTX和CANRX引脚分别位于RC6和RC7上(28引脚和40/44引脚)
封装)或RE4和RE5分别(64引脚封装)
#defineCANMX_PORTB0xFFFF
#defineCANMX_PORTC0xFEFF
//配置寄存器:CONFIG4L
-----------------------
DEBUG:后台调试器使能位
1=后台调试已禁用,RB6和RB7被配置为通用I/O引脚
0=后台调试启用,RB6和RB7专用于在线调试
BBSIZ0:引导块大小选择位
1=2千瓦引导块大小
0=1千瓦引导块大小
#defineBBSIZ_BB2K
#defineBBSIZ_BB1K
0xFFFF
0xFFEF
STVREN:堆栈满/下溢复位使能位
1=堆栈满/下溢将导致复位
0=堆栈满/下溢不会导致复位
#defineSTVREN_ON0xFFFF
#defineSTVREN_OFF0xFFFE
//配置寄存器:CONFIG5L
CP3:代码保护位
1=Block3没有代码保护
0=Block3代码保护
#defineCP3_OFF
#defineCP3_ON
CP2:代码保护位
1=Block2没有代码保护
0=Block2代码保护
#defineCP2_OFF
#defineCP2_ON
0xFFFF
0xFFF7
0xFFFF
0xFFFB
CP1:代码保护位
1=Block1没有代码保护
0=Block1代码保护
#defineCP1_OFF
#defineCP1_ON
CP0:代码保护位
1=Block0没有代码保护
0=Block0代码保护
#defineCP0_OFF
#defineCP0_ON
0xFFFF
0xFFFD
0xFFFF
0xFFFE
//配置寄存器:CONFIG5H
CPD:数据EEPROM代码保护位
1=数据EEPROM没有代码保护
0=数据EEPROM代码保护
#defineCPD_OFF0xFFFF
#defineCPD_ON0x7FFF
CPB:引导区代码保护位
1=引导块不是代码保护
0=引导块代码保护
#defineCPB_OFF
#defineCPB_ON
0xFFFF
0xBFFF
//配置寄存器:CONFIG6L
WRT3:写保护位
1=Block3没有写保护
0=Block3写保护
#defineWRT3_OFF
#defineWRT3_ON
WRT2:写保护位
1=Block2没有写保护
0=Block2写保护
0xFFFF
0xFFF7
#defineWRT2_OFF
#defineWRT2_ON
WRT1:写保护位
1=Block1没有写保护
0=Block1写保护
#defineWRT1_OFF
#defineWRT1_ON
WRT0:写保护位
1=Block0没有写保护
0=Block0写保护
#defineWRT0_OFF
#defineWRT0_ON
0xFFFF
0xFFFB
0xFFFF
0xFFFD
0xFFFF
0xFFFE
//配置寄存器:CONFIG6H
WRTD:数据EEPROM写保护位
1=数据EEPROM没有写保护
0=数据EEPROM写保护
#defineWRTC_OFF0xFFFF
#defineWRTC_ON0xDFFF
WRTB:引导块写保护位
1=引导块没有写保护
0=引导块写保护
#defineWRTB_OFF
#defineWRTB_ON
0xFFFF
0xBFFF
WRTC:配置寄存器的写保护位
1=配置寄存器,没有写保护
0=配置寄存器,写保护
#defineWRTD_OFF0xFFFF
#defineWRTD_ON0x7FFF
//配置寄存器:CONFIG7L
EBTR3:表读保护位
1=不保护Block3免受在其他块中执行的表读取
0=保护Block3免受在其他块中执行的表读取
#defineEBTR3_OFF0xFFFF
#defineEBTR3_ON0xFFF7
EBTR2:表读保护位
1=不保护Block2免受在其他块中执行的表读取
0=保护Block2免受在其他块中执行的表读取
#defineEBTR2_OFF0xFFFF
#defineEBTR2_ON0xFFFB
EBTR1:表读保护位
1=不保护Block1免受在其他块中执行的表读取
0=保护Block1免受在其他块中执行的表读取
#defineEBTR1_OFF0xFFFF
#defineEBTR1_ON0xFFFD
EBTR0:表读保护位
1=不保护Block0免受在其他块中执行的表读取
0=保护Block0免受在其他块中执行的表读取
#defineEBTR0_OFF0xFFFF
#defineEBTR0_ON0xFFFE
//配置寄存器:CONFIG7H
EBTRB:引导块表读保护位
1=不保护引导块不受其他块中执行的表读取的影响
0=保护引导块不受其他块中执行的表读取的影响
#defineEBTRB_OFF0xFFFF
#defineEBTRB_ON0xBFFF
综上可对PIC18的配置字进行设置,PIC单片机的配置字由__CONFIG(w,s)命令进行设置。
(__CONFIG(w,s)函数在PICC18的安装目录下Include下的PIC18.h中查找,例:
E:MPLABPICC18include)
PIC18的配置位设置与其他配置字设置不一致,其需要单独对每一个配置寄存器进行设
置,也就是CONFIG1…7是分开写的。以我编写的为例:
__CONFIG(1,XINST_OFF&SOSCSEL_DIG&FOSC_HS1&FCMEN_OFF&PLLCFG_OFF);
__CONFIG(2,PWRTEN_OFF&WDTEN_OFF&BOREN_OFF);
__CONFIG(4,STVREN_OFF);
注:配置字设置可参照以上格式进行设置,具体设置值参照上文配置寄存器含义。最好是将
涉及到的配置都进行设置,因为默认配置不适用于大众代码,例如:看门狗是默认打开的,
如若不进行设置,则上电后会出现不断复位,而究其代码却查找不出复位原因。
2024年5月7日发(作者:公孙青枫)
学习的路上,越努力越渺小。
——单片机初学者
本篇文章以“PIC18F25K80.h”与PIC18F25K80的datasheet进行阐述(PIC18F25K80.h可
在PICC18的安装目录下Include下查找,例:E:MPLABPICC18include)。
//配置寄存器:CONFIG1L
XINST://扩展指令集使能位
1=指令集扩展和变址寻址模式被启用
0=指令集扩展和变址寻址模式被禁用(传统模式)
#defineXINST_ON0xFFFF
#defineXINST_OFF0xFFBF
SOSCSEL<1:0>:SOSC电源选择和模式配置位
11=选择的高功率电路SOSC
10=数字(SCLKI)模式;I/O端口RC0和RC1的功能启用
01=选择低功耗SOSC电路
00=保留
#defineSOSCSEL_HIGH0xFFFF
#defineSOSCSEL_LOW0xFFEF
#defineSOSCSEL_DIG0xFFF7
INTOSCSEL:LF-INTOSC低功耗使能位
1=休眠期间LF-INTOSC在高功率模式下
0=休眠期间LF-INTOSC在低功耗模式下
#defineINTOSCSEL_HIGH0xFFFF
#defineINTOSCSEL_LOW0xFFFB
______________
RETEN:
Vreg
休眠使能位
1=在休眠模式下超低功耗稳压电源关闭,由REGSLP(WDTCON<7>)控制
0=在休眠模式下超低功耗稳压电源使能,由SRETEN(WDTCON<4>)控制,超低功耗调节
器被启用
#defineRETEN_ON0xFFFE
#defineRETEN_OFF0xFFFF
//配置寄存器:CONFIG1H
IESO:内部/外部振荡器切换位
1=双速启动时启用
0=双速启动时禁用
#defineIESO_OFF
#defineIESO_ON
0xFFFF
0x7FFF
FCMEN:故障保护时钟监视器使能位
1=故障保护时钟监视器使能
0=故障保护时钟监视器被禁用
#defineFCMEN_OFF0xFFFF
#defineFCMEN_ON0xBFFF
PLLCFG:4XPLL使能位
1=振荡器乘以4
0=振荡器直接使用
#definePLLCFG_ON
#definePLLCFG_OFF
0xEFFF
0xFFFF
FOSC<3:0>:振荡器选择位
1101=EC1,EC振荡器(低功耗,DC-160KHZ)
1100=EC1IO,EC振荡器,RA6上CLKOUT功能(低功耗,DC-160KHZ)
1011=EC2,EC振荡器(中功率,160KHZ-16MHZ)
1010=EC2IO,EC振荡器,RA6上CLKOUT功能(中功率,160KHZ-16MHZ)
1001=INTIO1,内部RC振荡器,RA6上CLKOUT功能
1000=INTIO2,内部RC振荡器
0111=RC,外部RC振荡器
0110=RCIO,外部RC振荡器,在RA6CKLOUT功能
0101=EC3,EC振荡器(高功率,16MHZ-64MHZ)
0100=EC3IO,EC振荡器,RA6上CLKOUT功能(高功率,16MHZ-64MHZ)
0011=HS1,HS振荡器(中功率,4MHZ-16MHZ)
0010=HS2,HS振荡器(高功率,16MHZ-25MHZ)
0001=XT振荡器
0000=LP振荡器
#defineFOSC_RCIO
#defineFOSC_RC
#defineFOSC_EC1
#defineFOSC_EC1IO
#defineFOSC_EC2
#defineFOSC_EC2IO
#defineFOSC_INTIO1
#defineFOSC_INTIO2
#defineFOSC_EC3
#defineFOSC_EC3IO
#defineFOSC_HS1
#defineFOSC_HS2
0xF0FF
0xF1FF
0xFAFF
0xFBFF
0xFCFF
0xFDFF
0xFEFF
0xFFFF
0xF2FF
0xF3FF
0xF4FF
0xF5FF
#defineFOSC_XT
#defineFOSC_LP
0xF6FF
0xF7FF
注:该处发现PIC18F25K80.h与datasheet说明不一致,具体可以参照实验效果。(目
前,我以PIC18F25K80.h为准设置了外部振荡器,以定时器时钟进行测试,实验未发现异常)
//配置寄存器:CONFIG2L
BORPWR<1:0>:BORMV功率电平位
11=ZPBORVMV而不是BORMV选择
10=BORMV被设置为一个高功率电平
01=BORMV被设置为中功率电平
00=BORMV被设置为低功率电平
#defineBORPWR_ZPBORMV0xFFFF
#defineBORPWR_HIGH0xFFDF
#defineBORPWR_MEDIUM0xFFBF
#defineBORPWR_LOW0xFF9F
BORV<1:0>:欠压复位电压位
11=VBORMV被设定为1.8V
10=VBORMV被设定为2.0V
01=VBORMV被设定为2.7V
00=VBORMV被设定为3.0V
#defineBORV_3
#defineBORV_2
#defineBORV_1
#defineBORV_0
0xFFFF
0xFFF7
0xFFEF
0xFFE7
BOREN<1:0>:欠压复位使能位
11=欠压复位是只在硬件启用(SBOREN被禁用)
10=欠压复位只在硬件下启用,在休眠模式下禁止(SBOREN被禁用)
01=欠压复位使能时,由软件控制(使能SBOREN)
00=欠压复位是在硬件和软件禁用
#defineBOREN_SBORDIS0xFFFF
#defineBOREN_NOSLP0xFFFD
#defineBOREN_ON0xFFFB
#defineBOREN_OFF0xFFF9
PWRTEN:上电延时定时器使能位
1=PWRT被禁用
0=PWRT启用
#definePWRTEN_OFF0xFFFF
#definePWRTEN_ON0xFFFE
//配置寄存器:CONFIG2H
WDTPS<4:0>:看门狗定时器分频选择位
10101-11111=保留
10100=1:1,048,576(4,194.304s)
10011=1:524,288(2,097.152s)
10010=1:262,144(1,048.576s)
10001=1:131,072(524.288s)
10000=1:65,536(262.144s)
01111=1:32,768(131.072s)
01110=1:16,384(65.536s)
01101=1:8,192(32.768s)
01100=1:4,096(16.384s)
01011=1:2,048(8.192s)
01010=1:1,024(4.096s)
01001=1:512(2.048s)
01000=1:256(1.024s)
00111=1:128(512ms)
00110=1:64(256ms)
00101=1:32(128ms)
00100=1:16(64ms)
00011=1:8(32ms)
00010=1:4(16ms)
00001=1:2(8ms)
00000=1:1(4ms)
#defineWDTPS_1048576
#defineWDTPS_524288
#defineWDTPS_262144
#defineWDTPS_131072
#defineWDTPS_65536
#defineWDTPS_32768
#defineWDTPS_16384
#defineWDTPS_8192
#defineWDTPS_4096
#defineWDTPS_2048
#defineWDTPS_1024
#defineWDTPS_512
#defineWDTPS_256
#defineWDTPS_128
0xFFFF
0xCFFF
0xCBFF
0xC7FF
0xC3FF
0xBFFF
0xBBFF
0xB7FF
0xB3FF
0xAFFF
0xABFF
0xA7FF
0xA3FF
0x9FFF
#defineWDTPS_64
#defineWDTPS_32
#defineWDTPS_16
#defineWDTPS_8
#defineWDTPS_4
#defineWDTPS_2
#defineWDTPS_1
0x9BFF
0x97FF
0x93FF
0x8FFF
0x8BFF
0x87FF
0x83FF
WDTEN<1:0>:看门狗定时器使能位
11=WDT在硬件中启用;SWDTEN位被禁用
10=WDT由SWDTEN位设置控制
01=仅当设备处于活动状态WDT启用,休眠模式禁用;SWDTEN位禁用
00=WDT是硬件禁用;SWDTEN位被禁用
#defineWDTEN_SWDTDIS0xFFFF
#defineWDTEN_ON0xFEFF
#defineWDTEN_NOSLP0xFDFF
#defineWDTEN_OFF0xFCFF
//配置寄存器:CONFIG3H
MCLRE:MCLR引脚使能位
1=MCLR引脚使能;RG5输入引脚被禁用
0=RG5输入引脚使能;禁止MCLR
#defineMCLRE_ON0xFFFF
#defineMCLRE_OFF0x7FFF
MSSPMSK:MSSPV37位地址掩码模式使能位
1=7位地址掩码模式已启用
0=5位地址掩码模式已启用
#defineMSSPMSK_MSK70xFFFF
#defineMSSPMSK_MSK50xF7FF
T3CKMX:Timer3时钟输入引脚复用位
1=Timer3从64引脚封装的RG2/T3CKI引脚获得时钟输入
0=Timer3从64引脚封装的RB5/T3CKI引脚获取时钟输入
T0CKMX:Timer0时钟输入引脚复用位
1=Timer0从64引脚封装的RB5/T0CKI引脚获得时钟输入
0=Timer0从64引脚封装的RG4/T0CKI引脚获得时钟输入
CANMX:ECAN引脚复用位
1=CANTX和CANRX引脚分别位于RB2和RB3上
0=CANTX和CANRX引脚分别位于RC6和RC7上(28引脚和40/44引脚)
封装)或RE4和RE5分别(64引脚封装)
#defineCANMX_PORTB0xFFFF
#defineCANMX_PORTC0xFEFF
//配置寄存器:CONFIG4L
-----------------------
DEBUG:后台调试器使能位
1=后台调试已禁用,RB6和RB7被配置为通用I/O引脚
0=后台调试启用,RB6和RB7专用于在线调试
BBSIZ0:引导块大小选择位
1=2千瓦引导块大小
0=1千瓦引导块大小
#defineBBSIZ_BB2K
#defineBBSIZ_BB1K
0xFFFF
0xFFEF
STVREN:堆栈满/下溢复位使能位
1=堆栈满/下溢将导致复位
0=堆栈满/下溢不会导致复位
#defineSTVREN_ON0xFFFF
#defineSTVREN_OFF0xFFFE
//配置寄存器:CONFIG5L
CP3:代码保护位
1=Block3没有代码保护
0=Block3代码保护
#defineCP3_OFF
#defineCP3_ON
CP2:代码保护位
1=Block2没有代码保护
0=Block2代码保护
#defineCP2_OFF
#defineCP2_ON
0xFFFF
0xFFF7
0xFFFF
0xFFFB
CP1:代码保护位
1=Block1没有代码保护
0=Block1代码保护
#defineCP1_OFF
#defineCP1_ON
CP0:代码保护位
1=Block0没有代码保护
0=Block0代码保护
#defineCP0_OFF
#defineCP0_ON
0xFFFF
0xFFFD
0xFFFF
0xFFFE
//配置寄存器:CONFIG5H
CPD:数据EEPROM代码保护位
1=数据EEPROM没有代码保护
0=数据EEPROM代码保护
#defineCPD_OFF0xFFFF
#defineCPD_ON0x7FFF
CPB:引导区代码保护位
1=引导块不是代码保护
0=引导块代码保护
#defineCPB_OFF
#defineCPB_ON
0xFFFF
0xBFFF
//配置寄存器:CONFIG6L
WRT3:写保护位
1=Block3没有写保护
0=Block3写保护
#defineWRT3_OFF
#defineWRT3_ON
WRT2:写保护位
1=Block2没有写保护
0=Block2写保护
0xFFFF
0xFFF7
#defineWRT2_OFF
#defineWRT2_ON
WRT1:写保护位
1=Block1没有写保护
0=Block1写保护
#defineWRT1_OFF
#defineWRT1_ON
WRT0:写保护位
1=Block0没有写保护
0=Block0写保护
#defineWRT0_OFF
#defineWRT0_ON
0xFFFF
0xFFFB
0xFFFF
0xFFFD
0xFFFF
0xFFFE
//配置寄存器:CONFIG6H
WRTD:数据EEPROM写保护位
1=数据EEPROM没有写保护
0=数据EEPROM写保护
#defineWRTC_OFF0xFFFF
#defineWRTC_ON0xDFFF
WRTB:引导块写保护位
1=引导块没有写保护
0=引导块写保护
#defineWRTB_OFF
#defineWRTB_ON
0xFFFF
0xBFFF
WRTC:配置寄存器的写保护位
1=配置寄存器,没有写保护
0=配置寄存器,写保护
#defineWRTD_OFF0xFFFF
#defineWRTD_ON0x7FFF
//配置寄存器:CONFIG7L
EBTR3:表读保护位
1=不保护Block3免受在其他块中执行的表读取
0=保护Block3免受在其他块中执行的表读取
#defineEBTR3_OFF0xFFFF
#defineEBTR3_ON0xFFF7
EBTR2:表读保护位
1=不保护Block2免受在其他块中执行的表读取
0=保护Block2免受在其他块中执行的表读取
#defineEBTR2_OFF0xFFFF
#defineEBTR2_ON0xFFFB
EBTR1:表读保护位
1=不保护Block1免受在其他块中执行的表读取
0=保护Block1免受在其他块中执行的表读取
#defineEBTR1_OFF0xFFFF
#defineEBTR1_ON0xFFFD
EBTR0:表读保护位
1=不保护Block0免受在其他块中执行的表读取
0=保护Block0免受在其他块中执行的表读取
#defineEBTR0_OFF0xFFFF
#defineEBTR0_ON0xFFFE
//配置寄存器:CONFIG7H
EBTRB:引导块表读保护位
1=不保护引导块不受其他块中执行的表读取的影响
0=保护引导块不受其他块中执行的表读取的影响
#defineEBTRB_OFF0xFFFF
#defineEBTRB_ON0xBFFF
综上可对PIC18的配置字进行设置,PIC单片机的配置字由__CONFIG(w,s)命令进行设置。
(__CONFIG(w,s)函数在PICC18的安装目录下Include下的PIC18.h中查找,例:
E:MPLABPICC18include)
PIC18的配置位设置与其他配置字设置不一致,其需要单独对每一个配置寄存器进行设
置,也就是CONFIG1…7是分开写的。以我编写的为例:
__CONFIG(1,XINST_OFF&SOSCSEL_DIG&FOSC_HS1&FCMEN_OFF&PLLCFG_OFF);
__CONFIG(2,PWRTEN_OFF&WDTEN_OFF&BOREN_OFF);
__CONFIG(4,STVREN_OFF);
注:配置字设置可参照以上格式进行设置,具体设置值参照上文配置寄存器含义。最好是将
涉及到的配置都进行设置,因为默认配置不适用于大众代码,例如:看门狗是默认打开的,
如若不进行设置,则上电后会出现不断复位,而究其代码却查找不出复位原因。