STM32学习笔记(四)GPIO(General-Purpose I/Os)

输出方式

推挽输出(Push-Pull)

推挽输出电路
  • 若 INT 输入为 0,则 PMOS 截止,NMOS 导通,产生灌电流,输出 OUT 为 0;
  • 若 INT 输入为 1,则 NMOS 导通,PMOS 截止,产生拉电流,输出 OUT 为 1;
推挽输出特点
  • 同时具有高低电压的驱动能力,即高低电平切换所需时间短,反应快;
  • 无法实现线与功能(即禁止输出之间短接);
  • 结型场效应管的特性(G与D、S近乎绝缘)使得电功率极小;
  • 高低电平均由内部 IC 电平决定,通常为一定值;

开漏输出(Open-Drain)

即 漏极(Drain) 一端什么都不接,直接连接 输出端口

开漏输出电路
  • 若 INT 输入为 0,则 NMOS 导通,输出 OUT 为 0;
  • 若 INT 输入为 1,则 NMOS 截止,通过上拉电阻使输出 OUT 为 1;
开漏输出特点
  • 若无上拉电阻则 INT 输入为 1 时输出 OUT 仍为 0;
  • 可以多个 I/O 口共用一个上拉电阻(输出之间短接),形成线与功能(任一条线上输出为0,则所有线均输出为0);
  • 上拉电阻取值要合理,电阻过小则电阻上功耗大,电阻过大则使低电平切换至高电平所需的时间过长;
  • 开漏输出的高电平取决于上拉电阻接的电压,可实现输出高电平电压的灵活变动;

输入方式

上拉/下拉输入(Pull-up/Pull-down)

上拉输入电路
下拉输入电路
  • 上拉输入 引脚 初始值为高电平(即通过 BSRR 将 ODR 置位),判定低电平为输入;
  • 下拉输入 引脚 初始值为低电平(即通过 BRR 将 ODR 复位),判定高电平为输入;

浮空输入(Floating)

  • 初始情况下 引脚 不接高电平也不接低电平,端口呈高阻态;
  • 引脚 的电平完全由外部输入决定;

GPIO寄存器

I/O端口位的基本结构
  • 端口配置低寄存器 --- CRL(Configuration Register Low):配置低8位脚的输入/输出方式;
    • 复位值:0x4444 4444
  • 端口配置高寄存器 --- CRH(Configuration Register High):配置高8位脚的输入/输出方式;
    • 复位值:0x4444 4444
  • 端口输入数据寄存器 --- IDR(Input Data Register):读取端口输入数据,低16位有效(高16位保留);
    • 复位值:0x0000 xxxx
    • 注意:若为输出模式,则该寄存器的值等于 ODR 寄存器的值;
  • 端口输出数据寄存器 --- ODR(Output Data Register):写入端口输出数据,低16位有效(高16位保留);
    • 复位值:0x0000 0000
  • 位设置/清除寄存器 --- BSRR(Bit Set/Reset Register):一般只用低16位对ODR寄存器进行置位操作(高16位为复位操作);
    • 复位值:0x0000 0000
  • 端口位清除寄存器 --- BRR(Bit Reset Register):对ODR寄存器进行复位操作,低16位有效(高16位保留);
    • 复位值:0x0000 0000
  • 端口配置锁定寄存器 --- LCKR(Configuration Lock Register):置1锁定CR寄存器的值,低16位有效;第17位LCKK进行{写1、写0、写1、读0、读1}序列操作更改,LCKK==0时低16位寄存器有效;
    • 复位值:0x0000 0000

常用GPIO固件库函数 (stm32f01x_gpio.h)

需要先打开对应GPIOx的时钟才可正常使用GPIO

GPIO初始化函数 --- GPIO_Init

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
  • GPIOx:对应的 GPIOx 端口,x可以为 (A~G);
  • GPIO_InitStructGPIO_InitTypeDef 结构体
    • GPIO_Pin_x:需要配置的对应的脚,x可以为 (0~15);
    • GPIO_Speed:输出模式则需配置,可选为 2MHz、10MHz、50MHz;
    • GPIO_Mode:AIN——模拟输入、IN_FLOATING——浮空输入、IPD——下拉输入、IPU——上拉输入,Out_OD——开漏输出、Out_PP——推挽输出、AF_OD——复用开漏输出、AF_PP——复用推挽输出;
  • 示例:
GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                    //选择 Pin0 脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;             //选择推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;            //选择最大速率为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);                       // GPIOA 的 Pin0 初始化

输出端口引脚置位函数 --- GPIO_SetBits

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
  • GPIOx:对应的 GPIOx 端口,x可以为 (A~G);
  • GPIO_Pin_x:需要置位的对应的脚,x可以为 (0~15);
  • 示例:
GPIO_SetBits(GPIOA, GPIO_Pin_0);                            // GPIOA 的 Pin0 输出高电平

输出端口引脚复位函数 --- GPIO_ResetBits

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
  • GPIOx:对应的 GPIOx 端口,x可以为 (A~G);
  • GPIO_Pin_x:需要置位的对应的脚,x可以为 (0~15);
  • 示例:
GPIO_ResetBits(GPIOA, GPIO_Pin_0);                            // GPIOA 的 Pin0 输出低电平

读输入端口引脚数据函数 --- GPIO_ReadInputDataBit

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
  • GPIOx:对应的 GPIOx 端口,x可以为 (A~G);
  • GPIO_Pin_x:需要读取数据的对应的脚,x可以为 (0~15);
  • 返回值:输入高电平为 1,输入低电平为 0;
  • 示例:
#define ON  1
if( GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == ON )
{
  //若 GPIOA 的 Pin0 脚为 ON ,执行下列指令
}

位带操作

即将 一个bit的的数据用 取 32位地址的内容 的方式进行操作。

/********位带操作********/
//把“位带地址+位序号”转换为 位带别名区地址
#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))

//对 GPIOA 的 Pin0 置为高电平
#define GPIOA_ODR_ADDR              (GPIOA_BASE + 0x0C)
BIT_ADDR(GPIOA_ODR_ADDR, 0)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352

推荐阅读更多精彩内容