stm32_i/o口操作——01
来源:互联网 发布:unity3d培训多久学完 编辑:程序博客网 时间:2024/06/07 05:58
通过初始化结构体初始化GPIO的常用格式是:
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//LED0-->PA.8端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);//根据设定参数配置GPIO
上面代码的意思是设置GPIOB的第5个端口为推挽输出模式,同时速度为50M。从上面初始化代码可以看出,结构体GPIO_InitStructure的第一个成员变量GPIO_Pin用来设置是要初始化哪个或者哪些IO口;第二个成员变量GPIO_Mode是用来设置对应IO端口的输出输入模式,这些模式是上面我们讲解的8个模式,在MDK中是通过一个枚举类型定义的:
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;
第三个参数是IO口速度设置,有三个可选值,在MDK中同样是通过枚举类型定义:
typedef enum
{
GPIO_Speed_10MHz = 1,
GPIO_Speed_2MHz,
GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;
这些入口参数的取值范围怎么定位,怎么快速定位到这些入口参数取值范围的枚举类型,在我们上面章节4.7的“快速组织代码”章节有讲解,不明白的朋友可以翻回去看一下,这里我们就不重复讲解,在后面的实验中,我们也不再去重复讲解怎么定位每个参数的取值范围的方法。
IDR是一个端口输入数据寄存器,只用了低16位。该寄存器为只读寄存器,并且只能以16位的形式读出。该寄存器各位的描述如图6.1.7所示:
在固件库中操作IDR寄存器读取IO端口数据是通过GPIO_ReadInputDataBit函数实现的:
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
比如我要读GPIOA.5的电平状态,那么方法是:
GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);
返回值是1(Bit_SET)或者0(Bit_RESET);
ODR是一个端口输出数据寄存器,也只用了低16位。该寄存器为可读写,从该寄存器读出来的数据可以用于判断当前IO口的输出状态。而向该寄存器写数据,则可以控制某个IO口的输出电平。该寄存器的各位描述如图6.1.8所示:
在固件库中设置ODR寄存器的值来控制IO口的输出状态是通过函数GPIO_Write来实现的:
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
该函数一般用来往一次性一个GPIO的多个端口设值。
BSRR寄存器是端口位设置/清除寄存器。该寄存器和ODR寄存器具有类似的作用,都可以用来设置GPIO端口的输出位是1还是0。下面我们看看该寄存器的描述如下图:
BRR寄存器是端口位清除寄存器。该寄存器的作用跟BSRR的高16位雷同,这里就不做详细讲解。在STM32固件库中,通过BSRR和BRR寄存器设置GPIO端口输出是通过函数
GPIO_SetBits()和函数GPIO_ResetBits()来完成的。
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
在多数情况下,我们都是采用这两个函数来设置GPIO端口的输入和输出状态。比如我们要设置GPIOB.5输出1,那么方法为:
GPIO_SetBits(GPIOB, GPIO_Pin_5);
反之如果要设置GPIOB.5输出位0,方法为:
GPIO_ResetBits (GPIOB, GPIO_Pin_5);
GPIO相关的函数我们先讲解到这里。虽然IO操作步骤很简单,这里我们还是做个概括性的总结,操作步骤为:
1) 使能IO口时钟。调用函数为RCC_APB2PeriphClockCmd()。
2) 初始化IO参数。调用函数GPIO_Init();
3) 操作IO。操作IO的方法就是上面我们讲解的方法。
- stm32_i/o口操作——01
- i/o—— Android使用FileInputStream和FileOutputStream进行文件I/O操作
- ORALCE——utl_file包进行I/O操作
- 高级字符驱动程序操作——阻塞型I/O
- C++ I/O操作——简单文件加密
- android 数据持久化——I/O操作
- I/O 操作文件的类——File
- Java文件操作2——文件I/O流
- java基础15(Javaoo10)——I/O操作
- Linux驱动开发(四)——I/O操作
- linuxC系统编程——文件的I/O操作
- Java——I/O操作之拷贝文件
- Linux系统编程——系统调用之 I/O 操作(文件操作)
- Linux系统编程——系统调用之 I/O 操作(文件操作)
- Linux系统编程——系统调用之 I/O 操作(文件操作)
- Linux系统编程——系统调用之I/O操作(文件操作)
- Linux系统编程——系统调用之 I/O 操作(文件操作)
- CC2540基础之i/o口操作
- lua 读写文件
- Oracle使用游标查询指定数据表的所有字段名称组合而成的字符串
- char *s 和 char s[] 的区别小结
- bootstrap 2.3版与3.0版的使用区别
- js数组的操作
- stm32_i/o口操作——01
- 全排列
- 运维技能 - 同步lsync
- LayoutInflater作用及使用
- 配置cocosPod环境
- 二维码备忘录
- objective-c 关键字和概念
- 测试代码的报错java.lang.Exception: No tests found matching Method ***
- android开发中apk安装包常用工具