(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的位带操作,那时候只是知道位带是啥,用来干嘛用,说句心里话,并没有深入去学习,知其然而不知其所以然.但一直在心中存在疑惑,故今日便仔细看了一下,写下心得供日后参 ...
随机推荐
- Scala学习笔记(详细)
第2章 变量 val,var,声明变量必须初始化:变量类型确定后不可更改 数据类型:与java有相同的数据类型,在scala中数据类型都是对象 特殊类型:Unit:表示无值,只有一个实例值写出(),相 ...
- idea教程--使用mave创建普通java项目
1.点击箭头所示的"Create New Project"选项 2.勾选图示所示的"Create From Archetype"复选框,在下面的下拉选项中我们选 ...
- Android studio第一个程序HelloWorld
今天主要跟着视频设计了第一个安卓项目,了解了大改的目录结构 每天会学习线性布局和相对布局
- Chrome:查看用户代理User-Agent
用户代理(User-Agent)是浏览器客户端与服务器交互时的重要信息之一,用于帮助服务器识别请求用户的浏览器类别,以便于网站发送相应的网页数据. 用户代理数据包括:操作系统标识.加密等级标识和浏览器 ...
- LeetCode-107-二叉树的层序遍历 II
二叉树的层序遍历 II 题目描述:给定一个二叉树,返回其节点值自底向上的层序遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 示例说明请见LeetCode官网. 来源:力扣(Leet ...
- LeetCode-031-下一个排列
下一个排列 题目描述:实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须 原地 修 ...
- Web应用程序自动化测试工具Selenium的主要功能有哪些?
Selenium是一个用于Web应用程序测试的工具.是一个开源的Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium可 ...
- Maven安装与配置——详细教程
一.安装Maven 进入Maven官网,下载安装包(https://maven.apache.org/download.cgi) . 2.下载完成后,解压到某一路径下.本文以C:\Soft\Java\ ...
- jQuery Validatede 结合Ajax 表单验证提交
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 20192204李龙威 2019-2020-2 《Python程序设计》实验三报告
20192204李龙威 2019-2020-2 <Python程序设计>实验三报告 课程:<Python程序设计> 班级: 1922 姓名: 李龙威 学号:20192204 实 ...