当前位置: 首页 > news >正文

手把手之STM32GPIO

    GPIO,翻译过来就是通用输入输出。我想对于输入输出,大家应该很清楚它们的意义。最常用的输出功能莫过于led,而最常用的输入功能莫过于key。

    要想使用STM32的GPIO功能,首先要明确这一功能由谁来支配。你应该了解到对于STM32单片机来说,有一部本功能是由Cortex内核来决定的,而另一部分功能则由STM32芯片自己决定 。翻开Cortex内核手册你会看到,GPIO功能是有芯片自己来决定的。



●由手册到流程

    打开stm32手册,定位到GPIO这一章,不是手册的所有内容都要读,也不是GPIO这一章的所有内容都要读。每一章的开始都有一个功能介绍,也许依据这个介绍就已经可以操作你要的功能了。。。


1、功能概述

    其实由上面的介绍已经可以总结出GPIO的基本配置过程:模式选择、输出设置、输出速度、上拉下拉。想在具体一点?直接跳转到寄存器详解


2、寄存器详解

GPIOx_MODER(模式选择)

    这是一个32位的寄存器,分为16组,也就是说2位控制一个IO引脚(STM32的每一个IO口恰好是16个管脚)。可以看到每一个IO管脚都有4种功能,目前我们使用的是前两种最简单的功能。另外,请注意它的复位值


GPIOx_OTYPER(输出类型)


    这里可以设置输出模式,对于输出又分为两种:推挽和开漏。(GPIO是16位的,因此这个寄存器的高16位系统保留了)


GPIOx_OSPEEDR(输出速度)


    输出功能无非是要驱动某一个外部器件,因此输出速度可以根据外部连接电路来设置


GPIOx_PUPDR(上拉下拉)


    配置IO上拉或者下拉,分为16组,2位控制一个管脚


GPIOx_IDR(端口数据输入)


GPIOx_ODR(端口数据输出)


    不管是数据的输入还是输出,永远都是16位的,因此这两个寄存器的高16位都是系统保留的。


3、GPIO初始化流程

    1)打开GPIO时钟(每一个模块使用的时候,必须先打开对应时钟)

    2)选择输入输出模式

    3)设置输出类型(如果是输出模式)

    4)设置输出速度(如果是输出模式)

    5)选择上拉或下拉



●由流程到代码(以led为例子)


1、直接操作寄存器

void led_init()
{

    //打开GPIOA时钟

    RCC->AHB1ENR |= 1;

    //设置PA6位输出模式
    GPIOA->MODER |= 1     //设置推挽输出
    GPIOA->OTYPER &= ~(1     //设置输出速度50MHz
    GPIOx->OSPEEDR |= 2     //设置上拉
    GPIOA->PUPDR |=1 }
void led_on()
{
    GPIOA->ODR &= ~(1 }
void led_off()
{
    GPIOA->ODR |= 1 }


2、库函数

    操作库函数,需要找到对应的库函数源文件,以及头文件。在库函数中,初始化使用结构体,结构体的定义在头文件中

void myled_init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    //打开时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);    
    //选择管脚
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    //选择为输出模式
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    //推挽输出
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    //输出速度100MHz
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    //上拉
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

//开灯

void led_on()
{
   GPIO_ResetBits(GPIOA,  GPIO_Pin_6);
}

//关灯

void led_off()
{
    GPIO_SetBits(GPIOA,  GPIO_Pin_6);

}

相关文章:

  • iOS 读取plist 方法
  • json恶补
  • mybatis实战教程(mybatis in action)之三:实现数据的增删改查
  • 在代码中修改TextView的DrawableRight图片
  • MongoDB-基础-limit-skip-sort
  • Python 安装模块 模块搜索路径
  • Android第三十天
  • nbsp
  • [改善Java代码]非稳定排序推荐使用List
  • Round 0: Regionals 2010 :: NEERC Eastern Subregional
  • 远程桌面卡
  • 二、ssh 协议:SSH 验证协议 —— 公钥认证
  • 安装程序时出现2502 2503错误解决方法
  • html5配合css3实现带提示文字的输入框(摆脱js)
  • AWS EC2 Run Command特性新增多重云脚本
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • CentOS7简单部署NFS
  • Java 内存分配及垃圾回收机制初探
  • Java读取Properties文件的六种方法
  • JS 面试题总结
  • Koa2 之文件上传下载
  • LeetCode18.四数之和 JavaScript
  • leetcode388. Longest Absolute File Path
  • vue:响应原理
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 安卓应用性能调试和优化经验分享
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 回顾 Swift 多平台移植进度 #2
  • 技术发展面试
  • 聊聊sentinel的DegradeSlot
  • 那些被忽略的 JavaScript 数组方法细节
  • 手写双向链表LinkedList的几个常用功能
  • 小试R空间处理新库sf
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • Linux权限管理(week1_day5)--技术流ken
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ![CDATA[ ]] 是什么东东
  • %check_box% in rails :coditions={:has_many , :through}
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (一)kafka实战——kafka源码编译启动
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (原創) 未来三学期想要修的课 (日記)
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)德国人的记事本
  • (转)为C# Windows服务添加安装程序
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET 中的轻量级线程安全