3. GD32F103C8T6 GPIO的位带操作
属于Contex M3 M4的内核有1M个区域的RAM和一个1M区域的外设地址可以实现位带操作
1.Contex M3 权威手册的说明
支持位带操作的两个内存区的范围是:
0x2000_0000‐0x200F_FFFF(SRAM 区中的
0x4000_0000‐0x400F_FFFF(片上外设区中的最低 1MB)
对 SRAM 位带区的某个比特,记它所在字节地址为 A,位序号在别名区的地址为:
对于片上外设位带区的某个比特,记它所在字节的地址为 A,位序号为 n(0<=n<=7),则该比特
在别名区的地址为:
上式中,“*4”表示一个字为 4 个字节,“*8”表示一个字节中有 8 个比特。
2.GD32数据手册的说明
3.实现GPIO的位带操作核心头文件
#ifndef __SYS_H
#define __SYS_H
#include "gd32f10x.h"/*
支持位带操作的两个内存区的范围是:
0x2000_0000‐0x200F_FFFF(SRAM 区中的
0x4000_0000‐0x400F_FFFF(片上外设区中的最低 1MB)具体实现思想,参考<<CM3权威指南>>第五章(87页~92页).M4同M3类似,只是寄存器地址变了.*/
//IO口操作宏定义
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
//IO口地址映射
#define GPIOA_ODR_Addr (GPIOA+12) //0X4001080C=0x40010000U+0x00000800U+C
#define GPIOB_ODR_Addr (GPIOB+12) //0X40010C0C =0x40010000U+0x00000800U+400
#define GPIOC_ODR_Addr (GPIOC+12) //0x4001 100C
#define GPIOD_ODR_Addr (GPIOD+12) //0x4001 140C
#define GPIOE_ODR_Addr (GPIOE+12) //0x4001 180C
#define GPIOF_ODR_Addr (GPIOF+12) //0x4001 1C0C
#define GPIOG_ODR_Addr (GPIOG+12) //0x4001 200C #define GPIOA_IDR_Addr (GPIOA+8) //0X40010808
#define GPIOB_IDR_Addr (GPIOB+8) //0X40010C08
#define GPIOC_IDR_Addr (GPIOC+8) //0x4001 1008
#define GPIOD_IDR_Addr (GPIOD+8) //0x4001 1408
#define GPIOE_IDR_Addr (GPIOE+8) //0x4001 1408
#define GPIOF_IDR_Addr (GPIOF+8) //0x4001 1C08
#define GPIOG_IDR_Addr (GPIOG+8) //0x4001 2008 //IO口操作,只对单一的IO口!
//确保n的值小于16!
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入 #define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入 #define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //输出
#define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //输入 #define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //输出
#define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //输入 #define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //输出
#define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //输入#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //输出
#define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //输入#define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //输出
#define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //输入#define PHout(n) BIT_ADDR(GPIOH_ODR_Addr,n) //输出
#define PHin(n) BIT_ADDR(GPIOH_IDR_Addr,n) //输入#define PIout(n) BIT_ADDR(GPIOI_ODR_Addr,n) //输出
#define PIin(n) BIT_ADDR(GPIOI_IDR_Addr,n) //输入#endif
4. 使用例子
#include "gd32f10x.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "string.h"
#include "bsp_uart.h"
#include "gd32f103c_sys.h"#define LED0 PBout(13)
#define LED1 PBout(14)
#define LED2 PBout(15)
#define LED3 PAout(8)
int main(void)
{/* 配置系统时钟 */ systick_config();//设置中断分组nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);/* gpio时钟使能*/rcu_periph_clock_enable(RCU_GPIOB);rcu_periph_clock_enable(RCU_GPIOA);// LED gpio 初始化gpio_init(GPIOB,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);gpio_init(GPIOA,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_8);//串口初始化usart_config();int x=100;uint8_t flag=0;while(1){delay_1ms(500);LED0=!LED0;}
}
3. GD32F103C8T6 GPIO的位带操作相关推荐
- STM32开发项目:GPIO的位带操作
目录 背景介绍 GPIO位带操作的实现 使用指南 背景介绍 位操作就是可以单独的对一个比特位读和写,这个在 51 单片机中非常常见.51 单片机中通过关键字 sbit 来实现位定义,STM32-M3, ...
- 【STM32】标准库与HAL库对照学习教程六--位带操作
[STM32]标准库与HAL库对照学习教程六--位带操作 一.前言 二.准备工作 三.位带介绍 1.位带操作 2.STM32位带及位带别名区域 四.位带区与位带别名区地址转换 五.GPIO的位带操作 ...
- STM32(五)------GPIO位带操作
GPIO位带操作 介绍 位带简介 外设位带区 SRAM位带区 位带区和位带别名区地址转换 GPIO 位带操作 代码解析 GPIO 寄存器映射 GPIO位操作 主函数 介绍 位带简介 位操作就是可以单独 ...
- STM32笔记 GPIO介绍及IO口操作 STM32F0 利用C语言位域实现仿位带操作
文章目录 GPIO简介 工作方式 相关寄存器介绍 IO 操作步骤 IO口三种操作细解 附录:C语言相关 偏移地址与绝对地址 GPIO简介 GPIO:每个连接到I/O总线上的设备都有自己的I/O地址集, ...
- STM32的位带操作
1. 什么是位带操作? 学习 51 单片机的时候就使用过位操作,通过关键字 sbit 对单片机IO口进行位定义.但STM32没有这样的关键字,于是便要通过访问位带别名区的方式来实现.即:将每一位膨胀成 ...
- 关于CM3/CM4位带操作的总结
1.位带操作定义 STM32的存储器映射中的内存区域和外设区域有一段地址空间(都是最低1MB)是位带区域,跟这个区域相对应的有一段位带别名区域,位带别名区的大小是位带区的32倍,位带别名区的每一个地址 ...
- 01、【正点原子】sys.c、sys.h位带操作的简单应用
目录 一.前言 二.个人理解 三.代码呈现 一.前言 由于本人跟着江科大自化协学习stm32c8t6最小系统板,在浏览其他人代码的时候,发现大佬都喜欢使用位带操作,通过正点原子官方视频学习之后,发现这 ...
- CubeMx笔记 -- IIC(位带操作实现)+ IO拓展
文章目录 1.理论基础 1.1.物理层特点 1.2.通信过程 1.3.IIC架构 2.工程建立(硬件iic) 2.1.配置步骤 2.2.cubemx具体配置 3.应用(软件iic) 3.1.原理图 3 ...
- 我对位带操作的新认识
接触STM32快一年了,前段时间才偶尔听到一个叫位带操作的概念... 惭愧惭愧 经过查阅前辈们的经验和相关资料,有了点认识在此记录一下,有不正确的地方请多多指教 /****************** ...
最新文章
- 软件测试_单元测试反模式,完整列表
- UA MATH636 信息论7 高斯信道简介
- Windows下LaTeX安装及使用,使用VS Code改善LaTeX编辑环境
- php下载文件代码 数据库,PHP备份数据库生成SQL文件并下载的函数代码
- JAVA中 fastjson判断JSONObject是否为空,方法isEmpty()
- JavaScript 面向对象编程(二) —— 构造函数 / 原型 / 继承 / ES5 新增方法
- 杭电1799循环多少次?
- python遇到异常跳过_教你使用Python遇到的异常的处理方式!
- autocad ios 虚线_autocad中画箭头、虚线绘制方法介绍
- 会员积分兑换系统的基础运营
- 计算机的英语歌,好听的英文歌,该怎么解决
- java编程自学教程笔记,大量教程
- C++中fstream 的使用一
- Centos8安装NodeJs-16
- @Value的用法及(“#{}“)与@Value(“${}“)的区别
- position的absolute与fixed共同点与不同点
- 干货|五分钟轻松入门眼动实验软件之Tobii Pro Lab
- 人工智能有哪些应用场景?AI可以用来做什么?人工智能用途
- 【转】正确的硬盘分区方式
- 提示“Your session has expired. Please log in.” 解决办法
热门文章
- mysql时间正确时区错误_在app中的日期时间但在mysql [时区]错误
- python将一个文件的内容写入另一个文件_Python3中如何将文件中两个关键词中的信息写入到另一文件?...
- oracle导入导出还原,Oracle 备份 还原 数据库 导入导出
- ajax 请求成功 再执行javascript,jquery中ajax请求后台数据成功后既不执行success也不执行error的完美解决方法...
- 浪潮信息边缘服务器m5多少钱,浪潮边缘计算服务器NE5260M5发布!最高性能可达每秒70万亿次...
- 鸿蒙硬件HI3861-I2C-MCP23017
- Ubuntu18.04搭建Web服务器
- linux5.5 分辨率,Linux Kernel 5.5 正式发布
- java远程执行功能_Java远程连接Linux服务器并执行命令及上传文件功能
- Kubernetes架构及相关服务详解