(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的位带操作,那时候只是知道位带是啥,用来干嘛用,说句心里话,并没有深入去学习,知其然而不知其所以然.但一直在心中存在疑惑,故今日便仔细看了一下,写下心得供日后参 ...
随机推荐
- Map<String,String>转Json转Base64
Map<String,String> configMap = new HashMap<String,String>();System.out.println("JSO ...
- PostgreSQL-PL/pgSQL控制结构
PL/pgSQL的控制结构是最重要及最有用的一部分了,在实际工作场景都离不开业务处理逻辑,在写PL/pgSQL时,利用控制结构来操作数据.PL/pgSQL支持的控制结构与其他语言几乎差不多,比如:条件 ...
- Python:PIL(一)——简介
学习总结自:PIL官方文档 PIL(Python Image Library)是Python的一个图像处理库. 1.简介 PIL库中最重要的类是Image ①从文件中加载Image--open方法 f ...
- Seastar 教程(二)
协程 注意:协程需要 C++20 和支持的编译器.已知 Clang 10 及更高版本可以工作. 使用 Seastar 编写高效异步代码的最简单方法是使用协程.协程没有传统continuation(如下 ...
- LeetCode-099-恢复二叉搜索树
恢复二叉搜索树 题目描述:给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换.请在不改变其结构的情况下,恢复这棵树. 进阶:使用 O(n) 空间复杂度的解法很容易实现.你能想出一个只使用 ...
- C#更新packages
有时重新clone代码到本地时,会出现references中引用的包报错,这时可以重新更新下载这些包: 在VS工具栏中,Tools→NuGet Package Manager→Package Mana ...
- petite-vue源码剖析-双向绑定`v-model`的工作原理
前言 双向绑定v-model不仅仅是对可编辑HTML元素(select, input, textarea和附带[contenteditable=true])同时附加v-bind和v-on,而且还能利用 ...
- Nginx解决跨域问题No 'Access-Control-Allow-Origin'
使用nginx在server块下的location块下为请求添加请求头来解决跨域 add_header 'Access-Control-Allow-Origin' '*'; add_header 'A ...
- 完全激活win server 2012的方法(亲测可行!)
1.从微软官网下载评估版. 2.运行->CMD(最好以管理员身份运行)->输入"DISM /online /Get-CurrentEdition"(最好直接复制粘贴,然 ...
- 13、mysql锁
mysql锁 事务的隔离性是通过锁来实现的.为保证数据的一致性,需要锁对并发事务操作进行控制.同时锁机制也为实现MySQL的各个隔离级别提供了保证. mysql并发事务访问相同的记录会出现什么问题(在 ...