---
# System prepended metadata

title: F2812的GPIO
tags: [F2812]

---

[TOC]

# 簡介
- 5 組 GPIO Port : GPIOx (x = A, B, D, E, F, G)
- 每個 Port 最常由 MUX、Direction、Data 三種暫存器操作，其餘見手冊
- 每個暫存器的一位就代表對應Port的pin，譬如GPAMUX的第4位(bit3)掌管GPIOA3腳位
- 詳見 <手把手教你DSP> 第9章 、< TMS320x281x DSP System Control and Interrupts Reference Guide > 第4章
    
# 暫存器功能

## GPxMUX Registers
- **功能選擇用**。因為每個腳位可以作為一般I/O或是特定用途，所以需要選擇功能
- 譬如腳位圖中，腳位名稱GPIOA0-PWM1表示其可以做為一般I/O，也是PWM1的輸出腳
- 寫入<font color="red">0</font>是做一般<font color="red">I/O</font>
- 寫入<font color="blue">1</font>是<font color="blue">其他功能</font>

## GPxDIR Registers
- **腳位方向**，作為input或output用
- 寫入<font color="red">0</font>是<font color="red">Input</font>
- 寫入<font color="blue">1</font>是<font color="blue">Output</font>

## GPxDAT Registers
- 以讀取來說，反映腳位現在狀態，<font color="red">1為HIGH</font>，<font color="blue">0為LOW</font>
- 以寫入來說，寫入1將使腳位變HIGH，寫入0將使腳位變LOW
- 避免以下情況
- ![image](https://hackmd.io/_uploads/rkZnEkwCR.png)


# 程式寫法
- 注意GPIO控制類型暫存器有受保護，在<font color="red">寫入時要EALLOW</font>啟用，<font color="blue">寫完時EDIS</font>關閉

``` c++=
EALLOW

// 將GPIOF2腳位設置為一般I/O
GpioMuxRegs.GPFMUX.bit.SPICLKA_GPIOF2 = 0;

// 將GPIOF2腳位設置為Output
GpioMuxRegs.GPFDIR.bit.GPIOF2 = 1;

EDIS

// 將GPIOF2腳位設置為HIGH
GpioDataRegs.GPFDAT.bit.GPIOF2 = 1;

```