GPIO 概念

I/O 是输入(Input)和输出(Output)的意思,GPIO(General Purpose I/O)是基本输入输出,是 I/O 的最基本形式。STM32F103ZET6 大概有 144 个引脚,每个引脚有多个功能,有些引脚可以用作中断、可以用作 GPIO,所以引脚有复用功能。这些引脚连接如 LED、蜂鸣器、按键等。

实现通过按键对 LED0 的控制。假如 LED0 的引脚是 PB5,STM32F103ZET6 控制该引脚输出高电平或低电平,即开关量输出,因此该引脚配置成 GPIO Output。STM32F103ZET6 获取按键的状态:按键按下还是松开?因此,按键的引脚是 GPIO Input。当按键按下时,向 PB5 引脚输出高电平,使 LED0 亮,反之,使 LED0 灭。

综上所述,GPIO 是 MCU? 同外界进行交互的重要通道,通过 GPIO 可以实现软件干预硬件。

实验检测理论

实验准备

实验目的:通过轮询和 GPIO 实现控制 LED0 和 LED1 的闪烁。

实验资料:1️⃣正点原子:STM32F103ZET62️⃣STM32F103ZET6 电路原理图

本随笔中只贴出开发板的 LED1、LED0 的原理图:

CubeMX 配置

找到 LED0 和 LED1 的引脚,设置 GPIO_Output,因为是 MCU 通过端口寄存器控制该引脚状态,所以 PB5 和 PE5 是一个输出引脚。

打开 SYS -> Debug Serial。

设置时钟,我现在也是一个初学者,对时钟的概念还不知道,姑且配置最高,CubeMX 会提示你配置过大,它可以帮你修改。

记得使用 MDK 生成工程项目,否则不能用 Keil 打开,默认是其他的工程项目。

编写代码

while (1)
{
HAL_GPIO_WritePin(GREEN_LED_GPIO_Port, GREEN_LED_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(RED_LED_GPIO_Port, RED_LED_Pin, GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GREEN_LED_GPIO_Port, GREEN_LED_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(RED_LED_GPIO_Port, RED_LED_Pin, GPIO_PIN_RESET);
HAL_Delay(1000);
}

代码很简单,主要是 HAL_GPIO_WritePin 函数,向引脚输出开关量。LED 一直都是一个高电平状态,直接连接的是 Vcc(电源),而我们是给 LED 写一个低电平,就可以改变 LED 的状态,使得 LED 亮,否则 LED 灭。GPIO_PIN_SET 是 CubeMX 设置好的,不管输出的是高还是低电平,改变状态就是 SET,恢复原来的状态就是 RESET。

实验效果

代码仓库:GPIO_LIGHT

实验总结

很多编程语言都有 IO 流的章节,IO 流就是一个获取系统的资源的管道。获取就是输入(Input),写出就是输出(Output)。Java 除了最基本的 IO 流,还有字节流、字符流等更高级的 IO 流。

在嵌入式系统开发中也有 IO,其中最基本的就是 GPIO,是嵌入式系统开发中最基础的 IO。MCU 要控制板子上的外围设备,如 LED、蜂鸣器,就得通过 GPIO 向外输出开关量。

最新文章

  1. 【学习笔记】load-on-startup Servlet
  2. Debian8.3安装flash插件,备用~~~
  3. 《编写可维护的JavaScript》——JavaScript编码规范(六)
  4. JavaScript(Iframe、window.open、window.showModalDialog)父窗口与子窗口之间的操作
  5. javascript中继承(二)-----借用构造函数继承的个人理解
  6. WCf的理解
  7. [OC Foundation框架 - 19] 练习遇到的Bugs
  8. java web: eclipse & maven & jetty & struts2 & mysql = 简单登录页面
  9. Kendo UI开发教程(22): Kendo MVVM 数据绑定(十一) Value
  10. SQL操作语句中的注意点
  11. (转)UML类图与类的关系详解
  12. Linux 内核死锁
  13. 【一天一道LeetCode】#109. Convert Sorted List to Binary Search Tree
  14. flask(三)之Flask-SQLAlchemy
  15. android 开发设计模式---单例模式
  16. WPF 耗时操作时,加载loging 动画 (BackgroundWorker 使用方法)
  17. python学习笔记:深浅拷贝的使用和原理
  18. CRM 2013 批量更新two options的缺省值
  19. Android开发技巧——ViewPager加View情况封装PagerAdapter的实现类
  20. Knockout: 实践CSS绑定和afterkeydown事件, 给未通过校验的输入框添加红色边框突出显示; 使用afterkeydown事件自动将输入转大写字母.

热门文章

  1. TypeScript 之 Interface
  2. Selenium4+Python3系列(十二) - 测试框架的设计与开发
  3. 创建并且配置win10系统虚拟机
  4. C/S UDP通信实践踩坑记录与对于ICMP的进一步认识
  5. [OpenCV实战]21 使用OpenCV的Eigenface
  6. Spring Boot 3.0横空出世,快来看看是不是该升级了
  7. 3xx HTTP状态码的终极指南
  8. MAC实用操作记录---使用命令执行文件上传下载解压打包与解包
  9. Azure Terraform(十二)利用 Terraform 将文件上传到 Azure Blob Storage
  10. 基于Docker安装的Stable Diffusion使用CPU进行AI绘画