STM32F1-GPIO的操作
GPIO 即通用输入输出口。凡事都要熟悉,熟能生巧。一定要掌握MDK软件的工程操作方法。
对于GPIO的操作。
Project里面要有以下几个文件夹(开发之前需要包含相应的库文件,这里默认已经包含)

STEP BY STEP(以按键和LED灯为例):
1.在USER文件夹里新建对应功能的C文件和H文件(这里对应 Key.c Key.h LED.c LED.h)其中C文件用来进行对应外设的硬件配置,H文件是申明对应C文件里面定义的配置函数。注意H文件开头要检查以下时候需要检查以下重复定义的情况, 如下:
#ifndef __EXTI_H
#define __EXTI_H
2.下面重点总结下功能C文件里面对应外设的硬件配置过程。
STEP1:建立数据结构,配置工作时钟
STM32这种单片机和51单片机的很大不同就是,对应不同功能的硬件有相应的工作时钟与其对应。这个时钟是必不可少的,就像人的心脏一样。
先建立数据结构GPIO_InitTypeDef GPIO_InitStructure;
然后配置时钟,RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
可能每次你都不清楚,为什么硬件配置要那么来,从库开发的角度来说,要学会去看库的帮助文件,打开之后找到Data Structure这一块,找到对应的GPIO的数据结构。
而库开发不同关于寄存器开发的地方是,库是间接的用数据结构去填充寄存器。所以首先得要有这个对应的数据结构,也就是这里的 GPIO_InitStructure;

打开帮助中GPIO_InitTypeDef 这个结构体,里面的变量结构就可以看出来,分别是:管脚(pin),速度(speed),工作模式(Mode)
00091 typedef struct
00092 {
00093 uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured.
00094 This parameter can be any value of @ref GPIO_pins_define */
00095
00096 GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins.
00097 This parameter can be a value of @ref GPIOSpeed_TypeDef */
00098
00099 GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins.
00100 This parameter can be a value of @ref GPIOMode_TypeDef */
00101 }GPIO_InitTypeDef; 然后依照每个变量的值的情况进行赋值如:GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;其实在GPIO_InitStructure结构体中的变量都是枚举型的,也就是说它的值都是一定的,是个常数。
| void GPIO_Init | ( | GPIO_TypeDef * | GPIOx, |
| GPIO_InitTypeDef * | GPIO_InitStruct | ||
| ) |
2.初始化寄存器(数据结构映射到寄存器中)
到这里还没有好,这一步仅仅是把你申明的一个结构体变量的每个部分确定了,还没有映射到寄存器中去,那么怎么映射到寄存器中去呢?库开发早就已经设计了一个映射的功能函数在帮助里面可以看到,这个函数的用法如:GPIO_Init(GPIOC, &GPIO_InitStructure);
#include "bsp_led.h" /**
* @brief 初始化控制LED的IO
* @param 无
* @retval 无
*/
void LED_GPIO_Config(void)
{
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDef GPIO_InitStructure; /*开启LED的外设时钟*/
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE); /*选择要控制的GPIOB引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; /*设置引脚模式为通用推挽输出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*调用库函数,初始化GPIOB0*/
GPIO_Init(GPIOB, &GPIO_InitStructure); /*选择要控制的引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4; /*调用库函数,初始化GPIOC*/
GPIO_Init(GPIOC, &GPIO_InitStructure); /* 关闭所有led灯 */
GPIO_SetBits(GPIOB, GPIO_Pin_0); /* 关闭所有led灯 */
GPIO_SetBits(GPIOC, GPIO_Pin_4|GPIO_Pin_3);
}
LED头文件内容
***********************************
#ifndef __LED_H
#define __LED_H #include "stm32f10x.h" void LED_GPIO_Config(void); #endif /* __LED_H */
结论:
库开发的精髓是:初始化结构体和初始化函数的配合使用!
GPIO的设置分为四步
1.申明结构体 GPIO_InitTypeDef GPIO_InitStructure;
2.设置时钟 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE);
3.结构体赋值 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
4.初始化寄存器 GPIO_Init(GPIOC, &GPIO_InitStructure);
设置多个GPIO的时候,如果Mode和Speed都是一样的,就只可以设置一次就行。
STM32F1-GPIO的操作的更多相关文章
- GPIO引脚操作
Kernel: 4.4 Soc: msm8996 1.用户空间通过sysfs操作GPIO (1)启用GPIO sysfs interface 首先看系统中有没有“/sys/class/gpio”这个文 ...
- linux 标准 GPIO 操作
Linux 提供了GPIO 操作的 API,具体初始化及注册函数在 driver/gpio/lib_gpio.c 中实现. #include int gpio_request(unsigne ...
- 树莓派学习笔记——使用文件IO操作GPIO SysFs方式
0 前言 本文描写叙述假设通过文件IO sysfs方式控制树莓派 GPIO端口.通过sysfs方式控制GPIO,先訪问/sys/class/gpio文件夹,向export文件写入GPIO编号, ...
- 嵌入式GPIO接口及操作(一)
GPIO意思就是通用输入输出,一些引脚可以通过他们输出高低电平,或者通过它们读入引脚的状态.对GPIO的操作是对所有硬件的操作最基本的技能.一.通过寄存器来操作GPIO引脚,一个引脚可以用于输入.输出 ...
- Linux内核 GPIO操作部分API
内核中关于GPIO的操作API主要集中在<linux/of_gpio.h>和<linux/gpio.h>中,前者主要是GPIO直接与设备树相关的操作,在Linux 设备树操作A ...
- Linux下用文件IO的方式操作GPIO(/sys/class/gpio)
通过sysfs方式控制GPIO,先访问/sys/class/gpio目录,向export文件写入GPIO编号,使得该GPIO的操作接口从内核空间暴露到用户空间,GPIO的操作接口包括direction ...
- sys下gpio操作
gpio_operation 通过/sys/文件接口操作IO端口 GPIO到文件系统的映射 * 控制GPIO的目录位于/sys/class/gpio * /sys/class/gpio/export文 ...
- Linux下用文件IO的方式操作GPIO(/sys/class/gpio)(转)
通过sysfs方式控制GPIO,先访问/sys/class/gpio目录,向export文件写入GPIO编号,使得该GPIO的操作接口从内核空间暴露到用户空间,GPIO的操作接口包括direction ...
- TX2 用文件IO的方式操作GPIO
概述 通过 sysfs 方式控制 GPIO,先访问 /sys/class/gpio 目录,向 export 文件写入 GPIO 编号,使得该 GPIO 的操作接口从内核空间暴露到用户空间,GPIO 的 ...
- 嵌入式GPIO接口及操作(二)
目标:C语言实现点亮LED灯 首先是main函数,并不特殊,它是被系统调用来执行的,main函数结束后要返回调用main函数的地址处,那么裸机程序,没有操作系统做这些工作,就要自己写调用main函数的 ...
随机推荐
- impala系列: 时间函数
--=======================时间函数--======================= --当前时间戳now()current_timestamp() --当前时间戳相对于 li ...
- thinkcmf 相关
后台登录,暂停关掉登录验证码: /Volumes/macHD2/myCode/wwwroot/app/admin/controller/PublicController.php $captcha = ...
- WCF各个Service之间共享数据
为了实现cache存储验证用户身份信息,减少通过数据库验证的次数,需要在wcf各个服务之间建立共享数据区. namespace WcfService1 { public static clas ...
- 【三】Java VM 发展史
1. Sun Classic VM jdk1.0 第一款商用虚拟机. 只能使用纯解释器来运行Java代码.没有自己的判断,会把每一个方法每一行代码都编译,效率不好.导致大家普遍认为Java代码运行 ...
- IDAPython脚本之收集函数的调用信息
转载:All Right 当我们要寻找软件漏洞 bug 的时候,或者做恶意代码分析的时候,首先会找一些常用的而且容易被错误使用的函数.但是有时候程序代码太多找的比较辛苦,并且费时间.所以我们可以写一个 ...
- 使用Python的turtle库画圣诞树
代码如下: from turtle import * import random import time n = 80.0 speed("fastest") screensize( ...
- git 重命名 origin
git remote rename origin old-origin git remote add origin https://gitlab.com/wuxianqiang/my-project. ...
- Python的集合和元组
一.元组 元组也是一个list,但它的值不能改变 Python 的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号 ...
- 将数据以json字符串格式传到前台请求页面
1.前台ajax方法(这个是在FlowDocAction的add.jsp页面) //序列号 var preFileNo = factoryCode+deptCode+"-"+mod ...
- L - Tic-Tac-Toe FZU - 2283 (思维)
题目链接: L - Tic-Tac-Toe FZU - 2283 题目大意:两个人下棋,一共是三步棋,第一个人下一步,第二个人下一步,第三个人下一步,然后问你在两个人在都足够聪明的条件下,第一个人能否 ...