(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的位带操作,那时候只是知道位带是啥,用来干嘛用,说句心里话,并没有深入去学习,知其然而不知其所以然.但一直在心中存在疑惑,故今日便仔细看了一下,写下心得供日后参 ...
随机推荐
- SpreadJS + GcExcel 一出,谁与争锋!全栈表格技术轻松应对复杂公式计算场景(一)
设计思路篇 Excel是我们日常办公中最常用的电子表格程序,不仅可满足报表数据的计算需求,还可提供绘图.数据透视分析.BI和Visual Basic for Applications (VBA)宏语言 ...
- Consul学习笔记(详细)
常见的注册中心: Netflix Eureka Alibaba Nacos HashiCorp Consul Apache Zookeeper CoreOS Etcd CNCF CoreDNS 介绍 ...
- csv/json/list/datatable导出为excel的通用模块设计
导出excel的场景我一般都是一个List直接导出成一张sheet,用Npoi.Mapper库很方便,最近我经常是需要将接口返回的jsonarray转成一张excel表,比如从elasticsearc ...
- 关于Cookie的一些小饼干
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOEx ...
- 假如让你来设计SSL/TLS协议,你要怎么设计呢?
摘要:本文将从设计者的视角介绍如何一步步设计出一个简易版的 SSL/TLS 的过程,在文章的最后,再简单介绍 TLS 1.2 版本的工作机制,以此帮助大家对 SSL/TLS 协议的基本原理有一个更深入 ...
- 研发管理平台DevOps使用流程
研发管理平台DevOps使用流程:一.注册开发者账号二.登录平台三.点击:我的项目-内部项目三.点击"发布内部项目",创建项目五.进入项目六.研发管理平台研发管理平台的功能包括:可 ...
- Java运算符 算术运算法
运算符 算术运算法:+,-,*,/,%,++,– 复制运算符:= 关系运算符:>,<,>=,<=,==,!= instanceof 逻辑运算符:&&,||,! ...
- 使用数据库、Redis、ZK分别实现分布式锁!
分布式锁三种实现方式: 基于数据库实现分布式锁: 基于缓存(Redis等)实现分布式锁: 基于Zookeeper实现分布式锁: 基于数据库实现分布式锁 悲观锁 利用select - where - f ...
- JavaWeb 08_JSP+Dao+Bean+Servlet 实现登录注册(连接数据库,验证码登录,两周内免登陆等功能)
一.数据库db_01 表usert 字段username,password 二. 目录 三. 配置信息 四. 代码 index.jsp <script type="text/j ...
- Kubernetes 使用kubeadm创建集群
镜像下载.域名解析.时间同步请点击 阿里巴巴开源镜像站 实践环境 CentOS-7-x86_64-DVD-1810 Docker 19.03.9 Kubernetes version: v1.20.5 ...