历史上的今天
返回首页

历史上的今天

今天是:2025年03月06日(星期四)

正在发生

2020年03月06日 | MPLAB程序中如何设置配置字

2020-03-06 来源:eefocus

在不同的芯片中其配置字不尽相同,但是管家最常用到的有如下几部分:

1,芯片的振荡模式,有内外之分,还有三个速度的选择

2,片内看门狗的启用,配置字中有专门控制控制片看门狗的开口或关闭,不能用软件控制

3,上电复位延时定时器PWRT的启用。

4,低电压检测复位BOR模块的启用

5,代码保护控制,一旦启用代码保护功能,就可以防止程序被非法读出,注意的是,对于EPROM型的窗口片,一旦用户代码保护打开,就不能被关闭,所以调试是一定不能打开代码保护。对Flash型芯片,对芯片实施完全擦除后,包括代码保护等其他配置位信息还可恢复而能再次改写

6针对不同的芯片还有低压编程等控制。Mplab中有一个configuration bit的控制窗口可设置配置字


简单点:


Oscillator选择HS;


XINST = OFF // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))


Internal/External Oscillator Switchover bit 选择disable;


Watchdog Timer选择disable;(看门狗在调试模式下无效,只有在烧写程序时才能将看门狗打开。)


其余选项均选择disable。



PIC 里面关于 __CONFIG( ) 配置位

一.配置字

      PIC单片机的配置字可以用__CONFIG命令来定义:

    #i nclude

         __CONFIG(x)   ;其中x是配置字,头文件中定义了相应的配置说明符。


如:

        __CONFIG(WDTDIS & XT & UNPROTECT);

       这将关闭看门狗,设置XT振方式,程序不加密。注意:不同的配置符间用'&'相联,未定义的部分保留未编程状态。详细的情况请参考头文件及PIC数据手册


二.ID 位置

      有些PIC单片机在程序空间外还有ID空间,可用下面的方法来定义:

#i nclude

      __IDLOC(x) ;其中x是ID标示。


如:

      __IDLOC(15F0);

   将ID的四个单元定义为:1, 5, 15, 0. ID的具体位置由所指定的PIC芯片自动设定。


三.EEPROM 数据

       有些PIC单片机支持用外部编程器对内部的EEPROM进行编程。

      __EEPROM_DATA()可以将用于初始化的数据放入HEX文件中。


如:

       __EEPROM_DATA(0, 1, 2, 3, 4, 5, 6, 7)

可将0-7八个数放入HEX文件中,在用外部的编程器进行编程时将 这八个数写入PIC单片机中。

__EEPROM_DATA不是用于运行时写入EEPROM数据的,在运行时请用 EEPROM_READ(), EEPROM_WRITE()。


========================================================================


PIC18__config配置位


     PIC18的__CONFIG设置与PIC16的不一样。


PIC16的如:


        __CONFIG(_CP_OFF&_WDT_ON&_BODEN_ON&_PWRTE_ON&_RC_OSC); 是写在一起的。


PIC18 不写在一起,CONFIG1..7是分开写的。如:


      __CONFIG(1,IESODIS&FCMDIS&HS);

      __CONFIG(2,BOREN&PWRTEN&WDTDIS&WDTWINDIS&WDTPS32K);

      __CONFIG(3,MCLREN);

      __CONFIG(4,DEBUGEN&XINSTEN&STVRDIS);

      __CONFIG(5,UNPROTECT);


__CONFIG(N,X) 函数原型在PIC18.H文件中(PICC软件安装目录下的include文件夹中)。里面的各项设置在PIC18Fxx22.H中。N代表配置信息;X代表设置变量。如果要实现处理器的一些特殊功能,则需要查找相关的帮助文件,根据帮助文件的提示,在同文件中定义相关的变量。


上面的各项设置意义是:


     //各项内容在PIC18FXX22.H文件中定义

    //1.振荡器切换OFF&故障保护时钟监视器OFF&高速模式

    //2.欠压复位ON&上电延时ON&看门狗OFF&看门狗分频数

    //3.mclr用于复位脚

    //4.使能后台调试器&使能指令集扩展&堆栈溢出不复位

   //5.代码不保护


==========================================================================


       笔者在使用picc18进行基于PIC18F452的软件开发时,发现对于18系列的单片机,手动设置配置位非常麻烦,而且容易出错,所以考虑在源程序中设定配置位,这样编译后,无论是用什么烧写工具,都不需要再进行配置位的设定了。

      对于HI-TECH C18 , 配置字的设定通过宏 __CONFIG(n,x)来实现. 

宏__CONFIG(n,x)的声明在文件pic18.h中,各位元的声明在对应芯片型号的头文件中.18F452的例程如下: 

//***************************************************************************************

    #include  

//***************************************************************************************

//*The declaration of __CONFIG(n,x) is in pic18.h                    * 

//*The __CONFIG(n,x) directive defines configuration data within is in pic18fxx2.h        * 

//***************************************************************************************

    __CONFIG(1,RC) ; 

    __CONFIG(2,PWRTDIS & WDTPS1 & WDTEN ) ; 

    __CONFIG(4,STVRDIS) ; 

    void main(void) 

//your code 

//*************************************************************************

在pic18.h中,__CONFIG(n,x)的声明如下     

#define    __CONFIG(n, x)    asm("tpsect config,class=CONFIG"); 

            asm("global config_word" ___mkstr(n));  

            asm("config_word" ___mkstr(n)":");  

            asm("torg ("___mkstr(n)"-1)*2");  

            asm("tdw "___mkstr(x)) 

部分在pic18.h中的声明大体如下,具体请参考对应的头文件。 

// Configuration bit values 

// Config. Register 1 

#define OSCSEN        0xDFFF        // enable oscillator system clock 

#define OSCSDIS        0xFFFF 

// oscilator types 

#define RCRA6        0xFFFF        // RC w/OSC2 config as RA6 

#define HSPLL        0xFEFF        // HS w/PLL Enabled, Clk Freq = 4xFreq Osc. 

#define ECRA6        0xFDFF        // EC w/OSC2 config. as RA6 

#define ECDB4        0xFCFF        // EC w/OSC2 as divide by 4 clock output 

#define RC        0xFBFF 

#define HS        0xFAFF 

#define XT        0xF9FF         

#define LP            0xF8FF 


// Config. Register 2 

// Brown Out reset 

#define    BOREN        0xFFFF        // Brown-out reset enable

n代表 Config. Register n(代表配置信息), 例如__CONFIG(1,x); 1 代表Config. Register 1, X可为OSCSEN,RC等。

!!!最后还应该注意的是如果在源程序中进行配置位设置,如果使用的软件版本(比如使用picc18的8.20版本和MPLAB6.30)较低,虽然编译不会有问题,但可能会出现配置位设置混乱,推荐使用picc18的8.35版本和MPLAB7.0以上。安装HTSOFT的软件时,也必须保证完全安装,尤其是一定要安装MPLAB_toolsuites工具。


==========================================================================


如下:PIC18F452中PIC18.h     (此时源程序,哪位高人可否解析下?共同学习。)


/* Store a word value to a particular configuration word register eg.

 * __CONFIG(4, DEBUGEN & LVPDIS); // write to config word 4

 * config mask attributes (such as DEBUGEN) defined in chip-specific

 * header file. */

#define __CONFIG(n, x) asm("tpsect config,class=CONFIG");    /**t是制表符,格式需要;psect 是定义class的关键字,意思是将以下的代码放入CONFIG class 中,并命名为config(注意大小写);config为自定义的class名,可以为任何其他名字;CONFIG说明了这个class的起始地址,在连续命令中指定CONFIG的范围delta=2,规定就是这样的。**/

   asm("global config_word" ___mkstr(n));     /***__mkstr(x)是一个将数字转换为字符的宏,目的是让编译器把一个数字当作是一个字符串来处理,如果不用__mkstr,你需要写成__CONFIG("0x0F")的形式,使用了__mkstr,直接写成__CONFIG(0x0F)的形式就行了,这一切只是为了用户更友好的使用这些宏,没什么特别的意思


***/




Microchip 几种编译器 在代码中 对CONFIG 位的配置   

Microchip 几种编译器 在代码中 对CONFIG 位的配置

 

;************************************************************************************


;*CONFIG Setting for PIC16/18              *


;*This text is mainly on the method for the setting of configuration bits with both assembler&C. *


;************************************************************************************


--------------  MPASM for PIC16Fxxx   ----------------------------------------------------


;*******************************************************************************************


;*1.To set CONFIG with assembler                    *


;*With the source code written in assembler the configuration bits can been set by micro __CONFIG  *


;*The micro __CONFIG  is after with the include file.                 *


;*******************************************************************************************


;*******************************************************************************************


;*Example 1,  CONFIG set for 16F877A                   *


;*******************************************************************************************


 list p=16f877A ; list directive to define processor


 #include ; processor specific variable definitions


;************************************************************************


;*Configuration bits              *


;*The __CONFIG directive defines configuration data within the .ASM file.  *


;* The labels following the directive are defined in the P16F877A.INC file.  *


;*The PIC16F877A Data Sheet explains the functions of the configuration bits. *


;************************************************************************


__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _RC_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF


; variable definitions


;your code


;;


END ;end of program


;**********************************************************************************


-------------------   MPASM for PIC18Fxxxx   -----------------------------------


;**************************************************************************************


;*Example 2, CONFIG set for 18F452. As the configuration bits is more complex than 16F877,     *


;*it maps to more bytes in program memory instead of  one word.          *


;**************************************************************************************


 LIST P=18F452   ;directive to define processor


 #include ;processor specific variable definitions


;****************************************************************************


;*Configuration bits               *


;*The __CONFIG directive defines configuration data within the .ASM file.   *


;* The labels following the directive are defined in the P18F452.INC file.   *


; *The PIC18FXX2 Data Sheet explains the functions of the configuration bits.  *


;*****************************************************************************


 __CONFIG _CONFIG1H, _OSCS_OFF_1H & _HS_OSC_1H


 __CONFIG _CONFIG2L, _BOR_OFF_2L & _PWRT_OFF_2L


 __CONFIG _CONFIG2H, _WDT_OFF_2H


 __CONFIG _CONFIG3H, _CCP2MX_OFF_3H


 __CONFIG _CONFIG4L, _STVR_OFF_4L & _LVP_OFF_4L & _DEBUG_OFF_4L

推荐阅读

史海拾趣

AMS公司的发展小趣事

AMS(Austria Microsystems)公司是一家总部位于奥地利的半导体制造商,专注于开发和生产高性能的模拟半导体解决方案。以下是 AMS 公司发展的五个相关故事:

  1. 创立与早期阶段:AMS 公司成立于1981年,最初是一家从事晶圆制造的小型企业。公司创始人团队以其对半导体技术的深刻理解和创新能力,在短时间内取得了一定的成就。早期产品主要包括模拟集成电路(IC)和传感器,为医疗、汽车、工业等领域提供解决方案。

  2. 技术创新与产品扩展:随着市场需求的不断变化和技术的进步,AMS 公司不断进行技术创新,并扩展了产品线。公司致力于开发具有高性能、低功耗和小尺寸的模拟半导体产品,以满足智能手机、消费电子、工业自动化等领域的需求。公司的产品涵盖了光学传感器、环境传感器、声学传感器等多个领域。

  3. 全球化发展与市场拓展:AMS 公司通过不断拓展全球市场,加强与客户和合作伙伴的合作关系,实现了快速的业务增长。公司在欧洲、亚洲和美洲设立了多个销售办事处和生产基地,建立了完善的全球供应链和销售网络。公司的产品销售网络覆盖了全球范围,得到了国内外客户的广泛认可。

  4. 收购与合并:随着公司规模的扩大和市场竞争的加剧,AMS 公司通过收购和合并等方式不断强化自身实力。公司先后收购了一些技术领先的公司,扩大了产品线和市场份额。此举进一步提升了公司在模拟半导体领域的竞争优势,加速了公司的业务增长。

  5. 持续创新与未来展望:AMS 公司将继续致力于技术创新和产品研发,不断提升产品性能和品质水平。公司将关注新兴技术和市场趋势,积极布局未来的发展方向,包括人工智能、物联网、汽车电子等领域。同时,公司还将加强与客户和合作伙伴的合作,共同推动行业的发展和进步。

GigPeak公司的发展小趣事

在快速发展的过程中,GigPeak深刻认识到与产业链上下游企业合作的重要性。公司积极寻求与芯片制造商、设备供应商和系统集成商等合作伙伴建立长期稳定的合作关系。通过资源共享、技术交流和联合研发等方式,GigPeak与合作伙伴共同构建了一个完整的产业生态体系。这一生态体系的建立不仅提升了GigPeak的市场竞争力,还促进了整个行业的健康发展。

Herga公司的发展小趣事

随着全球对环境保护的日益重视,Herga公司积极响应绿色制造的号召,将环保理念融入产品设计和生产过程中。公司研发出了一系列节能高效的电子产品组件,如低能耗的驱动器、可回收材料的电机外壳等。这些产品不仅满足了市场对高性能、高品质的需求,还降低了生产过程中的碳排放和资源消耗。Herga公司的这一举措赢得了社会各界的广泛赞誉,也为其在电子行业中的可持续发展奠定了坚实基础。

Diodes Incorporated公司的发展小趣事

Diodes Incorporated公司成立于1970年,其初衷是致力于半导体技术的研发和生产。在创立初期,公司面临着来自行业巨头的激烈竞争,但凭借对技术的深入理解和市场需求的敏锐洞察,Diodes Incorporated逐渐在市场中找到了自己的定位。公司专注于生产高品质、特定应用的半导体产品,逐渐在消费电子、计算机、通信等领域建立了良好的声誉。

CP Technology Inc公司的发展小趣事

为了进一步扩大市场份额,CP Technology Inc积极寻求与行业内其他公司的战略合作。公司先后与多家知名企业签订了合作协议,共同开发新产品、拓展新市场。这些合作不仅为CP Technology Inc带来了更多的资源和机会,也提升了公司在行业内的地位和影响力。

Gigavac LLC公司的发展小趣事

为了进一步扩大市场份额,CP Technology Inc积极寻求与行业内其他公司的战略合作。公司先后与多家知名企业签订了合作协议,共同开发新产品、拓展新市场。这些合作不仅为CP Technology Inc带来了更多的资源和机会,也提升了公司在行业内的地位和影响力。

问答坊 | AI 解惑

BOOTLOADER程序有高手能指点么?

把外部flash里的程序放到ARM内部ROM,谁有代码啊?…

查看全部问答>

Linus步入不惑之年

2009年12月28日是Linux创始人Linus的40岁生日。 19年前,在圣诞节后赫尔辛基商店开业的第一天“,Linus冲向电脑商店,用圣诞节和生日礼金购买了他的第一台PC:一台DX33 80386计算机,4 Megs RAM,40 Megabyte硬盘,没有协同处理器。Linus之所以选 ...…

查看全部问答>

心情沮丧啊。。。

刚刚了看,里面有句话很让我沮丧啊:卖包子的都比工程师强! 研发:产业链的源头,资金链的末尾; 销售:产业链的末尾,资金链的源头; 研发人员是那里面最累的,钱拿的是最少的(指回报率),在一个行业坚持下去的没几人,还劝说周围的年轻人除 ...…

查看全部问答>

BIOS设计是否可以跨硬件

在自学汇编的过程中,遇到一个问题: 我写的BIOS调用是否可以跨硬件平台 换句话说,就是不同的板子上的BIOS设计是否是一样的?…

查看全部问答>

在WinCE环境下对.txt文件的读写

编写一个基于MFC的应用程序,读取.txt文件 文件内容的结构如下 书名1;价格1 书名2;价格2 书名3;价格3 。。。。。。 要求分别提取出书名和价格,分别放到string类型变量中 要就用VC++实现 各位高手帮帮忙,最好能有代码…

查看全部问答>

一个USB设备二台电脑

一个USB扩展槽上插了一个U盘,用USB连接线插了二台电脑。这两台电脑不同时操作U盘的情况下(任何情况下只有一台电脑对U盘操作),这样使用会有问题吗?…

查看全部问答>

请教版主,为什么我的程序进不了硬中断(已解决)

问高手个问题,为什么我的程序进了不硬中断? BIOS设置: HWI_INT11属性: interrupt source: MCSP_0_Receiver function: _receiver use Dispatcher interrupt Mash: self 程序 void main() {} void receiver() {...} 用轮询方式可以收 ...…

查看全部问答>

基于高吞吐率WLR测试的 ACS集成测试系统(二)

多器件TDDB和NBTI 图4示出了多器件TDDB测试结构的共用 SMU和SMU-per-pin配置。在开关(共用SMU) 情况下,SMU1提供连续应力至测试序列的全 部结构,SMU2顺序测量每个器件。在顺序分 析结构的过程中,开关延时和有限的测量速 度合在一起会限制每 ...…

查看全部问答>

C2000 Launchpad发热很大??!!

今天刚拿到快递~~~好欢乐~~~(不得不吐槽的是,圆通就是慢,虽然路上不慢,但是总在终点站耽误一天!!尼玛啊!!) 迫不及待插上电,试试内置的例程. led闪了会,一摸芯片,明显有点烫啊!! 后来用ccs5少了个led boosterpack的程序进去..(虽然没达到演示效果 ...…

查看全部问答>

【Nucleo心得】+ (EX06) 旋转编码器使用

本帖最后由 slotg 于 2014-10-19 09:37 编辑 本次实验编写了一个旋转编码器的驱动,顺时钟旋转时计数器增加,逆时钟旋转时计数器减少,压下中间开关时计数器清除。 旋转编码器的接脚与输出波形: 旋转编码器是输出2个相位差90度的波形,由 ...…

查看全部问答>