设为首页收藏本站

嵌入式天空

 找回密码
 我要注册

扫一扫,访问微社区

最近看过此主题的会员

查看: 1605|回复: 0

led控制程序之寄存器定义

[复制链接]

37

主题

74

帖子

1300

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1300
QQ
发表于 2017-6-27 15:10:05 | 显示全部楼层 |阅读模式
本帖最后由 zack 于 2017-6-27 15:19 编辑

led控制程序之寄存器定义

作者:北京尚观科技·张伟
1>我们用代码来具体实现一下操作寄存器
1.我们先来看以下电路图,看看GPIO上连接了哪些设备,我们来控制一下
打开<STM32课程SDK\开发板原理图>目录中的.pdf文件
第一页画的是STM32F407用的芯片
第二页画的是电源
第三页以及后续画的是外部设备
我们来找一下LED灯<P3>
07led电路图_1.png
                在上图中我们找到Relay_CNT1\Relay_CNT4\Relay_CNT5分别控制3个LED小灯
                所以我们应该在原理图中找到这三个标号分别由哪些GPIO管脚来控制
07led电路图_2.png
                我们通过原理图的查找,找到了我们控制LED小灯的GPIO管脚分别是
                LED0GPIOE组的第3个管脚
                LED1GPIOE组的第4个管脚
                LED2GPIOG组的第9个管脚
                接下来我们就可以写程序来进行操作了
                我们之前说过在开发STM32时有两种方式
                         1.代码全部自己写:直接操作寄存器
                         2.调用ST官方的固件库
                我们先用寄存器的方式来操作一下LED
                LED0PE3
                LED1PE4
                LED2PG9
               当我们在使用寄存器操作LED时需要有这几个步骤
               应该把PE3\PE4\PG9三个管脚的
                         1.GPIO端口模式寄存器        配制成    通用输出模式
                         2.GPIO端口输出类型寄存器配制成推挽输出
                         3.GPIO端口输出速度寄存器    配制成50 MHz(快速)
                         4.GPIO端口上拉/下拉寄存器   配制成无上拉或下拉
                         5.GPIO端口输出数据寄存器    把相应的管脚的电平拉低
        2.我们在KEIL中来规划一下我们的程序
                有几点需要注意请看下图
07led操作设置寄存器.png
                PE3PE4PG9
                每一组寄存器都有一个基地址
                每一组中的每一个寄存器都有一个偏移量
                基地址从<STM32课程SDK\DataSheet\STM32>中的<STM32F4xx中文参考手册.pdf>P53
                GPIOE0x40021000
                GPIOG0x40021800
                注意在ST公司官方固件中已经帮我们定义好了每一组GPIO的基地址
07led的GPIO宏定义.png
                因为官方给我们定义过宏所以当我们想要使用的时候先包含头文件
                在led.h中包含stm32f4xx.h所以我们直接加自己的寄存器的宏定义
#define GPIOE_MODER(*(volatile unsigned int *)(GPIOE_BASE + 0x00))
#define GPIOE_OTYPER (*(volatile unsigned int *)(GPIOE_BASE + 0x04))
#define GPIOE_OSPEEDR (*(volatile unsigned int *)(GPIOE_BASE + 0x08))
#define GPIOE_PUPDR (*(volatile unsigned int *)(GPIOE_BASE + 0x0C))
#define GPIOE_ODR (*(volatile unsigned int *)(GPIOE_BASE + 0x14))
#define GPIOG_MODER(*(volatile unsigned int *)(GPIOG_BASE + 0x00))
#define GPIOG_OTYPER (*(volatile unsigned int *)(GPIOG_BASE + 0x04))
#define GPIOG_OSPEEDR (*(volatile unsigned int *)(GPIOG_BASE + 0x08))
#define GPIOG_PUPDR (*(volatile unsigned int *)(GPIOG_BASE + 0x0C))
#define GPIOG_ODR (*(volatile unsigned int *)(GPIOG_BASE + 0x14))
07led的函数实现.png
当我们在操作寄存器的时候需要使用位操作
例:把PE3和PE4的GPIO端口模式寄存器配制成<通用输出模式>可以这样来操作
GPIOE_MODER &= ~((3 << 6) | (3 << 8));
GPIOE_MODER |= ((1 << 6) | (1 << 8));
1.因为我们已经把我们所要用到的寄存器都做了宏定义,所以直接使用宏定义GPIOE_MODER
2.因为我们要是用位操作,所以要用到位运算符
3.因为我们的GPIO端口模式寄存器有32位,而且每一位都有效,所以代表2个位表示一个管脚
4.把某1位置1需要把这1位先清0,再置1
5.详细查看数据手册以免配置错误

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

QQ|Archiver|手机版|小黑屋|EBMSKY Inc. ( 冀ICP备17022971号-1  

GMT+8, 2019-5-19 23:34 , Processed in 0.089947 second(s), 41 queries .

Powered by Discuz! X3.2

© 2014-2018 Comsenz Inc. 【嵌入式天空】设计

快速回复 返回顶部 返回列表