第8讲GPIO原理与配置方法.ppt

上传人:本田雅阁 文档编号:3435829 上传时间:2019-08-25 格式:PPT 页数:29 大小:3.56MB
返回 下载 相关 举报
第8讲GPIO原理与配置方法.ppt_第1页
第1页 / 共29页
第8讲GPIO原理与配置方法.ppt_第2页
第2页 / 共29页
第8讲GPIO原理与配置方法.ppt_第3页
第3页 / 共29页
第8讲GPIO原理与配置方法.ppt_第4页
第4页 / 共29页
第8讲GPIO原理与配置方法.ppt_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《第8讲GPIO原理与配置方法.ppt》由会员分享,可在线阅读,更多相关《第8讲GPIO原理与配置方法.ppt(29页珍藏版)》请在三一文库上搜索。

1、第 8 讲 GPIO原理与配置方法,ALIENTEK,广州星翼电子 官方淘宝店:http:/ 技术支持论坛:,原子教你玩STM32系列视频,技术支持论坛: 开源电子网 官方微博: “正点原子” 微博网址 http:/ 淘宝店铺: http:/,GPIO 8种模式 3个最大输出速度,广州星翼电子 官方淘宝店:http:/ 技术支持论坛:,ALIENTEK,原子教你玩STM32系列视频,-输入浮空 -输入下拉 -输入上拉 -模拟输入 -开漏输出 -推挽式输出 -推挽式复用功能 -开漏复用功能,-2MHz -10MHz -50MHz,GPIO基本结构,广州星翼电子 官方淘宝店:http:/ 技术支持

2、论坛:,ALIENTEK,原子教你玩STM32系列视频,GPIO 输入输出配置相关寄存器 寄存器配置在STM32中文参考手册V10的8.2节有详细讲解,广州星翼电子 官方淘宝店:http:/ 技术支持论坛:,ALIENTEK,原子教你玩STM32系列视频,- GPIOx_CRL :端口配置低寄存器 - GPIOx_CRH:端口配置高寄存器 - GPIOx_IDR:端口输入寄存器 - GPIOx_ODR:端口输出寄存器 - GPIOx_BSRR:端口位设置/清除寄存器 - GPIOx_BRR :端口位清除寄存器 - GPIOx_LCKR:端口配置锁存寄存器,广州星翼电子 官方淘宝店:http:/

3、 技术支持论坛:,ALIENTEK,原子教你玩STM32系列视频,广州星翼电子 官方淘宝店:http:/ 技术支持论坛:,ALIENTEK,原子教你玩STM32系列视频,广州星翼电子 官方淘宝店:http:/ 技术支持论坛:,ALIENTEK,原子教你玩STM32系列视频,广州星翼电子 官方淘宝店:http:/ 技术支持论坛:,ALIENTEK,原子教你玩STM32系列视频,广州星翼电子 官方淘宝店:http:/ 技术支持论坛:,ALIENTEK,原子教你玩STM32系列视频,广州星翼电子 官方淘宝店:http:/ 技术支持论坛:,ALIENTEK,原子教你玩STM32系列视频,广州星翼电子

4、官方淘宝店:http:/ 技术支持论坛:,ALIENTEK,原子教你玩STM32系列视频,通过跑马灯实例测试寄存器用法!,广州星翼电子 官方淘宝店:http:/ 技术支持论坛:,ALIENTEK,原子教你玩STM32系列视频,跑马灯硬件连接,广州星翼电子 官方淘宝店:http:/ 技术支持论坛:,ALIENTEK,原子教你玩STM32系列视频,寄存器配置方式改写工程模板代码:,int main(void) delay_init(); RCC-APB2ENR|=1APB2ENR|=1CRL ,所有GPIO都挂载在APB2下面,广州星翼电子 官方淘宝店:http:/ 技术支持论坛:,ALIENTE

5、K,原子教你玩STM32系列视频,函数分布文件: - stm32f10x_gpio.c -stm32f10x_gpio.h,GPIO库函数配置方法,GPIO输入输出配置重要函数: void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); uint8_t GPIO_Read

6、OutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx); void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVa

7、l); void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal); void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);,广州星翼电子 官方淘宝店:http:/ 技术支持论坛:,ALIENTEK,原子教你玩STM32系列视频,函数原型: void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); 作用: 初始化GPIO的模式和速度,也就是设置相应的GPIO寄存器的CRH和CRL值。 第

8、一个输入参数是GPIO_TypeDef类型指针变量,确定是哪个GPIO,取值范围: GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG 第二个参数是GPIO_InitTypeDef类型指针变量,确定GPIOx的对应的引脚以及引脚 的模式和输出最大速度。 typedef struct uint16_t GPIO_Pin; GPIOSpeed_TypeDef GPIO_Speed; GPIOMode_TypeDef GPIO_Mode; GPIO_InitTypeDef;,GPIO_Init()函数:,广州星翼电子 官方淘宝店:http:/ 技术支持论坛

9、:,ALIENTEK,原子教你玩STM32系列视频,1)第一个参数GPIO_Pin确定初始化那些管脚,取值范围为: GPIO_Pin_0 GPIO_Pin_15以及GPIO_Pin_All 2)第二个参数GPIO_Speed确定初始化的IO的最大输出速度,其取值范围为枚举类型GPIOSpeed_TypeDef 的枚举值: typedef enum GPIO_Speed_10MHz = 1, GPIO_Speed_2MHz, GPIO_Speed_50MHz GPIOSpeed_TypeDef; 3)第三个参数GPIO_Mode;确定初始化的IO的输入输出模式,其取值范围为枚举类型 GPIOMo

10、de_TypeDef的枚举值: typedef enum GPIO_Mode_AIN = 0x0, /模拟输入 GPIO_Mode_IN_FLOATING = 0x04, /浮空输入 GPIO_Mode_IPD = 0x28, /下拉输入 GPIO_Mode_IPU = 0x48, /上拉输入 GPIO_Mode_Out_OD = 0x14, /开漏输出 GPIO_Mode_Out_PP = 0x10, /通用推挽输出 GPIO_Mode_AF_OD = 0x1C, /复用开漏输出 GPIO_Mode_AF_PP = 0x18 /复用推挽 GPIOMode_TypeDef;,广州星翼电子 官方

11、淘宝店:http:/ 技术支持论坛:,ALIENTEK,原子教你玩STM32系列视频,函数使用范例: GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; /PB.5 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /速度50MHz GPIO_Init(GPIOB, /根据设定参数配置GPIOB.5,广州星翼电子 官方淘宝

12、店:http:/ 技术支持论坛:,ALIENTEK,原子教你玩STM32系列视频,函数原型: uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 作用: 读取对应的GPIO的输入值。也就是读取IDR寄存器的值。 使用范例: GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_5);/读取GPIOE.5管脚的输入值,函数 GPIO_ReadInputDataBit():,函数原型: uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); 函

13、数GPIO_ReadInputData()和GPIO_ReadInputDataBit()作用类似,不同的是GPIO_ReadInputData()用来读取一组(GPIOAGPIOG)所有IO口(16个)的输入值。 范例:GPIO_ReadInputData(GPIOE);/读取GPIOE所有IO输入值,函数 GPIO_ReadInputData():,广州星翼电子 官方淘宝店:http:/ 技术支持论坛:,ALIENTEK,原子教你玩STM32系列视频,读取IO口输出值,也就是读取寄存器ODR的值。 范例:GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_5);

14、/读取GPIOE.5的输出值 GPIO_ReadOutputData(GPIOE); /读取GPIOE所有IO输出值,函数GPIO_ReadOutputDataBit() & GPIO_ReadOutputData(),设置IO输出高或者低,也就是设置寄存器BSRR,BRR的值 范例: GPIO_SetBits(GPIOE,GPIO_Pin_5) /GPIOE.5输出高 GPIO_ResetBits(GPIOE,GPIO_Pin_5);/GPIOE.5输出低,函数GPIO_SetBits() & GPIO_ResetBits(),广州星翼电子 官方淘宝店:http:/ 技术支持论坛:,ALIE

15、NTEK,原子教你玩STM32系列视频,库函数实现实验1跑马灯实例:,int main(void) GPIO_InitTypeDef GPIO_InitStructure; delay_init(); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB| RCC_APB2Periph_GPIOE, ENABLE); /使能PB,PE端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; /LED0PB.5 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /推挽输

16、出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /IO口速度为50MHz GPIO_Init(GPIOB, ,广州星翼电子 官方淘宝店:http:/ 技术支持论坛:,ALIENTEK,原子教你玩STM32系列视频,看看我们“实验1跑马灯-库函数操作 的源码”是怎么实现的?,STM32位带操作,广州星翼电子 官方淘宝店:http:/ 技术支持论坛:,ALIENTEK,原子教你玩STM32系列视频,就是把每个比特膨胀为一个32位的字,当访问这些字的时候就达到了访问比特的目的,比如说BSRR寄存器有32个位,那么可以映射到32个地址上,我们去访

17、问(读-改-写)这32个地址就达到访问32个比特的目的。,广州星翼电子 官方淘宝店:http:/ 技术支持论坛:,ALIENTEK,原子教你玩STM32系列视频,在 CM3 支持的位带中,有两个区中实现了位带。 其中一个是 SRAM 区的最低 1MB 范围,0x20000000 0x200FFFFF (SRAM 区中的最低 1MB); 第二个则是片内外设区的最低 1MB范围, 0x40000000 0x400FFFFF (片上外设区中的最低 1MB)。 位带区:支持位带操作的地址区 位带别名:对别名地址的访问最终作用到位带区的访问上 (注意:这中间有一个地址映射过程) 映射关系式:,广州星翼电

18、子 官方淘宝店:http:/ 技术支持论坛:,ALIENTEK,原子教你玩STM32系列视频,#define BITBAND(addr, bitnum) (addr & 0xF0000000)+0x2000000+(addr &0xFFFFF)5)+(bitnum2) #define MEM_ADDR(addr) *(volatile unsigned long *)(addr) #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum) /IO口地址映射 #define GPIOA_ODR_Addr (GPIOA_BASE+12

19、) /0x4001080C #define GPIOB_ODR_Addr (GPIOB_BASE+12) /0x40010C0C #define GPIOF_ODR_Addr (GPIOF_BASE+12) /0x40011A0C #define GPIOG_ODR_Addr (GPIOG_BASE+12) /0x40011E0C #define GPIOA_IDR_Addr (GPIOA_BASE+8) /0x40010808 #define GPIOB_IDR_Addr (GPIOB_BASE+8) /0x40010C08 #define GPIOG_IDR_Addr (GPIOG_BAS

20、E+8) /0x40011E08 /IO口操作,只对单一的IO口! /确保n的值小于16! #define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) /输出 #define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) /输入 #define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) /输出 #define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) /输入 #define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) /输出 #define PFin(n)

21、BIT_ADDR(GPIOF_IDR_Addr,n) /输入 #define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) /输出 #define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) /输入,sys.h里面对GPIO输入输出部分功能实现了位带操作:,广州星翼电子 官方淘宝店:http:/ 技术支持论坛:,ALIENTEK,原子教你玩STM32系列视频,实验2蜂鸣器实例硬件连接图:,BEEP管脚输出0,三极管不导通,蜂鸣器关闭 BEEP管脚输出1,三极管导通, 蜂鸣器鸣叫。,广州星翼电子 官方淘宝店:http:/ 技术支持论坛:,ALI

22、ENTEK,原子教你玩STM32系列视频,库函数实现实验2蜂鸣器实例:,int main(void) GPIO_InitTypeDef GPIO_InitStructure; delay_init(); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); /使能GPIOB端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; /BEEPPB.8 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /推挽输出 GPIO_InitStructure.

23、GPIO_Speed = GPIO_Speed_50MHz; /速度为50MHz GPIO_Init(GPIOB, ,广州星翼电子 官方淘宝店:http:/ 技术支持论坛:,ALIENTEK,原子教你玩STM32系列视频,实验3按键输入实例:,#ifndef _KEY_H #define _KEY_H #include “sys.h“ #define KEY0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)/读取按键0 #define KEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)/读取按键1 #define KEY2

24、GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)/读取按键2 #define KEY3 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)/读取按键3(WK_UP) #define KEY_UP 4 #define KEY_LEFT 3 #define KEY_DOWN 2 #define KEY_RIGHT 1 void KEY_Init(void);/IO初始化 u8 KEY_Scan(u8); /按键扫描函数 #endif,key.h,广州星翼电子 官方淘宝店:http:/ 技术支持论坛:,ALIENTEK,原子教你玩STM32系

25、列视频,void KEY_Init(void) /IO初始化 GPIO_InitTypeDef GPIO_InitStructure; /初始化KEY0GPIOA.13,KEY1GPIOA.15 上拉输入 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);/使能时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;/PE24 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; /设置

26、成上拉输入 GPIO_Init(GPIOE, / 无按键按下 ,key.c,广州星翼电子 官方淘宝店:http:/ 技术支持论坛:,ALIENTEK,原子教你玩STM32系列视频,int main(void) u8 t; delay_init(); /延时函数初始化 LED_Init(); /LED端口初始化 KEY_Init(); /初始化与按键连接的硬件接口 BEEP_Init(); /初始化蜂鸣器端口 LED0=0; /先点亮红灯 while(1) t=KEY_Scan(0); /得到键值 if(t) switch(t) case KEY_UP: /控制蜂鸣器 BEEP=!BEEP; break; case KEY_LEFT: /控制LED0翻转 LED0=!LED0; break; case KEY_DOWN: /控制LED1翻转 LED1=!LED1; break; case KEY_RIGHT: /同时控制LED0,LED1翻转 LED0=!LED0; LED1=!LED1; break; else delay_ms(10); ,main.c,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1