---
# System prepended metadata

title: F2812的暫存器語法
tags: [F2812]

---

[TOC]

- 詳見 <手把手教你DSP> 第6章
- 認識程式庫的組成、暫存器的實現並非必要，但能多點此方面程式概念在日後接觸相關領域必有幫助

# 暫存器
- 舉例來說，下面是一個叫做WDCR的暫存器，WDCR是暫存器名。這個暫存器有16個bits(0~15)，格子內的名稱稱為<font color="red">位域名</font>，代表這些bits負責的功能，占用的長度稱為<font color="red">位域長</font>
    - WDPS是位域名，佔據bit0 ~ bit2
    - WDCHK是位域名，佔據bit3 ~ bit5
    - ...

![image](https://hackmd.io/_uploads/S1YM4RICC.png)

## 暫存器通式
- <font color="red">群組名.暫存器名.all=0x0000</font>
- <font color="blue">群組名.暫存器名.bit.位域名=1</font>
## 寫入暫存器，以GPIO為例
- 在C語言中使用Structure的方式實現暫存器的結構，對各個Structure內的變量寫入值，相當於對暫存器寫值
- 今天要對GPFDIR暫存器的第3個bit寫入1，第3個bit的位域名稱為GPIOF2
- Library中的GPFDIR暫存器Structure有兩個變數(見區段1)，表示有兩種寫法
    - 對all寫入 : 直接把值寫入整個暫存器
        - GPFDIR.all = 0x0004; // 0000_0000_0000_0100, GPIOF2是第3個bit
    - 對bit內的變量寫入 : bit又是另一個Structure的實例，Structure內的變量見區段2，全部都是GPFDIR暫存器其中的位域名稱，可以看到要寫入的GPIOF2也在裡面，所以也可以針對位域名做寫入
        - GPFDIR.bit.GPIOF2 = 1
- 在程式庫中，GPFDIR暫存器屬於控制GPIO性質的暫存器，GPIO_MUX_REGS  的Structure把類似功能的暫存器Structure都放在裡面，見區段3。
- 而程式庫將暫存器結構體的實例宣告都放在DSP281x_GlobalVariableDefs.c(見區段4)，因此要對暫存器寫值是對這個實例內部的結構變量寫入，此處完整寫法應為
    - <font color="red">GpioMuxRegs.GPFDIR.all = 0x0004;</font>
    - <font color="blue">GpioMuxRegs.GPFDIR.bit.GPIOF2 = 1;</font>
``` c++=
// 舉例
/*************************************************/
// 這兩行都把GPIOF2腳位設為Output
GpioMuxRegs.GPFDIR.bit.GPIOF2 = 1;
GpioMuxRegs.GPFDIR.all = 0x0004; //0000_0000_0000_0100


// 區段1
// GPFDIR_REG結構內有兩個實例
// Found in DSP281x_Gpio.h
/*************************************************/
union GPFDIR_REG {
   Uint16             all;
   struct GPFDIR_BITS bit;
};


// 區段2
// GPFDIR_REG結構內有16個實例
// 冒號右邊的數字表示這個位域占用的bit數
// Found in DSP281x_Gpio.h
/*************************************************/
struct GPFDIR_BITS  {      // bits   description
   Uint16 GPIOF0:1;          // 0 
   Uint16 GPIOF1:1;          // 1 
   Uint16 GPIOF2:1;          // 2 
   Uint16 GPIOF3:1;          // 3 
   Uint16 GPIOF4:1;          // 4 
   Uint16 GPIOF5:1;          // 5 
   Uint16 GPIOF6:1;          // 6 
   Uint16 GPIOF7:1;          // 7 
   Uint16 GPIOF8:1;          // 8 
   Uint16 GPIOF9:1;          // 9 
   Uint16 GPIOF10:1;         // 10
   Uint16 GPIOF11:1;         // 11
   Uint16 GPIOF12:1;         // 12
   Uint16 GPIOF13:1;         // 13
   Uint16 GPIOF14:1;         // 14
   Uint16 GPIOF15:1;         // 15

};


// 區段3
// 可以看到GPFDIR是 GPFDIR_REG 結構的一個實例 ，被宣告在 GPIO_MUX_REGS 結構內
// Found in DSP281x_Gpio.h
/*************************************************/
struct GPIO_MUX_REGS {
   union  GPAMUX_REG   GPAMUX;
   union  GPADIR_REG   GPADIR;
   union  GPAQUAL_REG  GPAQUAL;
   Uint16              rsvd1;
   union  GPBMUX_REG   GPBMUX;
   union  GPBDIR_REG   GPBDIR;
   union  GPBQUAL_REG  GPBQUAL;   
   Uint16              rsvd2[5];
   union  GPDMUX_REG   GPDMUX;
   union  GPDDIR_REG   GPDDIR;
   union  GPDQUAL_REG  GPDQUAL;   
   Uint16              rsvd3;
   union  GPEMUX_REG   GPEMUX;
   union  GPEDIR_REG   GPEDIR;
   union  GPEQUAL_REG  GPEQUAL;   
   Uint16              rsvd4;
   union  GPFMUX_REG   GPFMUX;
   union  GPFDIR_REG   GPFDIR; // 在這裡--------------
   Uint16              rsvd5[2];
   union  GPGMUX_REG   GPGMUX;
   union  GPGDIR_REG   GPGDIR;
   Uint16              rsvd6[6];
};

// 區段4
// GpioMuxRegs是GPIO_MUX_REGS Structure的實例
/*************************************************/
// Found in DSP281x_GlobalVariableDefs.c
volatile struct GPIO_MUX_REGS GpioMuxRegs;

````

