---
# System prepended metadata

title: TI F280025C – GPIO IN/OUT & Timer
tags: [TI C2000]

---

# TI F280025C -- GPIO IN/OUT & Timer

1. 使用 Timer + GPIO Output 產生 1 Hz 方波訊號
2. 使用 Timer + GPIO Output 產生 100 Hz 方波訊號
3. 使用 Timer + GPIO Output 產生 10 kHz 方波訊號
4. GPIO Input 接收 Low 訊號，在 Debug Mode 中確認數值為 0
5. GPIO Input 接收 High 訊號，在 Debug Mode 中確認數值為 1

---

## Device

- F280025C LaunchPad™ development kit for C2000™ real-time MCU
![image](https://hackmd.io/_uploads/SJXgjX9rJe.png)

- CCS
![Untitled (1)](https://hackmd.io/_uploads/Bk8bimqS1g.png)


---

## Setting

1. Import universal 的空專案
從 Resource Explorer 找到對應開發版 MCU 的範例程式位置，可以直接將開發版連接電腦，系統會自動搜尋篩選對應的資料位置。
選擇 universal > universal_c2000，並匯入至本機端，匯入後針對專案進行修改不會影響到原本匯入的資料，所以如果對於修改後的內容出錯，想要重新取得空的專案，可以依照同樣流程匯入。
![Untitled (2)](https://hackmd.io/_uploads/BkbV3Q5rJx.png)

2. Active .ccxml
因為使用的是控制板，所以激活控制板的 .ccxml
![Untitled (5)](https://hackmd.io/_uploads/H1_x079Byg.png)

3. Choose Configurations
選擇組態
![Untitled (6)](https://hackmd.io/_uploads/Bk-fR79H1e.png)

4. Setting .syscfg
打開專案的 universal_c2000.syscfg 進行相關設定
![Untitled (7)](https://hackmd.io/_uploads/B1yVAmcB1l.png)

5. Setting GPIO

    :::info
    - GPIO Direction：設定輸入輸出
    - Pin Type：設定輸入 Push-pull / Open drain，設定輸入 Pull-up / Floating
    - PinMux --> GPIO：腳位選用
    :::
    ![input1](https://hackmd.io/_uploads/S1nuAmcSke.png)
    - 設定中斷處理
    ![input2](https://hackmd.io/_uploads/Bka9Cm9Hkg.png)

6. Setting CPUTimer
Timer 的時鐘使用如下，在 datasheet 中可以看出使用的是 SYSCLK
![timer2](https://hackmd.io/_uploads/Sk6ZlNcSyg.png)
    :::info
    在 sysconfig 啟用 CPUTimer
    - Timer Prescaler：將輸入 SYSCLK 進行除頻
    - Timer Period：Counter 週期，須注意設定值 + 1 才是正確週期
    - Enable Interrupt：啟動中斷
    - Register Interrupt Handler：註冊中斷處理函式名稱
    :::
7. Setting Clock Tree
    
    Clock 基本使用默認狀態，不會特別修改

---
## Code

在 main.c 中要設定對應的中斷處理函式
```
in [main.c]

__interrupt void int_timer_isr(void)
{
    GPIO_togglePin(gpio_timerToggle);
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
}
__interrupt void int_gpio_in_isr(void)
{
    gu_input_state = GPIO_readPin(gpio_in);
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
}
```

可以透過以下 function 進行調整 Timer 週期
```
CPUTimer_setPeriod(CPUTimer0_BASE, 要調整的數值)
```

以下 function 讀取腳位
```
GPIO_readPin(pin number);
```

以下 function 將輸出腳位 Toggle 準位
```
GPIO_togglePin(pin number);
```

---
## Result

1. 使用 Timer + GPIO Output 產生 1 Hz 方波訊號
    - Timer Prescale = 1000
    - Timer Period = 49999
![output result1](https://hackmd.io/_uploads/H1kLWV9S1x.jpg)

2. 使用 Timer + GPIO Output 產生 100 Hz 方波訊號
    - Timer Prescale = 1000
    - Timer Period = 499
![output result2](https://hackmd.io/_uploads/H1wv-45SJe.jpg)

3. 使用 Timer + GPIO Output 產生 10 kHz 方波訊號
    - Timer Prescale = 1000
    - Timer Period = 4
![output result3](https://hackmd.io/_uploads/Hy9FWN9Skg.jpg)

4. GPIO Input 接收 Low 訊號，在 Debug Mode 中確認數值為 0
![input1_result2.jpg](https://hackmd.io/_uploads/SysoZV9Skl.png)
![input1_result1](https://hackmd.io/_uploads/B1joW4cByl.jpg)

5. GPIO Input 接收 High 訊號，在 Debug Mode 中確認數值為 1
![input2_result2.jpg](https://hackmd.io/_uploads/B1vfzV9HJe.png)
![input2_result1](https://hackmd.io/_uploads/BkvzGNqHJg.jpg)

