Day7 — GPIO 功能

GPIO 全文为 General purpose input/output,在微控制器当中通常具有控制引脚输出或输入的功能,可以透过程序控制某一脚位的输出为高电位或低电位。

一个最简单的例子可以用 LED 灯来举例,假设今天想要实作 LED 闪烁功能,我们可以将 LED 的一个接脚接地之後,另一接脚接到 GPIO 脚位,并透过程序控制输出的电位高低,这样就可以做到闪烁效果。

既然一个引脚可以用於输入、输出或其他特殊功能,那麽在程序实作上,要怎麽去控制脚位的输出呢?在微控制器当中可以透过修改暂存器的数值来做到。

如下图所示,微控制器内部的特殊暂存器会存在特定记忆体位址当中(在 datasheet 可以找到),只要修改对应记忆体位址中的资料,就可以修改暂存器的值。

不过在程序上不需要写死记忆体位址,编译器以及 assembler 都会事先定义好变数让开发者使用。

https://ithelp.ithome.com.tw/upload/images/20211009/201035654sRs3CqMRD.png

GPIO Port

事先定义好的一组脚位称做 PORT。在 attiny85 当中有一个 PORT(PORTB),总共 6 个脚位。

截图 2021-10-09 下午12.05.43.png

如图所示,当中的 PB0 ~ PB5 就是 PORTB 接脚的意思,括号後的名称则是除了 GPIO 接脚之外,根据程序的设定也可以当作其他用途。

https://ithelp.ithome.com.tw/upload/images/20211009/20103565aNenARW3PD.png

输入、输出

每个 GPIO 都具有输出与输入功能。

  • 输出:由控制器输出高电位或低电位(0 或 1)
  • 输入:由外部设备输入高电位或低电位至控制器

为了要控制脚位为输入或输出,以及个别脚位应该如何控制,需要知道两个暂存器分别为 PORTB、DDRB。

DDRB(Data Direction Register B)

控制接脚的功能为输入还是输出。0 为输入 1 为输出。输入指得是由外部设备输入高电位或低电位至控制器;而输出指得是由控制器输出高电位或低电位(0 或 1)。

PORTB

有 8bit,但 attiny85 只有 6 个脚位,因此最上面的两个 bit 不会使用到。PORTB 可用来控制脚位输出高低。

一个简单的 GPIO 程序如下:

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
  DDRB = (1 << DDB0);     // set PORTB0 as output and port1 ~ 7 as ouput. DDR means data direction register
  PORTB = (1 << PORTB0);  // set PORTB0 to 1 (HIGH)
  unsigned char i = PINB; // read pin from PINB register
  return 0;
}

程序当中我们将 DDB0(第 1 个 bit)设定为 1 代表输出,PORTB0 设定为 1(代表输出高电位),其效果约略等同於 arduino 当中的:

void setup() {
  pinMode(PIN, OUT);
}

void loop() {
  digitalWrite(PIN, HIGH);
}

接下来在加上 delay 以及无穷回圈即可完成 LED 闪烁效果:

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
  while (1) {
    DDRB = (1 << DDB0);     // set PORTB0 as output and port1 ~ 7 as ouput. DDR means data direction register
    PORTB = (1 << PORTB0);  // set PORTB0 to 1 (HIGH)
    unsigned char i = PINB; // read pin from PINB register

    _delay(500);
	  PORTB = ~(1 << PORTB0);
	  _delay(500);
  }
  return 0;
}

1 << DDB0 是什麽意思

为了方便程序码阅读,当我们要赋值给暂存器某个 bit 时,通常不会这样写:

DDRB = 1;

原因很简单,读程序码的人不知道这行程序码的意图为和,为了知道 1 代表的意思,开发者可能还要自行寻找答案。因此在撰写时会使用 << 运算符来实作。

<< 为左移运算符,例如 1 << 2,代表将 1 左移两位变为 0x100,用 10 进位表示为 4。假设我们使用 DDRB3(值为 3),代表 DDRB 暂存器当中的第 4 个 bit,所以 DDRB = 1 << DDRB3 的意思为:将 1 放到 DDRB3 的位置(左移 3 格)。

资源

有关於更多 GPIO 的介绍,可以参考 ATtiny85 的 datasheet


<<:  MS Azure ML02

>>:  【第二五天 - Flutter 知名外送平台画面练习(上)】

CSS基础介绍(3)

来轻松聊聊 终於来到基础CSS的最後一篇,这次要分享的是CSS的变量。 想像一个情境,你正在负责一个...

Day 06 Use automated machine learning in Azure Machine Learning

To use Azure Machine Learning Create an Azure Mach...

Day 11:安全

前言 安全性虽然不做也不会影响功能, 但如果出事了,小则财损,大则影响公司的生存, 以下分别用攻、防...

Day 30 | 铁人赛完赛,切版之路未完 - 结语

第一次挑战铁人赛就写两边, 老实说有想过两边就贴一样的结语, 但想想还是有所不同, 决定还是乖乖的写...

网路设备:路由器

5 路由器 (Router) 一种专门处理封包传输的设备,透过处理路径位置来传输资料;主要工作在网路...