针对处理器的寄存器定义文件是一个汇编文件,包含特定器件上所有特殊功能寄存器的定义。编译时,针对处理器的寄存器定义文件将被编译成需要链接到应用程序的目标文件 。
例如,在 PIC18C452 针对处理器的寄存器定义文件中, PORTA 定义为:
SFR_UNBANKED0 UDATA_ACS H'f80'
PORTA
PORTAbits RES 1 ; 0xf80
第一行指定 PORTA 所在的数据寄存器存储区和这个存储区的起始地址。 PORTA 有两个标号, PORTAbits 和 PORTA,都指向同一个地址 (本例中是 0xf80)。
二:关于头文件声明
针对处理器的头文件是包含特殊功能寄存器外部声明的 C 文件,特殊功能寄存器在寄存器定义文件中定义。
例如,在PIC18C452 的针对处理器头文件中, PORTA 声明为:
extern volatile near unsigned char PORTA;
和:
extern volatile near union {
struct {
unsigned RA0:1;
unsigned RA1:1;
unsigned RA2:1;
unsigned RA3:1;
unsigned RA4:1;
unsigned RA5:1;
unsigned RA6:1;
} ;
struct {
unsigned AN0:1;
unsigned AN1:1;
unsigned AN2:1;
unsigned AN3:1;
unsigned T0CKI:1;
unsigned SS:1;
unsigned OSC2:1;
} ;
struct {
unsigned :2;//填充前两位
unsigned VREFM:1;
unsigned VREFP:1;
unsigned :1;//此位被填充
unsigned AN4:1;
unsigned CLKOUT:1;
} ;
struct {
unsigned :5;//填充前五位
unsigned LVDIN:1;
} ;
} PORTAbits ;
第一个声明指定 PORTA 是一个字节 (unsigned char)。由于变量是在寄存器定义文件中定义的,因此需要 extern 修饰符。 volatile 修饰符告知编译器不能假定 PORTA 能保留赋给它的值。 near 修饰符指定了端口位于存取 RAM 中。第二个声明指定 PORTAbits是可位寻址的匿名结构的联合 。特殊功能寄存器中的每一位可能有不只一种功能 (因此会有不只一个名称),因此联合中对于同一个寄存器有多个结构定义。所有结构定义中的各位分别针对寄存器中相同的位。如果一个位只有一个功能,那么在其它结构定义中,这一位只是被填充。例如,在第三和第四个结构中, PORTA 的第 1 位 和第 2 位只是被填充,因为它们只有两个名称;而第 6 位有四个名称,在每个结构中都指定了第 6 位。
上一篇:PIC C18编译器 错误can not fit the section. 解决方法
下一篇:PIC单片机 C编程技巧
推荐阅读最新更新时间:2024-03-16 15:07