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,使能时钟 /* LED 端口初始化 */
//根据上面的寄存器描述依次配置,这个技能是只要你去看,就会的东西
/*GPIOH MODER10清空*/
GPIOH_MODER &= ~( 0x03<< (*));
/*PH10 MODER10 = 01b 输出模式*/
GPIOH_MODER |= (<<*); /*GPIOH OTYPER10清空*/
GPIOH_OTYPER &= ~(<<*);
/*PH10 OTYPER10 = 0b 推挽模式*/
GPIOH_OTYPER |= (<<*); /*GPIOH OSPEEDR10清空*/
GPIOH_OSPEEDR &= ~(0x03<<*);
/*PH10 OSPEEDR10 = 0b 速率2MHz*/
GPIOH_OSPEEDR |= (<<*); /*GPIOH PUPDR10清空*/
GPIOH_PUPDR &= ~(0x03<<*);
/*PH10 PUPDR10 = 01b 上拉模式*/
GPIOH_PUPDR |= (<<*); /*PH10 BSRR寄存器的 BR10置1,使引脚输出低电平*/
GPIOH_BSRR |= (<<<<); /*PH10 BSRR寄存器的 BS10置1,使引脚输出高电平*/
//GPIOH_BSRR |= (1<<10); while(); } // 函数为空,目的是为了骗过编译器不报错
void SystemInit(void)//这个函数必须自己写一个加上,因为启动文件的关系,到后面会详细说这个问题
{
} /*********************************************END OF FILE**********************/

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

使用寄存器点亮LED——编程实战的更多相关文章

  1. 第7章 使用寄存器点亮LED灯

    第7章     使用寄存器点亮LED灯 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...

  2. 第7章 使用寄存器点亮LED灯—零死角玩转STM32-F429系列

    第7章     使用寄存器点亮LED灯 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...

  3. STM32F4 阿波罗寄存器点亮LED灯

    学习步骤: 使用寄存器点亮LED灯,需要进行如下的步骤,LED灯属于外设部分,首先需要开启外设的时钟使能,然后LED灯是PB1口,(芯片是正点原子的阿波罗),接着定义GPIOB口的输出模式,为上拉.推 ...

  4. 使用寄存器点亮LED——2

    1. 项目:使用stm32寄存器点亮LED, 分别点亮红.绿.蓝3个灯. 2. 步骤 先新建个文件夹保存项目 再新建项目 将startup_stm32f10x_hd.s拷贝到该文件夹下 新建main. ...

  5. 使用寄存器点亮LED

    1. 项目:使用stm32寄存器点亮LED, 分别点亮红.绿.蓝3个灯. 2. 代码: 只需要编写main.c程序,stm3210x.h程序为空(只需要新建即可). 2.1 点亮绿灯main.c程序 ...

  6. 使用寄存器点亮LED——前言基础知识

    在点亮LED之前,我们需要具备一些基础知识: GPIO—general purpose intput output 是通用输入输出端口的简称,简单来说就是软件可控制的引脚,STM32芯片的GPIO引脚 ...

  7. 使用寄存器点亮LED(第2节)—寄存器映射代码讲解

    // 打开 GPIOB 端口的时钟 *( unsigned int * )0x40021018|= ( 1 << 4 ); // 配置PC2 IO口为通用推挽输出,速度为10M *( un ...

  8. stm32F103C8T6通过写寄存器点亮LED灯

    因为我写寄存器的操作不太熟练,所以最近腾出时间学习了一下怎么写寄存器,现在把我的经验贴出来,如有不足请指正 我使用的板子是stm32F103C8T6(也就是最常用的板子),现在要通过写GPIO的寄存器 ...

  9. 使用寄存器点亮LED(第1节)—GPIO功能框图讲解

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

随机推荐

  1. CMake 基本用法--写CMakeList.txt

    http://techbase.kde.org/Development/Tutorials/CMake_(zh_CN) http://www.cmake.org/Wiki/CMake 这一章将从软件开 ...

  2. 以__name__进行单元测试

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #以__name__进行单元测试 #何为单元测试? #单元测试(模块测试)是开发者编写的一小段代码,用于检测被 ...

  3. memcached 下载安装

    wget http://memcached.org/latest tar -zxvf memcached-1.x.x.tar.gz cd memcached-1.x.x ./configure &am ...

  4. spyder python 相关

    1.python开发集成工具Spyder中,如何设置变量成员提示和代码补全呢? 答: pip install rope,安装好rope 就可以了 2.最常用的是:tap的制动补全 (IPython c ...

  5. 在linux下安装eclipse以及运行c++程序的安装步骤

    1.       下载jre,eclipse,cdt 其中jre是java运行环境,eclipse需要先装jre,才可能运行,cdt是在eclipse中运行c\c++程序的插件. 下载jre 网址是: ...

  6. More Effective C++:通过引用捕获异常

    当你写一个catch子句时,必须确定让异常通过何种方式传递到catch子句里.你可以有三个选择:与你给函数传递参数一样,通过指针(by pointer),通过传值(by value)或通过引用(by ...

  7. nginx 配置web 虚拟文件夹 而且codeIgniter,thinkphp 重定向url 地址

    nginx 配置虚拟文件夹而且url 重定向 server { #侦听80port listen 8090; #定义使用www.xx.com訪问 server_name 127.0.0.1; #设定本 ...

  8. 利用Aspose.BarCode生成条码

    生成条码有很多控件,大部分好的控件,做出来的条码精确清晰,但是往往该部分的控件费用都很高,这里推荐大家使用6.0版本的破解版,可以生成无水印,下方也可以不显示文字. 1.下图是 onbarcode 控 ...

  9. js出现Syntax error on token "catch", Identifier expected

    本文转自:http://blog.csdn.net/u011159417/article/details/73916676 项目中需要使用jQuery,因此下载了jQuery的js包jquery-3. ...

  10. HDUOJ---2112HDU Today

    HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...