第一种:指针形式

led.c文件:#include "led.h"
#include "stm32f4xx.h"
void LED_Init(void)
{//1左移五位既是将第五位置为1,查寄存器可知1是使能0失能RCC->AHB1ENR|= 1<<5;//使能RCC的AHB1时钟//PF9 的GPIO配置//将(1 1)左移18位再取反清零:2代表两位控制一IO,因为IO是F9,所以最后是~(3<<2*9),达到清零效果GPIOF->MODER &= ~(3<<2*9);//配置为0用&,配置为1用 | GPIOF->MODER |= 1<<(2*9);//1既是0 1,代表输出模式(查寄存器)GPIOF->OSPEEDR &= ~(3<<2*9);//同理,清零GPIOF->OSPEEDR |= 2<<(2*9);//2是1 0,将F9设置为50MHZ的速度GPIOF->PUPDR &= ~(3<<2*9);//清零GPIOF->PUPDR |=1<<(2*9);//上拉GPIOF->OTYPER &= ~(1<<9);//清零,该寄存器是低16位有效,1位控制1个IOGPIOF->OTYPER |=0<<9;//置0,既是输出推挽(复位)GPIOF->ODR|= 1<<9;//1 控制高低电平//GPIOF->ODR&=~(1<<9);////PF10         同理配置PF10 GPIOF->MODER &= ~(3<<2*10);GPIOF->MODER |= 1<<(2*10);GPIOF->OSPEEDR &= ~(3<<2*10);GPIOF->OSPEEDR |= 2<<(2*10);GPIOF->PUPDR &= ~(3<<2*10);GPIOF->PUPDR |=1<<(2*10);GPIOF->OTYPER &= ~(1<<10);GPIOF->OTYPER |=0<<10;GPIOF->ODR|= 1<<10;
}
///
led.h文件:
#ifndef __LED_H
#define __LED_Hvoid LED_Init(void);#endif
///main.c文件:#include "stm32f4xx.h"
#include "led.h"
#include "delay.h"int main(void)
{delay_init(168);LED_Init();while(1){GPIOF->ODR&=~(1<<9);GPIOF->ODR&=~(1<<10);delay_ms(500);GPIOF->ODR |= 1<<9;GPIOF->ODR |=1<<10;delay_ms(500);}
}

------------------------------------------------------------------------------------------------------------------

第二种方法:配置基地址开始

// 设置寄存器宏定义
//1、时钟线
#define RCC_AHB1ENR *(volatile unsigned long *)(0x40023800 + 0x30)  // volatile 防止编译器优化 AHB1外设使能时钟线#define GPIOF_MODER *(volatile unsigned long *)(0x40021400 + 0x00)  // GPIOF的模式寄存器
#define GPIOF_OTYPER *(volatile unsigned long *)(0x40021400 + 0x04)  // GPIOF的输出类型寄存器
#define GPIOF_OSPEEDR *(volatile unsigned long *)(0x40021400 + 0x08)  // GPIOF的输出速度寄存器PUPDR
#define GPIOF_PUPDR *(volatile unsigned long *)(0x40021400 + 0x0c)  // GPIOF的上下拉寄存器
#define GPIOF_ODR *(volatile unsigned long *)(0x40021400 + 0x14)  // GPIOF的输出数据寄存器
#define GPIOF_BSRR *(volatile unsigned long *)(0x40021400 + 0x18)  // GPIOF的复位/置位寄存器#define GPIOE_MODER *(volatile unsigned long *)(0x40021000 + 0x00)  // GPIOF的模式寄存器
#define GPIOE_OTYPER *(volatile unsigned long *)(0x40021000 + 0x04)  // GPIOF的输出类型寄存器
#define GPIOE_OSPEEDR *(volatile unsigned long *)(0x40021000 + 0x08)  // GPIOF的输出速度寄存器PUPDR
#define GPIOE_PUPDR *(volatile unsigned long *)(0x40021000 + 0x0c)  // GPIOF的上下拉寄存器
#define GPIOE_ODR *(volatile unsigned long *)(0x40021000 + 0x14)  // GPIOF的输出数据寄存器
#define GPIOE_BSRR *(volatile unsigned long *)(0x40021000 + 0x18)  // GPIOF的复位/置位寄存器// 大概时间的延时函数
void delay(int n)
{while(n--){int i = 1000;while(i--);}
}// 初始化LED
int init_led(void)
{// 2、初始化时钟、寄存器  第5位置1就是使能RCC_AHB1ENR |= 1<<5; //3、配置寄存器各种参数,LED只是输出,所以选择每个参数里面的输出模式// ①初始化GPIOF为输出模式//---------------模式--移动位数GPIOF_MODER &= ~(0x3<<18);   // 清空第18位和19位  11GPIOF_MODER |= 1<<18; // 配置PF9//GPIOF_MODER &= ~(0xF<<18);   // 清空第18位和19位、20位、21位  1111//GPIOF_MODER |= 0x5<<18; // 配置PF9、PF10GPIOF_MODER &= ~(0x3<<20); // 清空第20位、21位   11GPIOF_MODER |= 1<<20;//配置PF10// ②配置GPIOF的输出类型为推挽GPIOF_OTYPER &= ~(0x1<<9);  // 清空第9位GPIOF_OTYPER &= ~(0x1<<10);  // 清空第10位// ③配置GPIOF的输出速度GPIOF_OSPEEDR &= ~(0x3<<18);  // 清空第18位和19位  11GPIOF_OSPEEDR &= ~(0x3<<20);  // 清空第20 21  11GPIOF_OSPEEDR |= 0x2<<18; // 50M速度GPIOF_OSPEEDR |= 0x2<<20; // 50M速度// ④配置 GPIOF为上拉输出GPIOF_PUPDR &= ~(0x3<<18);  // 清空第18位和19位  11GPIOF_PUPDR |= 1<<18; // 配置PF9为上拉输出GPIOF_PUPDR &= ~(0x3<<20);  // 清空第20位和21位  11GPIOF_PUPDR |= 1<<20; // 配置PF10为上拉输出// ⑤输出数据:高电平 1 低电平 0GPIOF_ODR |= 1<<9; // PF的第9个引脚输出高电平GPIOF_ODR |= 1<<10; // PF的第10个引脚输出高电平/*********************************PE脚**************************************/// 初始化时钟 寄存器第4位置1就是使能RCC_AHB1ENR |= 1<<4; //PE脚// 初始化GPIOF为输出模式GPIOE_MODER &= ~(0x3<<26);   // 清空第26位和27\28\29位  11GPIOE_MODER |= 1<<26; // 配置PF9, 1010即是5,可同时配置GPIOE_MODER &= ~(0x3<<28); // 清空第20位、21位   11GPIOE_MODER |= 1<<28;//配置PF10// 配置GPIOF的输出类型为推挽GPIOE_OTYPER &= ~(0x1<<13);  // 清空第9位GPIOE_OTYPER &= ~(0x1<<14);  // 清空第10位// 配置GPIOF的输出速度GPIOE_OSPEEDR &= ~(0x3<<26);  // 清空第18位和19位  11GPIOE_OSPEEDR &= ~(0x3<<28);  // 清空第20 21  11GPIOE_OSPEEDR |= 0x2<<26; // 50M速度GPIOE_OSPEEDR |= 0x2<<28; // 50M速度// 配置 GPIOF为上拉输出GPIOE_PUPDR &= ~(0x3<<26);  // 清空第18位和19位  11GPIOE_PUPDR |= 1<<26; // 配置PF9为上拉输出GPIOE_PUPDR &= ~(0x3<<28);  // 清空第20位和21位  11GPIOE_PUPDR |= 1<<28 ;// 配置PF10为上拉输出// 输出数据:高电平 1 低电平 0GPIOE_ODR |= 1<<13; // PF的第9个引脚输出高电平GPIOE_ODR |= 1<<14; // PF的第10个引脚输出高电平return 0;
}int main(void)
{// 初始化LEDinit_led();while (1){// 点亮LED0GPIOF_ODR &= ~(1<<9); // PF的第9个引脚输出低电平delay(2000);GPIOF_ODR |= 1<<9;delay(2000);// 输出数据:高电平 1 低电平 0GPIOF_ODR &= ~(1<<10);delay(2000);GPIOF_ODR |= 1<<10; // PF的第9个引脚输出高电平 delay(2000);GPIOE_ODR &= ~(1<<13);delay(2000);GPIOE_ODR |= 1<<13; // PE的第13、14个引脚输出高电平delay(2000);GPIOE_ODR &= ~(1<<14);delay(2000);GPIOE_ODR |= 1<<14;delay(2000); }
}

两者的区别在于一个需要配置基地址,一个直接用指针对寄存器进行操作,那怎样配置基地址,下面解释一下:

1、根据STM32F4xx中文参考手册的2.3节存储器的映射找到对应总线、外设的边界基地址,我这里只截了部分图,仅供参考

2、找到对应寄存器的偏移地址,在STM32F4xx中文参考手册7.4节

配置后如下所示:

2、最后对应寄存器进行对其位移操作即可(寄存器映射),可参考上面的代码


总结:这里以一个简单的LED闪烁来了解对寄存器进行具体的操作,使自己能够用寄存器来进行项目的开发,其他的外设配置是一样的原理。

4.3、使用寄存器版本点亮LED灯(内附代码)相关推荐

  1. STM32F103寄存器方式点亮LED流水灯

    实验要求:以 STM32最小系统核心板(STM32F103C8T6)+面板板+3只红绿蓝LED 搭建电路,使用GPIOB.GPIOC.GPIOD这3个端口控制LED灯,轮流闪烁,间隔时长1秒.1)写出 ...

  2. 使用STM32f103点亮led灯——库函数版本

    本文章是结合我这一年的学习与应用,总结出来的经验与知识(主要为了应用),欢迎读者们学习和指导. 前言 资料 : 链接:https://pan.baidu.com/s/1pr57NSXFmax06kqP ...

  3. STM32F03寄存器方式点亮LED流水灯

    STM32F03寄存器方式点亮LED流水灯 文章目录 STM32F03寄存器方式点亮LED流水灯 一.题目内容 二.STM32F03系列芯片的地址映射和寄存器映射映射原理:了解GPIO端口的初始化设置 ...

  4. STM32C8T6之使用寄存器点亮LED灯

    这几天肺炎闹得沸沸扬扬,我窝在家里学习STM32.这篇博客筹备了3-4天吧,终于完成了. 实验电路如下图所示: 这里以PC13为例. 用寄存器点亮LED灯,主要就是操作GPIOx_ODR寄存器,GPI ...

  5. 一灯大师,基于imx6ull点亮LED灯

    一.imx6ull GPIO原理 1. STM32 GPIO回顾 我们一般拿到一款全新的芯片,第一个要做的事情的就是驱动其 GPIO,控制其 GPIO 输出高低电平,我们学习 I.MX6U 也一样的, ...

  6. 第5章 用树莓派点亮LED灯

    用树莓派点亮一个LED灯是非常简单的事情,但却非常重要,是利用GPIO控制外部硬件设备的基础,机器人的大部分功能都可以通过操纵GPIO来实现的.换句话说,能控制一个LED灯,就能让机器人动起来.本章将 ...

  7. STM32F 103C8T6开发板 点亮LED灯

    每组IO口含下面7个寄存器.7个寄存器可以控制一组GPIO的16个IO口. GPIOx_CRL:端口配置低寄存器 GPIOx_CRH:端口配置高寄存器 GPIOx_IDR:端口输入寄存器 GPIOx_ ...

  8. Raspberry PI 系列 —— 裸机点亮LED灯

    Raspberry PI 系列 -- 裸机点亮LED灯 背景 近期刚买了Raspberry PI B+,配置执行了官方提供的Raspbian系统,折腾了一周Linux系统,感觉没啥意思,于是就试着想了 ...

  9. STM8学习笔记---点亮LED灯

    对单片机操作时一般有三个步骤,1.系统时钟选择.2.单片机外设初始化.3主程序编写. 同样要点亮LED灯时,也要按照这个步骤来. 首先选择系统时钟,打开STM8S中文参考手册,找到时钟寄存器 可以看到 ...

最新文章

  1. 程序员感悟----路该怎么走
  2. 赠书 | 图解机器学习算法,看这文就够了!
  3. ACM-ICPC 2018 南京赛区网络预赛
  4. 对当前JAVA流行框架的一些小感悟
  5. mstsc /console超出最大允许连接数(远程桌面不能连接)解决方法
  6. 多图 | 4人4天攻占10国榜首,只因有此神器……(文末高能预警)
  7. 图结构练习——BFSDFS——判断可达性
  8. CCF 2018-9-2买菜
  9. docker安装gamit_ubuntun10.10中安装gamit 10.40
  10. linux添加终端快捷键,linux 终端快捷键
  11. 组态王如何让计算机关机,组态王软件系统登陆与退出.doc
  12. SpringBoot 实现业务校验,这种方式才叫优雅!
  13. C/C++整数除法以及保留小数位的问题
  14. 使用聚合数据接口发送短信
  15. 简述相关分析(Correlation)
  16. option标签的默认值设置
  17. Cocoa: keyEquivalent(NSXXFunctionKey) modifierFlags
  18. 1121. Damn Single
  19. Java小练习--马戏团节目管理系统开发
  20. 关于SVN安装目录下,没有svn.exe程序的解决

热门文章

  1. jquery里用正则来验证密码,必须包含大小写字母,数字及特殊符号,或最少包含两种
  2. 2021年T电梯修理考试题及T电梯修理考试试卷
  3. DenseNet发明者黄高:动态模型好在哪里?
  4. 数据可视化分析教学课件——FineBI实验册节选====校园一卡通消费分析
  5. 查看固态硬盘写入量 CrystalDiskInfo 查看机械盘信息
  6. java 通知模式_设计模式:通知系统
  7. han_spring_new
  8. 犀思云—混合云基础设施解决方案市场研究分析
  9. 【谢源评体系结构顶会 MICRO 2016】神经网络加速器仍是热点,但图计算加速器夺最佳论文(下载)...
  10. 认识有刷电机 / 无刷电机 / 交流电机 / 直流电机