特殊功能寄存器 (Special Function Register, SFR)是一些控制器件上 MCU 操作或外设模块各个方面的寄存器。其中大多数寄存器都进行了存储器映射,这意味着它们会位于器件数据存储空间中的一些特定地址处,并可以使用这些地址进行访问。一些寄存器中的各个位控制独立的特性。一些寄存器是只读的;一些是只写的。
存储器映射的 SFR 通过一些置于寄存器地址处的特殊 C 变量进行访问。
SFR 变量在头文件中预定义,在源代码中包含 <xc.h> 头文件 之后即可访问它们。头文件中同时定义了位变量和带位域的结构,所以可以在源代码中使用这两种形式中任一种来访问寄存器中的位。
对于映射到寄存器以及这些寄存器中的位的 C 变量,其名称将基于器件数据手册中指定的名称。但是,由于寄存器内的某些位名称可能会重复,所以命名可能会有差异。
存放位域的结构的名称通常为相应寄存器的名称后跟随 bits。例如,下面显示了一个代码示例,它包含了通用头文件、将 PORTA 作为一个整体清零、使用位变量将 PORTA的 bit 0 置 1,以及使用结构 / 位域定义将 PORTA 的 bit 2 置 1。
#include <xc.h>
void main(void)
{
PORTA = 0x00;
RA0 = 1;
PORTAbits.RA2 = 1;
}
要确认与所用器件有关的名称,请查看 <xc.h> 将包含的特定于器件的头文件,确定每个变量的定义。这些文件将位于编译器的 include 目录,并具有一个代表该器件的名称。
器件和将通过 <xc.h> 包含的头文件的名称存在一对一关系,例如,针对 PIC16LF1826器件进行编译时,<xc.h> 将包含头文件 <pic16lf1826.h>。请记住,不需要在源代码中包含这个特定于芯片的文件;它由 <xc.h> 自动包含。
从 C 代码或嵌入到 C 代码的汇编代码中访问一些 SFR 时需要小心。编译器使用一些寄存器来保存计算的中间值,直接写入这些寄存器可能导致代码失败。当 SFR 由于 C 或汇编代码直接写入它们而发生改变时,编译器并不会检测到发生了这种情况。
|