STM32萌新学习日志——用GPIO外设寄存器输出点亮LED对比库函数点亮LED——谈学习感悟

这篇具有很好参考价值的文章主要介绍了STM32萌新学习日志——用GPIO外设寄存器输出点亮LED对比库函数点亮LED——谈学习感悟。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        本周学习STM32单片机,由于之前学过51单片机,为了便于切入,先学习了寄存器点亮LED灯的方法,整体思路与51单片机相似。在基本掌握后,尝试自己构建库函数雏形,过程比较困难,后面开始借鉴野火官方库函数。

        这里其实建议大家在学会构建库函数后,没必要每个库函数都自己构建,太消耗时间。当然,若果时间充裕的话,自己构建库函数可以使之后的工程的开发、学习都更加方便,毕竟自己写的更加熟悉。

一、GPIO简述、功能及输出过程

        GPIO 即 general purpose intput output ,是通用输入输出端的简称,简单来说就是软件可控制 的引脚, STM32芯片的GPIO弓|脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。例如输出高低电平控制LED灯的亮灭状态。GPIO是包含在100引脚之内的,包含诸如PE2、PE3……等引脚。

        专用器件接到专用的总线,比如I2C, SPI, SDIO, FSMC, DCMI这些总线的器件需要接到专用的I0,普通的元器件接到GPIO,比如蜂鸣器,LED,按键等元器件用普通的GPIO,如果还有剩下的I0,可根据项目需要引出或者不引出。

        由于时间限制,本篇文章只讲述DPIO输出,接下来将以下面的功能框架图作为例图进行讲解。

STM32萌新学习日志——用GPIO外设寄存器输出点亮LED对比库函数点亮LED——谈学习感悟,stm32,学习,嵌入式硬件

         如果电压高于VDD,电流会由I/O引脚流向VDD,如果高出太多,可能会导致芯片烧毁。因此I/O口不能直接接电机,需要通过一个驱动电路进行隔离。从图中我们可以看到推挽输出、开漏输出、关闭三个输出模式。

        首先是推挽输出。当输出数据寄存器输出1时,经过1-2管时会反转为0,此时Ug=0<Us,vdd与OUT导通且,两端电压相等,为3.3v,即p管导通,n管截止,out输出3.3v。反之亦然,若输出数据寄存器输出0时,out输出0。

什么叫推挽输出?

1、可以输出高低电平,用于连接数字器件,高电平由VDD(3.3v)决定,低电平由VSS决定。

2、推挽结构指两个三极管受两路互补的信号控制,总是在一个导通的时候另外一个截止,优点开关效率效率高(电流大,驱动能力强。

3、输出高电平时,电流输出到负载,叫灌电流,可以理解成推,输出低电平时,负载电流流向芯片,叫拉电流,即挽。

STM32萌新学习日志——用GPIO外设寄存器输出点亮LED对比库函数点亮LED——谈学习感悟,stm32,学习,嵌入式硬件

什么叫开漏输出?

1、只能输出低电平,不能输出高电平。

2、如果要输出高电平,则需要外接上拉。

3、开漏输出具有“线与”功能,一个为低,全部为低,多用于I2C和SMBUS总线。

STM32萌新学习日志——用GPIO外设寄存器输出点亮LED对比库函数点亮LED——谈学习感悟,stm32,学习,嵌入式硬件

二、寄存器点亮LED灯

        总线共有三个,APB1、APB2、AHB。

        BSRR指bit set reset 寄存器,是32位寄存器,输入1为有效,0为无效,低16位为set,设置,高电平,高16位为reset,复位,低电平,即0。

        各寄存器之间存在一个地址的偏移,偏移是以4为一个单位,首先找到总线的基地址,然后通过偏移找到外设基地址,再通过偏移找到需要的寄存器基地址,最初外设基地址是总线1,即APB1的基地址。

        STM32萌新学习日志——用GPIO外设寄存器输出点亮LED对比库函数点亮LED——谈学习感悟,stm32,学习,嵌入式硬件

STM32萌新学习日志——用GPIO外设寄存器输出点亮LED对比库函数点亮LED——谈学习感悟,stm32,学习,嵌入式硬件

STM32萌新学习日志——用GPIO外设寄存器输出点亮LED对比库函数点亮LED——谈学习感悟,stm32,学习,嵌入式硬件

下面的图是基址的偏移的实例。

STM32萌新学习日志——用GPIO外设寄存器输出点亮LED对比库函数点亮LED——谈学习感悟,stm32,学习,嵌入式硬件

我们这里首先开启GPIOB 端口时钟,清空控制PB0的端口位之后,再配置PB0为通用推挽输出,使PB0输出为低电平。编程如下:



#include "stm32f10x.h" 


int main(void)
{    
    // 开启GPIOB 端口时钟
    RCC_APB2ENR |= (1<<3);

    //清空控制PB0的端口位
    GPIOB_CRL &= ~( 0x0F<< (4*0));    
    // 配置PB0为通用推挽输出,速度为10M
    GPIOB_CRL |= (1<<4*0);

    // PB0 输出 低电平
    GPIOB_ODR &= ~(1<<0);
    
    //GPIOB_ODR |= (1<<0);
    while(1);
}

// 函数为空,目的是为了骗过编译器不报错
void SystemInit(void)
{    
}

效果图:

STM32萌新学习日志——用GPIO外设寄存器输出点亮LED对比库函数点亮LED——谈学习感悟,stm32,学习,嵌入式硬件

三、固件库点亮LED灯

1.下面是自定义头文件的源文件.c

#include "bsp_led.h"   


void LED_GPIO_Config(void)
{        
        /*定义一个GPIO_InitTypeDef类型的结构体*/
        GPIO_InitTypeDef GPIO_InitStructure;

        /*开启LED相关的GPIO外设时钟*/
        RCC_APB2PeriphClockCmd( LED1_GPIO_CLK | LED2_GPIO_CLK | LED3_GPIO_CLK, ENABLE);
        /*选择要控制的GPIO引脚*/
        GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;    

        /*设置引脚模式为通用推挽输出*/
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

        /*设置引脚速率为50MHz */   
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

        /*调用库函数,初始化GPIO*/
        GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);    
        
        /*选择要控制的GPIO引脚*/
        GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN;

        /*调用库函数,初始化GPIO*/
        GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
        
        /*选择要控制的GPIO引脚*/
        GPIO_InitStructure.GPIO_Pin = LED3_GPIO_PIN;

        /*调用库函数,初始化GPIOF*/
        GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure);

        /* 关闭所有led灯    */
        GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
        
        /* 关闭所有led灯    */
        GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);     
    
    /* 关闭所有led灯    */
        GPIO_SetBits(LED3_GPIO_PORT, LED3_GPIO_PIN);
}

2.下面是主函数源文件.c

#include "stm32f10x.h"
#include "bsp_led.h"

#define SOFT_DELAY Delay(0x0FFFFF);

void Delay(__IO u32 nCount);

 
int main(void)
{    
    /* LED 端口初始化 */
    LED_GPIO_Config();     

    while (1)
    {
        LED1_ON;              // 亮
        SOFT_DELAY;
        LED1_OFF;           // 灭

        LED2_ON;             // 亮
        SOFT_DELAY;
        LED2_OFF;           // 灭

        LED3_ON;             // 亮
        SOFT_DELAY;
        LED3_OFF;           // 灭     

        /*轮流显示 红绿蓝黄紫青白 颜色*/
        LED_RED;
        SOFT_DELAY;
        
        LED_GREEN;
        SOFT_DELAY;
        
        LED_BLUE;
        SOFT_DELAY;
        
        LED_YELLOW;
        SOFT_DELAY;
        
        LED_PURPLE;
        SOFT_DELAY;
                
        LED_CYAN;
        SOFT_DELAY;
        
        LED_WHITE;
        SOFT_DELAY;
        
        LED_RGBOFF;
        SOFT_DELAY;        
    }
}

void Delay(__IO uint32_t nCount)     //简单的延时函数
{
    for(; nCount != 0; nCount--);
}
/*********************************************END OF FILE**********************/

下面是效果图:
STM32萌新学习日志——用GPIO外设寄存器输出点亮LED对比库函数点亮LED——谈学习感悟,stm32,学习,嵌入式硬件

下载链接:

http://products.embedfire.com

注:来自于野火官方文章来源地址https://www.toymoban.com/news/detail-840921.html

到了这里,关于STM32萌新学习日志——用GPIO外设寄存器输出点亮LED对比库函数点亮LED——谈学习感悟的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 明解STM32—GPIO理论基础知识篇之寄存器原理​

    一、前言         在之前的STM32的GPIO理论基础知识中,分别对基本结构和工作模式进行了详细的介绍。GPIO基本结构中主要对GPIO内部的各个功能电路逐一的进行的分析;GPIO工作模式中主要介绍GPIO应用在不同的使用场景下,GPIO端口的静态特征配置和动态的工作模式,同时对

    2024年02月16日
    浏览(48)
  • STM32 | STM32时钟分析、GPIO分析、寄存器地址查找、LED灯开发(第二天)

    寄存器 :寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成 在计算机领域,寄存器是CPU内部的元件,包括通用寄存器、专用寄存器和 控制寄存器 。寄存

    2024年03月08日
    浏览(50)
  • STM32的以太网外设+PHY(LAN8720)使用详解(3):PHY寄存器详解

    前面介绍到,站管理接口(SMI)允许应用程序通过2线时钟和数据线访问任意PHY寄存器,同时该接口支持访问最多32个PHY,也就是说PHY地址共有5位。 应用程序可以从32个PHY中选择一个PHY,然后从任意PHY包含的32个寄存器中选择一个寄存器,发送控制数据或接收状态信息。任意给

    2024年02月03日
    浏览(47)
  • STM32F103ZET6 GPIO工作模式介绍+使用寄存器点亮第一个LED灯

    目录  GPIO的工作模式介绍 1.输入模式(模拟、上拉、下拉、浮空) 2.输出模式(推挽/开漏) 3.复用功能(推挽/开漏) 4.模拟输入输出(上下拉无影响) 如何使用寄存器点亮第一个LED灯         在输入模式时,施密特触发器打开,输出被禁止。可通过输入数据寄存器 GPIOx_

    2024年02月06日
    浏览(67)
  • STM32 | GPIO口的普通与复用如何配置与用法,本文降从最底层教你如何查看手册运用寄存器来实现GPIO口的配置

    🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都在这儿哦,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏 🪔本系列专栏 -  蓝桥杯嵌入式_勾栏听曲_0的博客 🍻欢迎大家  🏹  点赞👍  评论📨  收藏⭐️ 📌个人主

    2024年02月14日
    浏览(44)
  • stm32的BRR寄存器和BSRR寄存器

    1、BRR---   bit   RESET(置0)  register   //高16位无,低16位置1为0,不能写1 2 、BSRR---   bit   SET(设置1或0)       register   //低16位设置1为0 BSRR:用于低16位的作用是让指定的IO口置1;而高16位的作用是让指定的IO口置0。  

    2024年02月11日
    浏览(44)
  • STM32之寄存器

    在学习STM32之前有必要了解一下ARM架构,以下相关ARM架构的知识来自百度百科​:​ ARM架构,曾称进阶精简指令集机器(Advanced RISC Machine)更早称作Acorn RISC Machine,是一个32位精简指令集(RISC)架构。还有基于ARM设计的派生产品,重要产品包括Marvell的XScale架构和德州仪器的

    2024年02月22日
    浏览(47)
  • STM32寄存器点亮LED灯

     这个灯是 PB5引脚 看原理图可以看出 让GPIOB5输出低电平 就能点亮 那么我们得让 打开控制GPIOB5的时钟 让GPIOB5 输出模式 让GPIOB5低电平 时钟就相当于一个阀门开关,或者理解成水龙头,你打开了 才有水出来,也就是你打开才能工作。 看中文参考手册 系统架构 找到你的GPIO

    2024年02月07日
    浏览(49)
  • STM32存储器映射以及寄存器映射

    目录 1.STM32的寻址范围? 2.存储器映射 3.存储器功能划分(以STM32F1为例) 4.寄存器映射 1.32位单片机有32根地址线,每根地址线有两种状态,导通或者不导通。 2.单片机内存地址访问的存储单元是按字节编址的,而不是bit。 比如我们要访问0x01这个地址,访问的其实是一个字节的空

    2024年04月23日
    浏览(46)
  • STM32-ADC电压采样实验(寄存器版)

    STM32F10X系列支持三路ADC,其ADC通道及对应IO口如下表所示: 其能接受的电压输入范围一般为0-3.3V(V REF- ≤ V IN ≤ V REF+ ),因此,如果需要测量超出0-3.3v量程范围的电压数据,需要在外围硬件增加分压电阻,将电路转换到0-3.3V量程范围内再进行采集。 这里用于做ADC采集的引脚使

    2024年02月15日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包