(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的位带操作,那时候只是知道位带是啥,用来干嘛用,说句心里话,并没有深入去学习,知其然而不知其所以然.但一直在心中存在疑惑,故今日便仔细看了一下,写下心得供日后参 ...
随机推荐
- C# init用法
init是什么意思? init就 modreq([System.Runtime]System.Runtime.CompilerServices.IsExternalInit) 类型的缩写 modreq ...
- Pycharm:使用Edit Custom VM Options导致Pycharm无法启动
解决办法: Edit Custom VM Options用来扩大内存,但是内存设置不当可能会导致Pycharm无法启动 如果无法启动,可以在我的文档中的pycharm201X.X(日期不同名字也不同) ...
- JAVA 猜拳游戏
JAVA 猜拳游戏 题目:通过控制台方式实现一个人机对战的猜拳游戏 用户通过输入(0.石头子 1.剪刀 2.布),机器随机生成(0.石头子 1.剪刀 2.布) 要求: 能打印玩家的对局信息,胜利的次数 ...
- LeetCode-026-删除有序数组中的重复项
删除有序数组中的重复项 题目描述:给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度. 不要使用额外的数组空间,你必须在 原地 修改输入数组 ...
- 矩池云安装/修改 cuda、cudnn、nvcc、tensorRT 教程
在整个机器学习的过程中,配置环境一直是一个比较复杂的事情,今天介绍几种根据英伟达官方文档来配置环境的方法. 安装方案 https://gitlab.com/nvidia/container-image ...
- MAT工具分析Dump文件(大对象定位)
前段时间线上服务经常发生卡顿,经过排查发现是大对象引起的Fullgc问题,特此记录排查逻辑. 目录 目的 一.获得服务进程 二.生成dump文件 三.下载mat工具 四.使用mat工具导入第二步生成的 ...
- CF1278F题解
这不是傻逼题吗?????? 考虑到第一张是王牌的概率为 \(\frac{1}{m}\),答案就是: \[\sum_{i=0}^n\binom{n}{i}(\frac{1}{m})^i(1-\frac{ ...
- Java实例变量、局部变量、静态变量
实例变量(成员变量) 成员变量定义在类中,在整个类中都可以被访问,但在方法.构造方法和语句块之外 当一个对象被实例化之后,每个实例变量的值就跟着确定 实例变量在对象创建的时候创建,在对象被销毁时销毁 ...
- OpenMLDB 在线模块架构解析
本文介绍 OpenMLDB 在线模块的架构,欢迎通过以下渠道了解关于 OpenMLDB 的更多信息 GitHub:GitHub - 4paradigm/OpenMLDB: OpenMLDB is an ...
- [SPDK/NVMe存储技术分析]004 - SSD设备的发现
源代码及NVMe协议版本 SPDK : spdk-17.07.1 DPDK : dpdk-17.08 NVMe Spec: 1.2.1 基本分析方法 01 - 到官网http://www.spdk.i ...