上一节通过使用操作地址的方式进行了寄存器的操作,接下来通过两个部分,实现进阶版的操作寄存器(将寄存器的地址进行命名,然后使用名字进行调用  比如商场的A座5楼345号为卖玩具的,我们可以定义地址为shopa,接着使用shopa代替卖玩具的地址就OK了)

进阶1:首先需要完成寄存器的映射,将基地址进行定义,然后在基地址的基础上加上偏移地址即可。这部分需要在main.c对应的.h文件之中进行操作,代码如下.C语言在最后,第二个elsif之中

#define PERIPH_BASE       ((unsigned int)0x40000000)
#define PERIPH_AHB1 (PERIPH_BASE + 0x00020000)
#define PERIPH_RCC_BASE (PERIPH_AHB1 + 0x00003800)
#define PERIPH_GPIOB_BASE (PERIPH_AHB1 + 0x00000400)
这部分代码是地址立即数的操作,前面就不需要写 *(unsigned int *)
#define RCC_AHB1_ENABLE *(unsigned int *)(PERIPH_RCC_BASE+0x00000030) #define GPIOB_MODER *(unsigned int *)(PERIPH_GPIOB_BASE)
#define GPIOB_OTTYPE *(unsigned int *)(PERIPH_GPIOB_BASE+0x04)
#define GPIOB_OSPEED *(unsigned int *)(PERIPH_GPIOB_BASE+0x08)
#define GPIOB_PUPDR *(unsigned int *)(PERIPH_GPIOB_BASE+0x0C)
#define GPIOB_ODR *(unsigned int *)(PERIPH_GPIOB_BASE+0x14)
这部分代码是要在c文件之中进行赋值,因此需要将该名字转换为一个为地址的量。

进阶2:上述的寄存器需要不断的定义,但是在实际的使用之中,会发现RCC的一部分寄存器都是32位的,我们可以用结构体进行定义,自动赋值就好。

typedef  unsigned  int   uint32_t;
typedef unsigned short uint16_t; typedef struct
{
uint32_t MODER;
uint32_t OTTYPE;
uint32_t OSPEED;
uint32_t PUPDR;
uint32_t IDR;
uint32_t ODR;
uint32_t BSRR;
}GPIO_TypeDef; typedef struct
{
uint32_t CR;
uint32_t PLLCFGR;
uint32_t CFGR;
uint32_t CIR;
uint32_t AHB1RSTR;
uint32_t AHB2RSTR;
uint32_t AHB3RSTR;
uint32_t BLANK1;
uint32_t APB1RSTR;
uint32_t APB2RSTR;
uint32_t BLANK2;
uint32_t BLANK3;
uint32_t AHB1ENR;
uint32_t AHB2ENR;
uint32_t AHB3ENR;
}RCC_TypeDef;
结构体之中的名字一定要写对,要根据初始地址之后的寄存器进行,地址也要对应,上边的BLANK就是为了增加地址写的哦。开始写的时候出错了,一个原因就是因为AHB1使能的地址不对。 #define GPIOB ((GPIO_TypeDef*)PERIPH_GPIOB_BASE)
#define RCC ((RCC_TypeDef*)PERIPH_RCC_BASE)

C语言的代码:

//灯0 为PB1口

# include  "stm32f429xx.h"
# include "stm32f429xx_gpio.h" int main(void)
{
#if 0
//使能时钟AHB1
*(unsigned int *)0x40023830 |= (<<);
//控制io口输出
*(unsigned int *)0x40020400 &= 0x00000000;
*(unsigned int *)0x40020400 |= (<<); *(unsigned int *)0x40020404 &= 0x00000000; *(unsigned int *)0x40020408 &= 0x00000000;
*(unsigned int *)0x40020408 |= (<<); *(unsigned int *)0x4002040C &= 0x00000000;
*(unsigned int *)0x4002040C |= (<<); //ODR寄存器
*(unsigned int *)0x40020414 &=~(<<); #elif 0
RCC_AHB1_ENABLE |= (<<);
//控制io口输出
GPIOB_MODER &= 0x00000000;
GPIOB_MODER |= (<<); GPIOB_OTTYPE &= 0x00000000; GPIOB_OSPEED &= 0x00000000;
GPIOB_OSPEED |= (<<); GPIOB_PUPDR &= 0x00000000;
GPIOB_PUPDR |= (<<); GPIOB_ODR &=~(<<); #elif 0
RCC->AHB1ENR |= (<<); GPIOB->MODER &= 0x00000000;
GPIOB->MODER |= (<<); GPIOB->OTTYPE &= 0x00000000; GPIOB->OSPEED &= 0x00000000;
GPIOB->OSPEED |= (<<); GPIOB->PUPDR &= 0x00000000;
GPIOB->PUPDR |= (<<); GPIOB->ODR &=~(<<);
//GPIOB->BSRR |=(1<<1); #elif 1
RCC->AHB1ENR |= (<<); GPIOB->MODER &= 0x00000000;
GPIOB->MODER |= (<<); GPIOB->OTTYPE &= 0x00000000; GPIOB->OSPEED &= 0x00000000;
GPIOB->OSPEED |= (<<); GPIOB->PUPDR &= 0x00000000;
GPIOB->PUPDR |= (<<); //GPIO_SetBits( GPIOB,GPIO_Pin_1);
GPIO_ResetBits(GPIOB,GPIO_Pin_1); #endif } void systeminit(void) //骗过编译器不会报错
{ }

C语言知识点总结:

*(unsigned int *)   是一个强制类型转换,首先把指针强制转换成(unsigned int*)型,然后再取值,比如 int *addr,那么就需要强制转换,因为有的编译器编译会有警告,如果加上(unsigned int *),警告就会消失

注意:

  1. 其中.h文件之中需要对H文件进行一个判定,看是否已经定义过.H 文件,这部分代码不能出现在.c文件之中,我就不知怎么的写进去了,结果各种错误啊啊啊
  2. 在编写代码的过程之中一定要注意括号的使用,使用过多也会出现各种的错误哦。

STM32F4 阿波罗寄存器 进阶版LED灯的更多相关文章

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

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

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

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

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

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

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

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

  5. 单片机学习(二)开发板LED灯的控制

    目录 开发板上LED灯相关的电路图 点灯 LED闪烁 LED流水灯 其他效果 灯光二进制计数器 进阶版流水灯 开发板上LED灯相关的电路图 这是P2相关7个引脚的电路图,在默认情况下它是直接接着VCC ...

  6. C语言版——点亮LED灯,深入到栈

    在上一篇进行了汇编语言的编写之后,我们采用C语言来编写程序,毕竟C语言才是我们使用最多的语言. 仅仅是点亮LED灯显然太过于简单,我们需要分析最后的反汇编,了解函数调用栈,深入C语言骨髓去分析代码,并 ...

  7. 51单片机学习笔记(郭天祥版)(1)——单片机基础和点亮LED灯

    关于单片机型号的介绍: STC89C52RC40C-PDIP 0721CV4336..... STC:STC公司 89:89系列 C:COMS 52(还有51,54,55,58,516,):2表示存储 ...

  8. 进阶之路(基础篇) - 001 亮一个led灯

    /********************************* 代码功能:点亮一个led灯 使用函数: pinMode(引脚号,模式); digitalWrite(引脚号,电平状态); //默认 ...

  9. 玩转X-CTR100 l STM32F4 l WS2812全彩LED灯

    更多塔克创新资讯欢迎登陆[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      WS2812B RGB全彩LED灯珠,只需通过一根信号线控制多个 ...

随机推荐

  1. 卖饲料——单调队列优化dp

    题目描述 约翰开车来到镇上,他要带K吨饲料回家.运送饲料是需要花钱的,如果他的车上有X吨饲料,每公里就要花费X^2元,开车D公里就需要D* X^2元.约翰可以从N家商店购买饲料,所有商店都在一个坐标轴 ...

  2. Python 基础 装饰器

    今天把学过的装饰器的知识进行回顾一下,说到装饰器,第一反应就是这个东西呢就是用来装逼的,为啥这样说呢,是应为没有这个东西照样可以干活,大部分工作都是可以做的,不管咋样还是把学过的装逼器梳理一下吧. 一 ...

  3. Java设计模式之单利模式(Singleton)

    单利模式的应用场景: 单利模式(Singleton Pattern)是指确保一个类在任何情况下都绝对只有一个实例.并提供一个全局反访问点.单利模式是创建型模式.单利模式在生活中应用也很广泛,比如公司C ...

  4. 使用火狐浏览器模仿手机浏览器,附浏览器HTTP_USER_AGENT汇总

    HTTP_USER_AGENT用来获取浏览页面的访问者在用什么操作系统(包括版本号)浏览器(包括版本号)和用户个人偏好. 改变浏览器的这个参数就可以伪装成相应的浏览器. User Agent Swit ...

  5. CSS(7)--- 通俗讲解清除浮动

    CSS(7)--- 通俗讲解清除浮动 上一篇讲了CSS浮动 博客地址:CSS(6)---通俗讲解浮动(float) 一.理解清除浮动 1.为什么要清除浮动 我们前面说过,浮动本质是用来做一些文字混排效 ...

  6. nuxt.js 注册全局组件

    plugins 属性配置 src: String (文件的路径) ssr: Boolean (默认为 true) 如果值为 false,该文件只会在客户端被打包引入. 根目录找到 nuxt.confi ...

  7. 记录一次在Github写博客时的报错和解决方法

    前几天刚刚搭建好了Github博客,打算用作记录Go语言学习笔记.由于在此前我没有使用过markdown语法写过博客,所以跟着文档了解了格式就想试试, 发表第一篇博客.markdown编辑器我用的是T ...

  8. nyoj 125-盗梦空间 (数学ans += temp * 60 * pow(0.05, cnt))

    125-盗梦空间 内存限制:64MB 时间限制:3000ms 特判: No 通过数:8 提交数:10 难度:2 题目描述: <盗梦空间>是一部精彩的影片,在这部电影里,Cobb等人可以进入 ...

  9. 堡垒机的核心武器:WebSSH录像实现

    WebSSH终端录像的实现终于来了 前边写了两篇文章『Asciinema:你的所有操作都将被录制』和『Asciinema文章勘误及Web端使用介绍』深入介绍了终端录制工具Asciinema,我们已经可 ...

  10. 力扣(LeetCode)第一个错误的版本 个人题解

    你是产品经理,目前正在带领一个团队开发新的产品.不幸的是,你的产品的最新版本没有通过质量检测.由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的. 假设你有 n 个版本 [1, ...