STM32学习---GPIO

来源:互联网 发布:ae pr是什么软件 编辑:程序博客网 时间:2024/05/16 08:20

1.GPIO模式

STM32F1系列的GPIO有8种模式,四种输入,四种输出,输入分别是浮空、上拉、下拉和模拟;输出有开漏和推挽,再分别加上复用功能。F4系列中输出还可以加上上拉、下拉,多几种模式。在GPIO中最大可承受5V电压,在数据手册中I/o Level上标FT的均可兼容5V电平。
这里写图片描述

2.寄存器

F1中通过CRH、CRL寄存器来设置8种模式,每个IO占4个位。F4中有4个寄存器MODER、OTYPER、OSPEEDER、PUPDR来设置模式、IO速度。
数据寄存器IDR、ODR分别是读IO值和写IO值。
另外还提供有复/置位寄存器来进行各个IO口的置0、置1。
还有一个锁存功能,是在LCKH中设置,当锁定IO后下次复位前不能更改端口位的配置。

3.复位后状态

复位期间,IO口均为浮空输入状态,这个在原理图设计时如果有特殊要求时需注意。在JTAG引脚端均为输入状态。
JTDI 上拉输入
JTCK 下拉输入
JTMS 上拉输入
JNTRST 上拉输入
JTDO 浮空输入

4.读IO

在GPIO在输入模式(模拟输入除外)时,有3种方式读读IO电平信号.
(1)可直接使用库函数

#define KEY1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)    

(2)可自已写个读取函数计IDR对应的值。

#define KEY0 (1<<4) //KEY0 PE4#define KEY0_GET() ((GPIOE->IDR&(KEY0))?1: 0)

(3)位带操作
可以使用普通的加载/存储指令来对单一的比特进行读写。有两个区中实现了位带。其中一个是 SRAM 区的最低 1MB 范围,第二个则是片内外设区的最低 1MB 范围。这两个区中的地址除了可以像普通的 RAM 一样使用外,它们还都有自己的“位带别名区”,位带别名区把每个比特膨胀成一个 32 位的字。当你通过位带别名区访问这些字时,就可以达到访问原始比特的目的。

GPIO的输入输出寄存器就在片内外设区的最低 1MB 范围,所以我们可以直接读写它的“别名”。
Eg:
以F1为例,正点原子这样做的:

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) #define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) #define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) #define GPIOE_IDR_Addr    (GPIOE_BASE+16) //0x40021010#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  #define KEY0 PEin

这里写图片描述
就是把地址映射关系对应起来,这样进行读取。

5.写IO

GPIOl输出时,有以下几种方法:
(1) 直接使用库函数
(2) 写ODR
(3) 也可以使用位带操作方式
(4) 还可以写BSRR,通过对应位来置0置1。

参考资料:STM32中文参考手册_V10
STM32F1开发指南-寄存器版本_V3.1
Cortex-M3权威指南(中文)
Cortex-M3之STM32嵌入式系统设计
STM32自学笔记 2012

0 0
原创粉丝点击