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

网站建设是网络工程师吗公司注册地址和经营地址

网站建设是网络工程师吗,公司注册地址和经营地址,app开发和网站建设区别,中铁建设企业门户使用寄存器编程操作GPIO前言GPIO相关的寄存器GPIO 端口模式寄存器 (GPIOx_MODER) (x A..I)位操作GPIO 端口输出类型寄存器 (GPIOx_OTYPER) (x A..I)GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR) (x A..I/)GPIO 端口上拉/下拉寄存器 (GPIOx_PUPDR) (x A..I/)GPIO 端口输入数据寄… 使用寄存器编程操作GPIO前言GPIO相关的寄存器GPIO 端口模式寄存器 (GPIOx_MODER) (x A..I)位操作GPIO 端口输出类型寄存器 (GPIOx_OTYPER) (x A..I)GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR) (x A..I/)GPIO 端口上拉/下拉寄存器 (GPIOx_PUPDR) (x A..I/)GPIO 端口输入数据寄存器 (GPIOx_IDR) (x A..I)GPIO 端口输出数据寄存器 (GPIOx_ODR) (x A..I)GPIO 端口置位/复位寄存器 (GPIOx_BSRR) (x A..I)GPIO 端口配置锁定寄存器 (GPIOx_LCKR) (x A..I)GPIO 复用功能低位寄存器 (GPIOx_AFRL) (x A..I)GPIO 复用功能高位寄存器 (GPIOx_AFRH) (x A..I)小结使用寄存器编程控制LED灯的亮灭原理图分析MDK代码编程总结前言 上一篇重点介绍了STM32 GPIO的输入输出模式在整个框图中我们发现需要我们使用代码来控制GPIO的模式本文的重点就是使用寄存器的编程方式实现对于GPIO口的操作。 在这里首先需要做一个区分我们常见的STM32的开发方式有两种也就是寄存器开发与库函数开发。寄存器开发就是直接操作底层的寄存器来实现功能而库函数则是使用ST的官方库函数来实现功能目前常用的库有基础库、HAL库、LL库。此系列都会采用直接操作寄存器的方式来实现功能。 GPIO相关的寄存器 既然是操作寄存器实现功能就要知道与GPIO相关的寄存器有哪些根据昨天的GPIO口模式以及框图我们可以大致猜出几个寄存器。 1.输入输出模式选择的寄存器用来确定GPIO是输入模式还是输出模式 2.输出类型选择的寄存器用来选择是推挽还是开漏 3.输出数据寄存器暂存MCU输出的数字量 4.输入数据寄存器暂存外设输入的数字量 5.上拉下拉寄存器设置GPIO的上下拉模式 没看手册之前我们根据GPIO的功能以及结构猜测的有上面这五个寄存器下面我们来看看编程手册关于GPIO的寄存器到底有哪些又该怎么使用。 官方编程手册关于GPIO的寄存器介绍如下 每个通用IO都有十个寄存器与之对应在中文编程手册的第七章有关于这些寄存器的详细描述。 接下来我们来一一看一下这些寄存器的具体作用以及配置方式。 GPIO 端口模式寄存器 (GPIOx_MODER) (x A…I) 端口模式寄存器就是控制整个端口的模式通过写入不同的高低电平来区分对应管脚是输入还是输出(GPIOx_MODER) 这个中间的x就代表从A—I的端口号(x A…I)也就是说一块STM32最多只有9个端口模式寄存器。 它是一个32位的寄存器前面我们提当过STM32的一个端口有0-15共16个管脚而这个端口模式寄存器又是32位的这就说明每个管脚的模式控制有 32/162位二进制数来实现。如下图所示就是端口模式的寄存器中文编程手册第七章7.4 节 GPIO 寄存器 整个寄存器一共是0-31共32位其中第0位与第1位下面写着MODER0[1:0]这个MODER0就代表是该端口对应的0号管脚模式控制其中00表示输入模式复位状态也是此模式01表示通用输出模式10表示复用功能11表示模拟功能。依次类推此寄存器的第2位第三位表示该端口的1号管脚的模式控制剩下的也都是依次类推直至第30位与31位代表第16号管脚的模式控制。细心的同学肯定已经发现了这个寄存器实现的功能就是我们根据结构图分析出来的第一个寄存器所需的功能啊它就解决了GPIO口的模式问题。 举个栗子假设我们要将GPIOA的10号管脚配置为复用功能模式这时候我们就需要找到MODER10[1:0],然后将复用输出模式的10写进这个寄存器。 这里就会产生一个新问题要怎么将数据写入寄存器呢首先能够想到的肯定是需要赋值那么怎么赋值呢我们来分析一下。 位操作 首先这个寄存器的命名ST公司已经给我们做好了就在我们之前搭建工程时使用的使用的stm32f4xx.h中这里给大家截图在下面 而且ST公司还利用宏定义给出了每个端口对应结构体的指针名。 可以看出所有的寄存器都是用的一个结构体给封装起来了我们要调用赋值的话就可以按照下面的语句来实现操作这里使用的是结构体指针名-成员名的方式来操作各个寄存器的。 还是以GPIOA端口的10号管脚配置为复用输出为例 GPIOA -MODER | (121); //GPIOA_MODER寄存器配置为复用模式 //经过此步骤MODER10[1:0]的数据就被覆盖成为了10也就是手册中的复用模式。 //这里的1左移21位就是依据移位操作来实现的由于MODER10对应的寄存器位数就是20位与21位其中第21位需要写1所以我们就需要将1左移21位到此位置。换做其他管脚也是类似的操作再举个例子我们将GPIOC的4号管脚配置为通用输出模式此时需要的操作如下 GPIOC-MODER | (18); //GPIOA_MODER寄存器配置为通用输出模式 //经过此步骤MODER4[1:0]的数据就被覆盖成为了01也就是手册中的通用输出模式。 //这里的1左移8位就是依据移位操作来实现的由于MODER4对应的寄存器位数就是8位与9位其中第8位需要写1所以我们就需要将1左移8位到此位置。上面都是写1操作用的是|我们再举一个清零操作的例子将GPIOA0配置为输入模式此时就需要对MODER0进行清零操作具体写法如下 GPIOA -MODER ~(30);//清0 GPIOA_MODER寄存器为00通用输入模式这里我们使用的是~的操作3转换为二进制就是11,11左移0位还是11然后对11进行取反变成00再将00赋值给MODER这样GPIOA_MODER0就被赋值成为了00也就是将GPIOA0配置为了输入模式。好了到这里整个寄存器操作的赋值语句就学完了就是一个赋值为一一个赋值为0的操作两条语句后面所有需要置一与清零的操作都是用的这个方法来实现的。 GPIO 端口输出类型寄存器 (GPIOx_OTYPER) (x A…I) 我们再来看看GPIO的第二个寄存器端口输出类型寄存器既然是输出类型寄存器说明我们如果再上一个寄存器中将GPIO口配置为输入模式后这个寄存器就可以不用操作了。 这个寄存器就是用来实现对输出模式的控制的我们根据结构图分析出来的第二个寄存器的功能是不是与这个寄存器不谋而合呢我们来看看手册中的描述如下图所示 有了上一个寄存器的经验再看这个是不是就很清晰了首先这个寄存器的高16位是保留的没有使用后面的0-15共16位是不是刚好一位对应一个管脚号也就是说OT0对应的就是0号管脚OT15对应的就是15号管脚然后注意下面的描述配置为0的时候是推挽模式而1的时候是开漏模式。 还是举个栗子吧假设我们需要将GPIOC的4号脚配置为推挽模式此时就该向OTC4写入0参照上面的代码操作就是如下代码 GPIOC-OTC ~(14);//清0 GPIOA_OTC4寄存器为0推挽输出模式GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR) (x A…I/) 然后是GPIO的第三个寄存器GPIOx_OSPEEDR端口输出速度寄存器同理由于是输出寄存器所以如果在第一个寄存器中已经将端口配置为输入则再后续配置过程中不再需要操作本寄存器。 同样的这个寄存器也是一个32位的寄存器而且也是和第一个端口模式寄存器一样的使用的是两个二进制位来控制一个管脚。这个寄存器是我们之前通过结构图所没能分析出来的他主要作用就是控制IO的电平翻转速度。 根据手册的描述我们还是举例将GPIOC端口的4号管脚配置为中速输出首先在上图中找到OSPEEDR4[1:0]它对应的二进制位是第八位和第九位配置为中速也就是25MHZ的输出速度需要对这两位写入01具体操作如下 GPIOC-OSPEEDR | (18);//25MHZ中速GPIO 端口上拉/下拉寄存器 (GPIOx_PUPDR) (x A…I/) 再然后就是第四个寄存器了端口上拉下拉寄存器GPIOx_PUPDR他的作用就是我们前面分析结构图提到的可以通过软件编程来实现IO内部上下拉功能的控制寄存器通过配置它可以实现GPIO口的内部上下拉。此寄存器也是每两位二进制数控制一个管脚。 如上图所示根据数据手册的描述我们将GPIOA0设置为无上下拉模式操作如下找到对应0端口的控制位是第0位和第1位要配置为无上下拉模式就需要对这两位写入00。代码操作如下 GPIOA -PUPDR ~(30);//清0 GPIOA_PUPDR寄存器为00 浮空GPIO 端口输入数据寄存器 (GPIOx_IDR) (x A…I) 然后再来看个稍微不一样一点的输入数据寄存器说它不一样主要是因为他是一个只读寄存器也就是说我们对它的操作只有读取没有上面的赋值操作了至于怎么读我们放到明天的按键操作进行描述根据编程手册可以看出它也是一个一位代表一个端口号的寄存器。另外就是他是输入寄存器说明我们在配置GPIO为输出模式时是不需要操作此寄存器的在这里我们只需要了解这么多至于怎么编程控制我们后面再说。 GPIO 端口输出数据寄存器 (GPIOx_ODR) (x A…I) 可以看出这个寄存器的名字和上一个输入寄存器的名字刚好对应它的作用就是将对应位上的值输出到GPIO口上直白说就是对它写1对应管脚就是输出高电平对它写0对应管脚就会输出低电平同样的它的命名是输出说明配置输入时跟与它就没有关系了它也是单个二进制位控制一个管脚。此寄存器在昨天的框图中也有提到过属于输出框图里面的他对应的有两个输入一个是直接和内核通信另外一个输入方式内核需要经过置位复位控制器来间接控制端口输出寄存器。 这里举个栗子假设我们需要GPIOC4输出高电平我们就需要对GPIO-ODR的第 4 位写1具体编程操作如下 GPIOC-ODR | (14);GPIO 端口置位/复位寄存器 (GPIOx_BSRR) (x A…I) 再上一个寄存器中我们提到了这个端口置位复位寄存器从名称中我们可以看出他的作用是对对应的管脚的ODR寄存器进行置零和置一操作。 手册中关于这个寄存器的描述如下它也是一个32位寄存器但是区分了高16位和低16位其中高16位表示BR0-----BR15也就是管脚0-15的复位操作对对应管脚写1其ODR寄存器就会进行复位写0就不操作。 而第十六位是BS0-----BS15控制的是0–15号管脚的置位功能同样写入1就对对应的ODR寄存器置1写0就不操作。 可以发现这个寄存器的作用与上面的ODR寄存器其实功能一致只是内核通过操作此寄存器间接操作ODR所以在正常使用过程中很少用到这个寄存器一般都是使用内核直接操作ODR寄存器来实现。 GPIO 端口配置锁定寄存器 (GPIOx_LCKR) (x A…I) 关于此寄存器其作用是配置后锁定后我们后面所有的对对应GPIO口的操作都无效了但是实际使用过程中关于GPIO口的配置经常是需要操作的所以这个寄存器也很少使用到。想要了解的同学去手册自己瞄一眼就可以了。 然后是最后两个寄存器他们是配置GPIO口的复用功能的由于GPIO口的复用功能非常丰富为了实现更多的功能ST公司设计了两个复用功能寄存器一个是复用功能低位寄存器另一个是复用功能高位寄存器它们两个寄存器都是32位寄存器每个寄存器分管8个IO口的复用模式复用功能低位寄存器 (GPIOx_AFRL) 控制0-----7管脚的复用功能复用功能高位寄存器 (GPIOx_AFRH) 控制8----15管脚的复用功能也就是说在复用功能配置这里每个管脚有四个二进制位进行控制一共有AF0-----AF15共16中复用模式在配置具体的复用模式时需要根据引脚映射表来查询具体的是AFX然后根据下面的AFX对应的数据写入即可具体的使用我们在后面的片上外设复用使用中再做具体介绍。由于是复用功能所以在通用模式时我们用不上这个寄存器只有需要使用复用功能时才需要用到。 GPIO 复用功能低位寄存器 (GPIOx_AFRL) (x A…I) GPIO 复用功能高位寄存器 (GPIOx_AFRH) (x A…I) 小结 至此我们已经看完了所有的GPIO寄存器一共是10个但是在实际使用中我们需要用到寄存器并没有那么多需要对应模式进行选择最终关于对应模式的GPIO寄存器配置可以总结为下表 表中打X的表示不用配置举个栗子配置通用推挽输出不带上下拉这时候的配置步骤 伪代码 配置某一个IO口为通用推挽输出模式所需要的GPIO寄存器 {1.对应位的MODER配置为01——————————通用输出2.对应位的OTYPER配置为0——————————推挽输出3.对应位的OSPEEDR配置为01—————25Mhz中速这个不一定按照自己的需求4.对应位的PUPDR配置为00——————————无上下拉5.对应位的ODR 配置为0——————————输出低电平 配置为1——————————输出高电平 }使用寄存器编程控制LED灯的亮灭 看完上面的寄存器介绍我们对于整个配置流程已经有了一个了解接下里就是使用MDK编写代码实现我们想要的功能今天我们先控制一个LED灯。 原理图分析 首先笔者这里用的板子的LED小灯电路图如下图所示根据原理图可以得出我们给PA6低电平LED1就点亮给PA6高电平LED1就熄灭。 MDK代码编程 打开我们在嵌入式学习笔记——STM32单片机开发前的准备http://t.csdn.cn/PF8Y9中搭建好的工程没有搭好的可以私信获取 1.打开后新建一个Led.c文件到USER下的src的文件夹下 2.新建一个Led.h文件到USER下的inc文件夹下 3.添加Led.c进入工程双击1所示的USER在弹出的框内2的位置打开src文件夹选中Led.c电机Add即可。 4.编写Led.h头文件注意头文件的分区保持一个好的格式风格。 #ifndef _LED_H__ #define _LED_H__ //包含头文件区 #include stm32f4xx.h//此头文件每个子模块的.h都必须包含 /*----------------------------------------------------------*/ //宏定义区 /*----------------------------------------------------------*/ //函数声明区 /*----------------------------------------------------------*/ #endif5.编写Led.c文件首先第一步添加Led.h使头文件与源文件联系起来然后就是编写初始化函数具体的初始化过程我们参考上面的伪代码来进行配置。 在这里还需要特别注意的一步是在编写上面的伪代码之前还需要开启对应GPIOA挂接的时钟使能。 查询步骤 1.看片内外设的结构框图找GPIOA对应的时钟线数据手册第二章如下图所示GPIOA对应的就是AHB1总线 2.在编程手册查找AHB1对应的使能寄存器如下图所示 在编程手册第六章最后一节可以看见这个寄存器的第0位就是GPIOA的时钟将他配置为1即可打开GPIOA的时钟具体代码实现如下 //打开GPIOA端口对应的AHB1时钟 RCC-AHB1ENR | (10);#include Led.h/******************************************* *函数名 :Led_Init *函数功能 :LED灯所用的管脚的初始化配置 *函数参数 :无 *函数返回值:无 *函数描述 : LED1--------PA6--------低电平亮通用输出模式 *********************************************/ void Led_Init(void) {//打开GPIOA端口对应的AHB1时钟RCC-AHB1ENR | (10);/*端口模式清零*/GPIOA-MODER ~(312);/*端口通用输出模式*/GPIOA-MODER | (112);/*端口输出推挽模式*/GPIOA-OTYPER ~(16);/*端口输出速度2MHz*/GPIOA-OSPEEDR ~(312);//清零OSPEEDRGPIOA-OSPEEDR | (112);//25MHZ中速GPIOA-PUPDR ~(312);//默认无上下拉/* 端口输出寄存器*/ // GPIOA-ODR|(0xf6);//置1拉高对应端口灯灭 }6.然后在main.c首先包含Led.h到main.h中添加一句#includeLed.h 再在main.c中调用Led_Init()初始化函数并对ODR寄存器写0点亮LED1 代码 #include main.hint main(void) { /*------------------变量定义区--------------------------*//*------------------初始化外设区------------------------*/Led_Init();GPIOA-ODR~(0xf6);//置零拉低对应端口灯亮 /*------------------单次运行区--------------------------*/ while(1)//防止程序跑飞{ /*------------------主循环区--------------------------*/ }} 7.点击1全编译如果出现2所示的0errors0warings表示代码没问题了 8.选择下载器笔者使用的是ST-LINK操作如下选择3所示的魔法棒选择4Debug,选择ST-LINK,然后点击确定。 9.点击烧录等待下方进度条为百分百表示烧录完毕。 10.点击板子上的复位或者重新上电小灯已经被点亮。 总结 至此关于GPIO的寄存器配置以及一个简单的代码编程已经完成了后面一篇我们再来尝试配置输入模式的编程过程本文篇幅也很长如有不足希望大家指出寄存器的详细介绍大家可以去编程手册查看。
http://www.dnsts.com.cn/news/4741.html

相关文章:

  • 策划案例网站网站建设教程大全 百度网盘
  • 做网站后期维护网站建设策划书 备案
  • 武昌网站制作公司人才招聘类网站开发文档
  • 常州做网站推广wordpress后台汉语
  • 建网站跟建网店的区别软件开发工具是什么意思
  • 网站做支付需要准备什么东西洛阳电商网站建设
  • 网站色彩搭配技巧wordpress调用指定标签
  • 上海手机网站建设报价北京高端网站建设
  • 网站备案变更主体电话做网站上海
  • 网站根目录在哪wordpress做自主外贸网站和后台费用多少
  • 网站怎么做微信登录钦州seo
  • 如何开发移动网站哪里可以接公司外包业务
  • 企业网站建设该怎么描述抚州 提供网站建站 公司
  • 专业做棋牌网站的中信建设有限责任公司总部在哪
  • 找人做网站网站网站开发与设计是什么
  • 公司宣传网站建设本科专业建设规划
  • 免费建站系统软件推广链接
  • 简答题网站建设步骤手机网站模板 html5
  • 大连公司企业网站建设网站做cpa
  • 建设个网站多少钱企业网站建设报价清单
  • 温州网站建设哪家专业阿里云建设网站好不好
  • 贾汪城乡建设局网站网站建设构架
  • 博山区住房和城乡建设局网站大家都用哪个网站做读书笔记
  • 怎么做阿里巴巴外贸网站太仓建设局网站
  • 长沙做网站找谁单页型网站
  • 临沂网站制作建设网站运营管理教材
  • 网站 视觉冲击网站备案重要吗
  • 企业网站设计制作收费软件开发可以做网站么
  • 一个人怎样做网站百度热搜榜第一
  • 建设论坛网站wordpress做的博客