c - 如何处理像这些寄存器这样的结构中的所有字段?

标签 c struct microcontroller pic mplab

如果您编写过微 Controller 程序,您可能熟悉操作给定寄存器的选择位,或向整个寄存器写入一个字节。例如,在使用 C 的 PIC 上,我可以将整个字节写入 PORTA 以设置所有位,或者我可以简单地寻址 PORTAbits.RA# 以设置单个位。我试图模仿这些结构/union 的定义方式,这样我就可以在我的程序中对变量做同样的事情。具体来说,当微 Controller 打开时,我希望能够重置我自己用类似

定义的寄存器
REGISTER = 0;

对比

REGISTERbits.BIT0 = 0;
REGISTERbits.BIT1 = 0; 
...
//or
REGISTERbits = (0,0,0,0,0,0,0,0);

显然前者更优雅并且节省了大量的行空间。单片机的头文件是这样写的:

#ifndef __18F2550_H
#define __18F2550_H
....

extern volatile near unsigned char       LATA;
extern volatile near struct {
  unsigned LATA0:1;
  unsigned LATA1:1;
  unsigned LATA2:1;
  unsigned LATA3:1;
  unsigned LATA4:1;
  unsigned LATA5:1;
  unsigned LATA6:1;
} LATAbits;

...对于每个寄存器,具有多个字节的寄存器使用结构 union 作为它们的寄存器位。由于我的初始化/声明在主源文件中而不是 header 中,因此我删除了 extern 和 near :

volatile unsigned char InReg;
volatile struct{
    unsigned NSENS:1;   //One magnetic sensor per direction
    unsigned SSENS:1;
    unsigned ESENS:1;
    unsigned WSENS:1;
    unsigned YBTN:1;    //One crosswalk button input per axis
    unsigned XBTN:1;    //(4 buttons tied together each)
    unsigned :2;
} InRegbits;

...但是在编译时,InReg 和 InRegbits 被定义为内存中的两个独立位置,这意味着我无法写入 InReg 来更改 InRegbits。我如何更改它以使其起作用?我试图复制的那个是否只因为它是一个特殊的微 Controller 寄存器而起作用?

感谢您的帮助

最佳答案

volatile union InReg {
    unsigned char InRegAll;
    struct near {
        unsigned NSENS:1;   //One magnetic sensor per direction
        unsigned SSENS:1;
        unsigned ESENS:1;
        unsigned WSENS:1;
        unsigned YBTN:1;    //One crosswalk button input per axis
        unsigned XBTN:1;    //(4 buttons tied together each)
        unsigned :2;
    } InRegbits;
}

请注意,此代码可能不可移植。

关于c - 如何处理像这些寄存器这样的结构中的所有字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15467997/

相关文章:

c++ - 确保所有按键事件都发送到主窗口?

C:[错误]链表快速排序

C数组从第四个元素开始读取

json - 在 Swift 4 中访问嵌套 JSON 字符串的成员

stm32 - STM32F411RE 中的环回 SPI

编译器函数和可执行文件

c - 对泛型结构类型数组进行排序

c - 交换链表中的节点

c - 如何通过避免 if-else 条件来提高当前代码的效率?

c - 在操作受限的微 Controller 上生成对数间隔值