STM32 IO 简介

  • 1.IO介绍
  • 2.仿真与下载

1.IO介绍

STM32 的 IO 口可以由软件配置成如下 8 种模式:
1、 输入浮空
2、 输入上拉
3、 输入下拉
4、 模拟输入
5、 开漏输出
6、 推挽输出
7、 推挽式复用功能
8、 开漏复用功能
每个 IO 口可以自由编程, 但 IO 口寄存器必须要按 32 位字被访问。 STM32 的很多 IO 口都
是 5V 兼容的,这些 IO 口在与 5V 电平的外设连接的时候很有优势,具体哪些 IO 口是 5V 兼容
的,可以从该芯片的数据手册管脚描述章节查到(I/O Level 标 FT 的就是 5V 电平兼容的)。
STM32 的每个 IO 端口都有 7 个寄存器来控制。
他们分别是:
配置模式的 2 个 32 位的端口配置寄存器 CRL 和 CRH;
2 个 32 位的数据寄存器 IDR 和 ODR;
1 个 32 位的置位/复位寄存器BSRR;
一个 16 位的复位寄存器 BRR;
1 个 32 位的锁存寄存器 LCKR;

typedef struct
{__IO uint32_t CRL;__IO uint32_t CRH;__IO uint32_t IDR;__IO uint32_t ODR;__IO uint32_t BSRR;__IO uint32_t BRR;__IO uint32_t LCKR;
} GPIO_TypeDef;

这里我们仅介绍常用 的
几个寄存器,我们常用的 IO 端口寄存器只有 4 个: CRL、 CRH、 IDR、 ODR。
CRL 和 CRH 控制着每个 IO 口的模式及输出速率。
STM32 的 IO 口位配置表如表 6.1.1 所示:


接下来我们看看端口低配置寄存器 CRL 的描述,如图 6.1.1 所示:



该寄存器的复位值为 0X4444 4444,从图 6.1.1 可以看到,复位值其实就是配置端口为浮空输入模式。从上图还可以得出: STM32 的 CRL 控制着每组 IO 端口(A~G)的低 8 位的模式。每个 IO 端口的位占用 CRL 的 4 个位,高两位为 CNF,低两位为 MODE。这里我们可以记住几个常用的配置,比如 0X0 表示模拟输入模式(ADC 用)、 0X3 表示推挽输出模式(做输出口用,50M 速率)、 0X8 表示上/下拉输入模式(做输入口用)、 0XB 表示复用输出(使用 IO 口的第二功能, 50M 速率)。
CRH 的作用和 CRL 完全一样,只是 CRL 控制的是低 8 位输出口,而 CRH 控制的是高 8
位输出口。这里我们对 CRH 就不做详细介绍了。
给个实例,比如我们要设置 PORTC 的 11 位为上拉输入, 12 位为推挽输出。代码如下:

GPIOC->CRH&=0XFFF00FFF;//清掉这 2 个位原来的设置,同时也不影响其他位的设置
GPIOC->CRH|=0X00038000; //PC11 输入, PC12 输出
GPIOC->ODR=1<<11; //PC11 上拉

通过这 3 句话的配置,我们就设置了 PC11 为上拉输入, PC12 为推挽输出。
IDR 是一个端口输入数据寄存器,只用了低 16 位。该寄存器为只读寄存器,并且只能以
16 位的形式读出。该寄存器各位的描述如图 6.1.2 所示:

要想知道某个 IO 口的状态, 你只要读这个寄存器,再看某个位的状态就可以了。使用起
来是比较简单的。
ODR 是一个端口输出数据寄存器,也只用了低 16 位。该寄存器为可读写,从该寄存器读出来的数据可以用于判断当前 IO 口的输出状态。而向该寄存器写数据,则可以控制某个 IO 口的输出电平。该寄存器的各位描述如图 6.1.3 所示:

流水灯实验

#include "led.h"
//初始化 PB5 和 PE5 为输出口.并使能这两个口的时钟
//LED IO 初始化
void LED_Init(void)
{RCC->APB2ENR|=1<<3; //使能 PORTB 时钟RCC->APB2ENR|=1<<6; //使能 PORTE 时钟GPIOB->CRL&=0XFF0FFFFF;GPIOB->CRL|=0X00300000;//PB.5 推挽输出GPIOB->ODR|=1<<5; //PB.5 输出高GPIOE->CRL&=0XFF0FFFFF;GPIOE->CRL|=0X00300000;//PE.5 推挽输出GPIOE->ODR|=1<<5; //PE.5 输出高
}

该代码里面就包含了一个函数 void LED_Init(void),该函数的功能就是用来实现配置 PB5
和 PE5 为推挽输出。 这里需要注意的是: 在配置 STM32 外设的时候,任何时候都要先使能该外设的时钟!APB2ENR 是 APB2 总线上的外设时钟使能寄存器,其各位的描述如图 6.3.2 所示:

我们要使能的 PORTB 和 PORTE 的时钟使能位,分别在 bit3 和 bit6,只要将这两位置 1 就可以使能 PORTA 和 PORTD 的时钟了。该寄存器还包括了很多其他外设的时钟使能。大家在以后会慢慢使用到的。关于这个寄存器的详细说明在《STM32 参考手册》的第 70 页。
在设置完时钟之后就是配置完时钟之后, LED_Init 配置了 PB5 和 PE5 的模式为推挽输出,并且默认输出 1。这样就完成了对这两个 IO 口的初始化。
保存 led.c 代码,然后我们按同样的方法,新建一个 led.h 文件,也保存在 LED 文件夹下面。在 led.h 中输入如下代码:

#ifndef __LED_H
#define __LED_H
#include "sys.h"
//LED 端口定义
#define LED0 PBout(5)// DS0  #define LED0 (1<<5) //led0 PB5
#define LED1 PEout(5)// DS1  #define LED1 (1<<5) //led1 PE5
void LED_Init(void);//初始化
#endif

这里使用的是位带操作来实现操作某个 IO 口的 1 个位的,关于位带操作前面已经有介绍,
这里不再多说。需要说明的是,这里可以使用另外一种操作方式实现。如下:

#define LED0 (1<<5) //led0 PB5
#define LED1 (1<<5) //led1 PE5
#define LED0_SET(x) GPIOB->ODR=(GPIOB->ODR&~LED0)|(x ? LED0: 0)
#define LED1_SET(x) GPIOE->ODR=(GPIOE->ODR&~LED1)|(x ? LED1: 0)

后者通过 LED0_SET(0)和 LED0_SET(1)来控制 PB5 的输出 0 和 1。而前者的类似操作为:LED0=0 和 LED0=1。显然前者简单很多,从而可以看出位带操作带来的好处。以后像这样的IO 口操作,我们都使用位带操作来实现,而不使用第二种方法。

main函数

#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
//ALIENTEK 战舰 STM32 开发板实验 1
//跑马灯实验
int main(void)
{Stm32_Clock_Init(9);//系统时钟设置delay_init(72); //延时初始化LED_Init(); //初始化与 LED 连接的硬件接口while(1){LED0=0;LED1=1;delay_ms(300);LED0=1;LED1=0;delay_ms(300);}
}

2.仿真与下载



Display Type 选择 bit,然后单击 Close 关闭该对话框,可以看到逻辑分析窗口出来了两个信号,如图 6.4.2 所示:



STM32 IO 简介相关推荐

  1. 1. stm32 mcu简介

    1. stm32 mcu简介 1.1 stm32 mcu结构 1.2 STM32 MCU存储器映像 1.3 STM32 MCU系统时钟树 1.4 Cortex-M3简介 1.1 stm32 mcu结构 ...

  2. 《精通Spring MVC 4》——1.3 start.Spring.io简介

    本节书摘来自异步社区<精通Spring MVC 4>一书中的第1章,第1.3节,作者:[美]Geoffroy Warin著,更多章节内容可以访问云栖社区"异步社区"公众 ...

  3. 单片机搭建环境烧录方法_万物互联-stm32单片机简介、烧录、编程及其项目环境搭建...

    万物互联-stm32单片机简介.烧录.编程 前言:stm32单片机这里给出简单介绍,给不了解的朋友普及下硬件端的基本知识,叙述的较为简单,想深入研究的朋友可以去一些官方网站.论坛.博客汲取知识.最下端 ...

  4. stm32 IO口的八种输入输出模式

    记录一下stm32 IO口的八种输入输出模式的学习 首先,可以看见stm32的输入输出模式有以上8种 先从简单的开始说吧 上拉输入和下拉输入: 看图: 由上图可见,当IO口设置为上拉输入的时候,IO口 ...

  5. STM32 IO口设置

    STM32 IO配置 以模拟IIC接口形式举例说明: IO方向设置 //IO方向设置 #define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB-> ...

  6. Linux 阻塞和非阻塞 IO简介

    Linux 阻塞和非阻塞 IO简介 阻塞和非阻塞简介 1.阻塞IO 2.非阻塞IO 阻塞和非阻塞简介 这里的 IO 指的是 Input/Output,也就是输入/输出,是应用程序对驱动设备的输入/输出 ...

  7. STM32 IO口的8中配置方式解读(推挽输出、开漏输出、复用开漏输出、复用推挽输出以及上拉输入、下拉输入、浮空输入、模拟)

    转自:http://blog.csdn.net/u010592722/article/details/45746079 STM32  IO口的8中配置方式: (1)GPIO_Mode_AIN 模拟输入 ...

  8. keil 查看 stm32 io波形_这样学习STM32单片机,从菜鸟到牛人很简单!

    我想说,为了学习单片机而去学习单片机的思路不对. 你问,如何系统地入门学习stm32呢? 这本身就是一个错误的问题.假如你会使用8051 , 会写C语言,那么STM32本身并不需要刻意的学习. 你要考 ...

  9. keil 查看 stm32 io波形_如何系统地入门学习stm32?

    我想说,为了学习单片机而去学习单片机的思路不对. 你问,如何系统地入门学习stm32呢? 这本身就是一个错误的问题.假如你会使用8051 , 会写C语言,那么STM32本身并不需要刻意的学习. 你要考 ...

最新文章

  1. listener.ora、sqlnet.ora、tnsnames.ora 详解
  2. javascript eval和JSON之间的联系
  3. Dynamic CRM 2013学习笔记(一)插件输入实体参数解析
  4. 攻防世界Reverse第八题logmein
  5. omwin密立根油滴实验数据处理程序_大物实验报告更新啦~
  6. SAP 电商云 Spartacus UI CI 脚本分析
  7. linux mint cinnamon_2019年最佳的8个Linux发行版
  8. sql 插入新数据 如何处理等字符_新手们还在到处找报表资料吗?Intouch SQL 数据库脚本给你安排...
  9. 第五次作业--原型设计(结对)
  10. 几款富文本编辑器的比较
  11. 如何拼局域网所有ip_如何查看局域网内所有ip?
  12. 标签传播算法(半监督图算法)
  13. 冲突域和广播域,中继器、集线器、网桥、交换机、路由器和网关
  14. POJO类的提效利器Lombok插件IDEA安装
  15. C# 实现批量下载抖音里的无水印视频
  16. 无法在驱动器0分区上安装windows解决方法
  17. 饱和度,对比度,锐度
  18. python裁剪不规则区域_Python实现不规则图形填充的思路
  19. java怎么计算时间差_请问java怎么计算时间差
  20. Vue node.js实现支付宝支付(沙箱测试)

热门文章

  1. mysql8.0.15下载后怎么打开_mysql8.0.15下载安装详细教程新手必备!
  2. 一点关于应届毕业生找工作的建议。
  3. win10 安装 SqlServer2008 亲测可行
  4. 用函数统计各分数段人数c语言,excel统计各分数段人数的函数
  5. Spring Boot Admin 2.3 简洁Demo
  6. springmvc自定义参数解析器
  7. npm install很慢(奇葩)解决方法
  8. 一键自动完成 2021 京东/淘宝双 11 活动
  9. 北京交管部门多举措进行二环慢行系统改造,提升通行安全与效率
  10. Angular 4入门教程系列:14:PrimeNG的使用方式