(stm32学习总结)—GPIO位带操作
本章参考资料:《STM32F10X-中文参考手册》存储器和总线构架章节、GPIO 章节,《CM3 权威指南 CnR2》存储器系统章节。
位带简介
外设位带区
SRAM 位带区
位带区和位带别名区地址转换
外设位带别名区地址
SRAM 位带别名区地址
统一公式
|
1
2
3
4
|
1 // 把一个地址转换成一个指针2 #define MEM_ADDR(addr) *((volatile unsigned long *)(addr))3 // 把位带别名区地址转换成指针4 #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum)) |
位带操作的优点
GPIO 位带操作
1 //IO口地址映射
2 #define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C
3 #define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C
4 #define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C
5 #define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C
6 #define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C
7 #define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C
8 #define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C
9
10 #define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808
11 #define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08
12 #define GPIOC_IDR_Addr (GPIOC_BASE+8) //0x40011008
13 #define GPIOD_IDR_Addr (GPIOD_BASE+8) //0x40011408
14 #define GPIOE_IDR_Addr (GPIOE_BASE+8) //0x40011808
15 #define GPIOF_IDR_Addr (GPIOF_BASE+8) //0x40011A08
16 #define GPIOG_IDR_Addr (GPIOG_BASE+8) //0x40011E08
GPIO 位操作
1 //IO口操作,只对单一的IO口!
2 //确保n的值小于16!
3 #define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出
4 #define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入
5
6 #define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出
7 #define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入
8
9 #define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //输出
10 #define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //输入
11
12 #define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //输出
13 #define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //输入
14
15 #define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //输出
16 #define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //输入
17
18 #define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //输出
19 #define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //输入
20
21 #define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //输出
22 #define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //输入
将上面的代码整理
1 #ifndef _system_H
2 #define _system_H
3
4
5 #include "stm32f10x.h"
6
7
8 //位带操作,实现51类似的GPIO控制功能
9 //具体实现思想,参考<<CM3权威指南>>第五章(87页~92页).
10 //IO口操作宏定义
11 #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
12 #define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
13 #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
14 //IO口地址映射
15 #define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C
16 #define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C
17 #define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C
18 #define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C
19 #define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C
20 #define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C
21 #define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C
22
23 #define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808
24 #define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08
25 #define GPIOC_IDR_Addr (GPIOC_BASE+8) //0x40011008
26 #define GPIOD_IDR_Addr (GPIOD_BASE+8) //0x40011408
27 #define GPIOE_IDR_Addr (GPIOE_BASE+8) //0x40011808
28 #define GPIOF_IDR_Addr (GPIOF_BASE+8) //0x40011A08
29 #define GPIOG_IDR_Addr (GPIOG_BASE+8) //0x40011E08
30
31 //IO口操作,只对单一的IO口!
32 //确保n的值小于16!
33 #define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出
34 #define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入
35
36 #define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出
37 #define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入
38
39 #define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //输出
40 #define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //输入
41
42 #define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //输出
43 #define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //输入
44
45 #define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //输出
46 #define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //输入
47
48 #define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //输出
49 #define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //输入
50
51 #define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //输出
52 #define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //输入
53
54
55 #endif
主函数
1 #include "system.h"
2 #include "led.h"
3
4
5 /*******************************************************************************
6 * 函 数 名 : delay
7 * 函数功能 : 延时函数,通过while循环占用CPU,达到延时功能
8 * 输 入 : i
9 * 输 出 : 无
10 *******************************************************************************/
11 void delay(u32 i)
12 {
13 while(i--);
14 }
15
16 /*******************************************************************************
17 * 函 数 名 : main
18 * 函数功能 : 主函数
19 * 输 入 : 无
20 * 输 出 : 无
21 *******************************************************************************/
22 int main()
23 {
24 LED_Init();
25 while(1)
26 {
27 led1=!led1;
28 delay(6000000);
29 }
30 }
(stm32学习总结)—GPIO位带操作的更多相关文章
- GPIO—位带操作
GPIO—位带操作本章参考资料:< STM32F4xx 中文参考手册>存储器和总线构架章节. GPIO 章节,< Cortex®-M4 内核编程手册> 2.2.5 Bit-ba ...
- 第13章 GPIO—位带操作
第13章 GPIO—位带操作 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...
- 玩转X-CTR100 | STM32F4 l GPIO位带操作
更多塔克创新资讯欢迎登陆[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] STM32F4位带概念,及位带的GPIO操作实践应用. 原理介 ...
- GPIO位带操作点亮LED,且使用按键控制开关
1. 项目 类似与C51单片机的位操作使能引脚来点亮LED. 例如,sbit P0^0 = 0 LED1 = P0^0; 2. 代码 main.c #include "stm32f10x.h ...
- STM32位带操作总结---浅显易懂
正在准备做毕业设计,配置LED_Config()的时候,又看到了位带操作的宏定义,我又嘀咕了,什么是位带操作,一年前在使用位带操作的时候,就查阅过好多资料,Core-M3也看过,但是对于博主这种“低能 ...
- 【ARM】---STM32位带操作总结---浅显易懂
正在准备做毕业设计,配置LED_Config()的时候,又看到了位带操作的宏定义,我又嘀咕了,什么是位带操作,一年前在使用位带操作的时候,就查阅过好多资料,Core-M3也看过,但是对于博主这种“低能 ...
- 玩转X-CTR100 l STM32F4 l 基础例程printf、LED、蜂鸣器、拨码开关、位带操作
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器基础板载资源 ...
- STM32之GPIO端口位带操作
#ifndef __SYS_H #define __SYS_H #include "stm32f10x.h" //位带操作 //把“位带地址+位序号”转换别名地址宏 #define ...
- 关于STM32位带操作随笔
以前在学习STM32时候关注过STM32的位带操作,那时候只是知道位带是啥,用来干嘛用,说句心里话,并没有深入去学习,知其然而不知其所以然.但一直在心中存在疑惑,故今日便仔细看了一下,写下心得供日后参 ...
随机推荐
- mapreduce类型对应
public class OrderBean implements WritableComparable<OrderBean> { private Integer order_id; // ...
- 什么是NFT?
我有一个年轻朋友,最近买了一个数字艺术品,9百多入手,几周后卖掉,赚了7万多,他告诉我这个东西叫NFT. 2021年twitter创始人杰克.多西将自己发布的第一条twitter通过NFT以250万美 ...
- c语言刷lleetcode记录
155. 最小栈 笔记: 在push(压栈)的时候思路: typedef struct MinStack{ int data; struct MinStack *next; } MinStack; / ...
- 『现学现忘』Docker相关概念 — 2、云计算的服务模式
目录 1.最底层的,就是IaaS 2.再往上,就是PaaS 3.继续往上,就是SaaS 4.IaaS.SaaS.PaaS三者之间的关系 上一篇文章详细介绍了什么是云计算: 云是一种服务,可以像使用水. ...
- 8.Flink实时项目之CEP计算访客跳出
1.访客跳出明细介绍 首先要识别哪些是跳出行为,要把这些跳出的访客最后一个访问的页面识别出来.那么就要抓住几个特征: 该页面是用户近期访问的第一个页面,这个可以通过该页面是否有上一个页面(last_p ...
- redis存储token
redis存储token 欢迎关注博主公众号「Java大师」, 专注于分享Java领域干货文章http://www.javaman.cn/sb2/redis-token 在实际开发中,token需要保 ...
- php 命名规范
- tp5 缩略图自写
1:php终端 安装扩展 使用Composer安装ThinkPHP5的图像处理类库: composer require topthink/think-image2:控制器代码: public func ...
- Control Flow in Tensorflow TF中的控制流解析
写在前面 本文翻译自Tensorflow团队的文章Tensorflow Control Flow Implementation,部分内容加入了笔者自己的理解,如有不妥之处还望各位指教. 目录 概览 控 ...
- yum源出现 AppStream‘ 缓存失败,忽略这个 repo。同步仓库 ‘base‘ 缓存失败,忽略这个 repo 的问题解决办法
今天安装Wget时出现如下错误 到 /etc/yum.repos.d/目录下编辑CentOS-Base.repo ,更改为如下内容. vim CentOS-Base.repo # CentOS-Bas ...