使用寄存器点亮led——编程实战

悄然拔尖 悄然拔尖     2022-08-27     663

关键词:

stm32的编程和stc89c51还是存在着很多思想上的不同的,在51单片机中,我们点亮LED灯,只用给对应IO高低电平就可以了,而stm32中,就一个简单的GPIO,我们也需要配置好几个寄存器,而且,就算配置好GPIO寄存器,我们还必须有一步不能缺少的操作,那就是开启对应GPIO的时钟。在stm32的编程中,开启对应时钟是必不可少的一个操作,而且,开启时钟的操作必须在配置相应寄存器之前,以GPIO为例,如果我们先配置GPIO的寄存器,不开启时钟或者先配置GPIO寄存器,最后再开启时钟,都不能正常驱动芯片工作。时钟就像人的脉搏一样,人必须有脉搏才能工作,同样,stm32也必须先给时钟,再配置寄存器达到相应的功能。

那么我是怎么知道要这样配置的呢?

第一,现在的教程比较成熟,能够知道这些内容;第二,在开发板的学习教程中,他也是通过ST的官方demo知道的,具体在

F4固件库\STM32F4xx_DSP_StdPeriph_Lib_V1.5.1\STM32F4xx_DSP_StdPeriph_Lib_V1.5.1\Project\STM32F4xx_StdPeriph_Examples\

这个目录下,有基于ST的参考代码,别人告诉我们要先开启时钟;第三,为什么要先开启对应外设时钟才能工作,51单片机就不需要啊。这个也是可以理解的,为了低功耗嘛,时钟相当于一把钥匙控制这个电路的开关,没用时钟这把钥匙,你什么操作也是白搭,对应时钟控制对应外设,这也无可厚非。

 

那么我们怎么查看具体外设到底要开启什么时钟呢?

查看《STM32F4xx中文参考手册1》2.3节,STM32F4xx 寄存器边界地址 ,可以看到对应外设的时钟。

可以看到我们的GPIOH是挂载在AHB1总线上,所以要先开启AHB1总线上的GPIOH时钟。

那么又在哪里查看这个呢?还是中文参考资料中,6.3.12 RCC AHB1 外设时钟使能寄存器 (RCC_AHB1ENR)

通过这里我们我们可以看到:

参考手册上说明,这个寄存器的第七位控制我们的GPIOH,置1,使能。

同样,配置GPIO寄存器时,也应该参考对应手册:

在知道这些流程之后,开始编写程序:

/*
    使用寄存器的方法点亮LED灯
  */
#include "./stm32f4xx.h"  


/**
  *   主函数
  */
int main(void)
{    
    /*开启 GPIOH 时钟,使用外设时都要先开启它的时钟*/
    RCC_AHB1ENR |= (1<<7);    //很明朗了,第七位要置1,使能时钟
    
    /* LED 端口初始化 */
    //根据上面的寄存器描述依次配置,这个技能是只要你去看,就会的东西
    /*GPIOH MODER10清空*/
    GPIOH_MODER  &= ~( 0x03<< (2*12));    
    /*PH10 MODER10 = 01b 输出模式*/
    GPIOH_MODER |= (1<<2*12);
    
    /*GPIOH OTYPER10清空*/
    GPIOH_OTYPER &= ~(1<<1*12);
    /*PH10 OTYPER10 = 0b 推挽模式*/
    GPIOH_OTYPER |= (0<<1*12);
    
    /*GPIOH OSPEEDR10清空*/
    GPIOH_OSPEEDR &= ~(0x03<<2*12);
    /*PH10 OSPEEDR10 = 0b 速率2MHz*/
    GPIOH_OSPEEDR |= (0<<2*12);
    
    /*GPIOH PUPDR10清空*/
    GPIOH_PUPDR &= ~(0x03<<2*12);
    /*PH10 PUPDR10 = 01b 上拉模式*/
    GPIOH_PUPDR |= (1<<2*12);
    
    /*PH10 BSRR寄存器的 BR10置1,使引脚输出低电平*/
    GPIOH_BSRR |= (1<<16<<12);
    
    /*PH10 BSRR寄存器的 BS10置1,使引脚输出高电平*/
    //GPIOH_BSRR |= (1<<10);

    while(1);

}

// 函数为空,目的是为了骗过编译器不报错
void SystemInit(void)//这个函数必须自己写一个加上,因为启动文件的关系,到后面会详细说这个问题
{    
}






/*********************************************END OF FILE**********************/

这个是我们自己用寄存器实现的例子,我的开发板有三个灯,分别接GPIOH10,11,12,所以更改了几次代码,这样也发现寄存器编程的一个问题,修改代码有点麻烦,而且还是有点冗余,虽然我们可以通过宏或者函数封装,但是,那样封装之后,他就是库函数版本了, 到后面,我们都会采用库函数的方式来学习,项目开发中肯定也是库函数首选。但是,我们经过自己配置寄存器这个步骤,知道了库函数底层其实也就是封装了配置好的寄存器而已,知道原理之后,我们还是应该才赢开发效率更高的库函数来进行应用。

7.如何使用寄存器点亮一个led灯(代码片段)

如何点亮LED本篇讲解用寄存器在stm32开发板上点亮一个LED灯,原理图如下:相同网络标号表示它们是连接在一起的,因此LED1-LED8发光二极管阴极是连接在STM32的PC0-PC7管脚上。如果要使D1指示灯亮,只需要控制PC0管脚... 查看详情

点亮指路灯led

...程序调试的重要手段。 LED驱动设计:1、设置GPIO控制寄存器,把引脚设置为输出功能2、根据原理图设置GPIO数据寄存器,点亮LED.text.global_start_start:bresetldrpc,_undefined_instruct 查看详情

zigbee学习----点亮led(代码片段)

...原理分析  ①:看过好多博客,刚开始都是直接讲配置寄存器,但我觉得需要且有必要了解一下cc2530这款单片机。zigbee就在人家上面搭载嘛    CC2530微控制器采用QFN40封装,有40个引脚。其中,有21个数字I/O端口,其中P0和P... 查看详情

使用寄存器点亮led(第1节)—gpio功能框图讲解(代码片段)

GPIO简介    GPIO 是通用输入输出端口的简称,简单来说就是 STM32 可控制的引脚, STM32 芯片的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。STM32 芯片... 查看详情

stm32学习笔记——点亮led

...笔记——点亮LED本人学习STM32是直接通过操作stm32的寄存器,使用的开发板是野火ISO-V2版本;先简单的介绍一下stm32的GPIO;stm32的GPIO有多种模式:  1.输入浮空  2.输入上拉  3.输入下拉  4.模拟输入  5.开漏输出... 查看详情

第8课点亮第一个led灯

...0]输出为0时,LED点亮,当GPIO[0]输出为1时,LED就熄灭,GPIO寄存器的基地址为0x8000d000,下图为用到的几个寄存器的偏移地址 首先,选中GPIO引脚,*((unsignedshort*)(0x8000d000+0x00))=0x5555;*((unsignedshort*)(0x8000d 查看详情

嵌入式08stm32f103c8t6寄存器方式借助面包板点亮led流水灯详解(代码片段)

...始化GPIO,点亮LED灯三、工程文件模板的建立四、使用寄存器点亮LED灯——代码部分1、硬件连接设计2、打开之前建立的工程模板3、代码编写4、硬件连接5、烧录:STM32F103C8T6与PC端连接五、使用寄存器点亮LED灯——电路部... 查看详情

点亮led

...期单片机是OTPROM。RAM——数据存储空间。SFR——特殊功能寄存器。2.2单片机最小系统最小系统指的是能使单片机正常工作最低要保证哪几部分存在。单片机最小系统的三要素就是电源、晶振(本板11.0592M)、复位电路。晶振:复... 查看详情

嵌入式开发学习之--点亮led灯(下)

...控制单片机引脚PH10接地,而控制的方法就是配置对应的寄存器。2.1、什么是寄存器  寄存器是一个非常重要的概念。但要具体了解他,还需要了解单片机的组成,结构,等等一系列让人看着头晕脑胀的东西。所以我们尝试换... 查看详情

stm32如何新建工程+寄存器点亮led灯(代码片段)

STM32新建工程+寄存器点灯一:如何新建工程1:下载芯片支持包Keil.STM32Fxxxx.pack文件2:打开KEIL5加载Keil.STM32Fxxxx.pack文件3:添加编写代码文件main.c以及添加启动文件二:如何寄存器点灯1:看单片机的原理... 查看详情

物联网-esp8266实战-点亮一个led灯(代码片段)

...第一个 Arduino程序,下面我来带大家进行操作。一、点亮一个LED灯打开ArduinoIDE,点击【工具】->【开发板】,选择NodeMCU1.0(ESP-12EModule),图示如下:  然后将开发板通过USB数据线插到电脑上,... 查看详情

2440裸机学习点亮led(代码片段)

...芯片手册可以看出,需要设置GPF的引脚只需要设置,两个寄存器就可以了。GPFCON GPFDAT。  C语言部分:voiddelay(volatileintd)//延时函数while(d--);intled_on(in 查看详情

树莓派点亮led灯需要几行代码?3行。小孩子都能学会(代码片段)

...象成积木块,而且提供了足够简单易用的接口,所以我们使用起来简单方便,学习的门槛很低。但是图形化在设计复杂程序的时候,尽管积木块用起来很方便,写复杂程序的时候也是有些有心无力。但是如果有一个软件库,提供... 查看详情

51单片机学习笔记4新建工程及点亮led实战(代码片段)

51单片机学习笔记4新建工程及点亮LED实战一、使用keil新建工程二、项目设置1.点击魔术棒,钩选Output-CreateHexFile2.设置仿真器三、编写代码1.尝试编译代码2.点亮LED的代码3.GPIO引脚介绍4.GPIO内部结构P0端口:P1端口四、软件... 查看详情

51单片机学习笔记4新建工程及点亮led实战(代码片段)

51单片机学习笔记4新建工程及点亮LED实战一、使用keil新建工程二、项目设置1.点击魔术棒,钩选Output-CreateHexFile2.设置仿真器三、编写代码1.尝试编译代码2.点亮LED的代码3.GPIO引脚介绍4.GPIO内部结构P0端口:P1端口四、软件... 查看详情

从点亮一个led开始,cortex-a9裸机程序设计

...略具体是怎么连接的),因此我们要做的就是:配置相关寄存器使引脚变为输出功能(这里配置为输出功能0x1)配置上下拉(若需要 查看详情

嵌入式开发学习之--点亮led灯(中)

...控制单片机引脚PH10接地,而控制的方法就是配置对应的寄存器。什么是寄存器    查看详情

裸机循环点亮led(运行在片内ram中)

转载请注明原文出处,http://www.cnblogs.com/flyingcloude/p/6992476.html.globl_start_start:/*硬件相关的设置-该设置是ARM11中特有的,告诉CPU外围设备的基地址*/   ldrr0,=0x70000000   orrr0,r0, #0x13/*设置协寄存器, 查看详情