问题
什么是配置向导?它有什么作用?
回答
配置向导是μVision最近添加的功能。它支持汇编器,C或调试器初始化文件的菜单驱动配置。配置向导使用嵌入到配置文件注释中的控件项来构建这些菜单。
MDK-ARM工具广泛使用脚本文件,这些菜单为用户提供了一种显示和修改脚本和初始化文件设置的简便方法。
先看看图片,有个直观的感受:
就是在代码里面嵌入一些特定的注释,KEIL-MDK可以将其“翻译”为图形用户界面,以便在其中方便地更改配置。
启用配置向导
1,注释中必须包括以下特定内容,才能启用配置向导。该注释必须放在代码文件的前100行以内。
// <<< Use Configuration Wizard in Context Menu >>>
2,可以添加以下注释 ,以结束配置向导。此项是可选的。
// <<< end of configuration section >>>
分组语法
分组标题
使用<h>和</h>来标识一个分组。在配置向导中可以折叠。
<h>
...
</h>
例如:
// <h> External Bus Interface (EBI)
// <e1.13> Enable Chip Select 0 (CSR0)
// </e>
// <e1.13> Enable Chip Select 1 (CSR1)
// </e>
// </h>
实现的效果为:
点击“+”可以展开,展开后的效果为:
使能标题
使用<e>和</e>来标识一个分组,并且该分组可以整体被使能/禁止。在配置向导中既可以折叠,也可以使能/禁止。
<e>
...
</e>
例如:
// <e1.5> WSE: Enable Wait State Generation
// <o1.2..4> NWS: Number of Standard Wait States <1-8><#-1>
// </e>
实现的效果为:当勾选标题行时,组内的内容正常显示,可以编辑:
当取消选择标题行时,组内的内容变灰,不能编辑:
帮助提示
<i> 表示对上一个配置项的提示。可以有多行。
// <i> Use MY_CPU_VARIANT, and set the include file
显示效果为:
编辑配置项的值
默认情况下,可以在图形用户界面中更改相应的注释项后面的第一个数值。 例如,在注释中配置:
// <o> Program Entry Point
PC = 0x04000000;
实现的效果为:
图形用户界面中的项目标题为<o>后面的文本内容,修改项为注释后面的第一个数字。
可以在图形用户界面中编辑该配置项的值,比如,改为0x04008000
编辑后,代码中的值也会随即改变。
跳过N个值
注释中也可以配置为“跳过”接下来的N个值。比如:
// <o1.9..11> TDF: Data Float Output Time <0-7>
// <i> Number of Cycles Added after the Transfer
// </e>
_WDWORD(0xFFE00000, 0x01002489); // EBI_CSR0: Flash
由于<o>后面有个数字1,则表示它编辑的数字要先跳过1个,即,此时编辑后,受影响的值不是_WDWORD函数的第一个参数,而是第二个参数。
编辑某些位
比如上例中,q1.4中的“.4"表示编辑数值的第4位(从bit0开始)。
也可以编辑连续多个位。比如下图中<o1.9..11>中的”9..11“则代表编辑数字的第9位~第11位。
// <o1.9..11> TDF: Data Float Output Time <0-7>
// <i> Number of Cycles Added after the Transfer
_WDWORD(0xFFE00004, 0x04003485); // EBI_CSR1: RAM
在图形用户界面中,把0x02改为0x03:
代码中的数值也由0x04003485变为0x04003685:
数据项的编辑类型
数值型:<o>
数值型的修改项可以指定数值的范围:
可以指定数值范围中的步长:则表示有效范围为:0x00000000 ~ 0xFFF0 0000,并且以0x10 0000为单位进行步进。显示 为十六进制。
可以设定为枚举型:
显示效果为:
在使用用户输入的数字之前,可以对输入项进行运算,再合并到被修改项。支持加减乘除4种运算。格式举例:
- <#+1>
- <#-1>
- <#*8>
- <#/5>
例如:
表示,NWS: Number of Standard Wait States的用户可输入范围为1-8(小于1则取值为1,大于8则取值为8),最终合并到数值之前需要将用户输入的数字减去1。
比如,输入8时:
代码中的数字变为0x040036BD:其中第2~4位为7(0b111) (0xBD = 0b1011 1101)
选择型:<q>
例如,
// <q1.4> DRP: Data Read Protocol
// <0=> Standard Read
// <1=> Early Read
_WDWORD(0xFFE00024, 0x00000010); // EBI_MCR: Data Read Protocol
在图形用户界面中的显示效果为一个”复选框“: 。选中为1,取消选中为0.
取消勾选后,_WDWORD函数的第二个函数由0x00000010变为0x00000000了。
字符串型:<s>
// <s> Change ID
// <s1.30> Change Password String
#define ID "My User ID"
char pw[] = "My Password";
其中<s1.30>表示跳过一个字符串(编辑第二个字符串”My Password"),最大长度为30,显示效果为:
代码型:<c></c>
// <c1> Use MY_CPU_VARIANT
// <i> Use MY_CPU_VARIANT, and set the include file
#define MY_CPU_VARIANT
#include "MyCpuVariant.h"
// </c>
显示效果为:
取消勾选后,代码内容变为:
还可以使用<!c>和</c>语法来标记代码段,与<c>...</c>的区别是,勾选后代码被注释;取消勾选后代码有效。
参考
官方帮助:
http://www.keil.com/support/man/docs/uv4/uv4_ut_configwizard.htm
例程全部代码:
//*** <<< Use Configuration Wizard in Context Menu >>> ***
FUNC void Setup (void) {
// <h> External Bus Interface (EBI)
// <e1.13> Enable Chip Select 0 (CSR0)
// <o1.20..31> BA: Base Address <0x0-0xFFF00000:0x100000><#/0x100000>
// <i> Start Address for Chip Select Signal
// <o1.7..8> PAGES: Page Size <0=> 1M Byte <1=> 4M Bytes
// <2=> 16M Bytes <3=> 64M Bytes
// <i> Selects Active Bits in Base Address
// <o1.0..1> DBW: Data Bus Width <1=> 16-bit <2=> 8-bit
// <o1.12> BAT: Byte Access Type <0=> Byte-write
// <1=> Byte-select
// <e1.5> WSE: Enable Wait State Generation
// <o1.2..4> NWS: Number of Standard Wait States <1-8><#-1>
// </e>
// <o1.9..11> TDF: Data Float Output Time <0-7>
// <i> Number of Cycles Added after the Transfer
// </e>
_WDWORD(0xFFE00000, 0x010024A9); // EBI_CSR0: Flash
// <e1.13> Enable Chip Select 1 (CSR1)
// <o1.20..31> BA: Base Address <0x0-0xFFF00000:0x100000><#/0x100000>
// <i> Start Address for Chip Select Signal
// <o1.7..8> PAGES: Page Size <0=> 1M Byte <1=> 4M Bytes
// <2=> 16M Bytes <3=> 64M Bytes
// <i> Selects Active Bits in Base Address
// <o1.0..1> DBW: Data Bus Width <1=> 16-bit <2=> 8-bit
// <o1.12> BAT: Byte Access Type <0=> Byte-write
// <1=> Byte-select
// <e1.5> WSE: Enable Wait State Generation
// <o1.2..4> NWS: Number of Standard Wait States <1-8><#-1>
// </e>
// <o1.9..11> TDF: Data Float Output Time <0-7>
// <i> Number of Cycles Added after the Transfer
// </e>
_WDWORD(0xFFE00004, 0x040034A5); // EBI_CSR1: RAM
// <q1.4> DRP: Data Read Protocol
// <0=> Standard Read
// <1=> Early Read
_WDWORD(0xFFE00024, 0x00000010); // EBI_MCR: Data Read Protocol
_WDWORD(0xFFE00020, 0x00000001); // EBI_RCR: Remap Command
// </h>
// <o> Program Entry Point
PC = 0x04000000;
}
// <s> Change ID
// <s1.30> Change Password String
#define ID "My User ID"
char pw[] = "My Password";
/*********************************************************/
/* Example for enabling and disabling code */
// <c1> Use MY_CPU_VARIANT
// <i> Use MY_CPU_VARIANT, and set the include file
#define MY_CPU_VARIANT
#include "MyCpuVariant.h"
// </c>
// <!c1> Disable log
// <i> Disable log file generation
#define _USE_LOG
// </c>
// <c1> Example of inconsistent comment
// <i> a mix of commented and uncommented lines in the block create an inconsistency
// This type of comment, mixed with uncommented lines, creates the inconsistency
/* You can use this type of comment without creating an inconsistency */
do_whatever; // adding this type of comment here is allowed
// </c>
//*** <<< end of configuration section >>> ***
配置向导注释说明:
项目 | 跳过 | 文本 | 描述 |
<c> | § | 是 | 代码启用:创建一个复选框以取消注释或注释代码。当您禁用复选框时,所有行(包括带有空格的行)都会在第一个找到的字符处添加双斜杠(//)注释。配置向导中的红色文本表示不一致。不要嵌套此项目。 |
<!c> | § | 是 | 代码禁用:创建一个复选框以注释或取消注释代码。当您启用复选框时,所有行(包括带有空格的行)都会在第一个找到的字符处添加双斜杠(//)注释。配置向导中的红色文本表示不一致。不要嵌套此项目。 |
</c> | 否 | 以<c>或<!c>开头的代码启用/禁用块结束。 | |
<h> | 是 | 标题:以下选项属于一个组。 | |
<e> | § | 是 | 标题为启用:以下选项属于一个组,可以通过复选框启用。 |
<e.4> | § | 是 | 标题为启用:修改特定位(在本例中为第4位)。 |
</h>或</e> | 否 | 标题或启用结束。 | |
<i> | 是 | 前一项的工具提示帮助。 | |
<q> | § | 是 | 可通过复选框设置的位值选项。 |
<o> | § | 是 | 带选择或数字输入的选项。 |
<o.4..5> | § | 是 | 修改位范围(例如:位4到5)。 |
<o.4> | § | 是 | 修改单个位(例如:位4)。 |
<s> | § | 是 | 带ASCII字符串条目的选项。 |
<s.10> | § | 是 | 带ASCII字符串条目的选项,大小限制为10个字符。 |
<0-31> | 否 | 选项字段的值范围。 | |
<0-100:10> | 否 | 选项字段的值范围,步长为10。 | |
<0x40-40x1000:0x10> | 否 | 十六进制格式的值范围,步长为0x10。 | |
<0=> | 是 | 值和文本供选择。 | |
<#+1> <#-1> <#*8> <#/3> | 否 | 数字合并到字段之前的值修改(加,减,乘,除)。 |