属于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的位带操作相关推荐

  1. STM32开发项目:GPIO的位带操作

    目录 背景介绍 GPIO位带操作的实现 使用指南 背景介绍 位操作就是可以单独的对一个比特位读和写,这个在 51 单片机中非常常见.51 单片机中通过关键字 sbit 来实现位定义,STM32-M3, ...

  2. 【STM32】标准库与HAL库对照学习教程六--位带操作

    [STM32]标准库与HAL库对照学习教程六--位带操作 一.前言 二.准备工作 三.位带介绍 1.位带操作 2.STM32位带及位带别名区域 四.位带区与位带别名区地址转换 五.GPIO的位带操作 ...

  3. STM32(五)------GPIO位带操作

    GPIO位带操作 介绍 位带简介 外设位带区 SRAM位带区 位带区和位带别名区地址转换 GPIO 位带操作 代码解析 GPIO 寄存器映射 GPIO位操作 主函数 介绍 位带简介 位操作就是可以单独 ...

  4. STM32笔记 GPIO介绍及IO口操作 STM32F0 利用C语言位域实现仿位带操作

    文章目录 GPIO简介 工作方式 相关寄存器介绍 IO 操作步骤 IO口三种操作细解 附录:C语言相关 偏移地址与绝对地址 GPIO简介 GPIO:每个连接到I/O总线上的设备都有自己的I/O地址集, ...

  5. STM32的位带操作

    1. 什么是位带操作? 学习 51 单片机的时候就使用过位操作,通过关键字 sbit 对单片机IO口进行位定义.但STM32没有这样的关键字,于是便要通过访问位带别名区的方式来实现.即:将每一位膨胀成 ...

  6. 关于CM3/CM4位带操作的总结

    1.位带操作定义 STM32的存储器映射中的内存区域和外设区域有一段地址空间(都是最低1MB)是位带区域,跟这个区域相对应的有一段位带别名区域,位带别名区的大小是位带区的32倍,位带别名区的每一个地址 ...

  7. 01、【正点原子】sys.c、sys.h位带操作的简单应用

    目录 一.前言 二.个人理解 三.代码呈现 一.前言 由于本人跟着江科大自化协学习stm32c8t6最小系统板,在浏览其他人代码的时候,发现大佬都喜欢使用位带操作,通过正点原子官方视频学习之后,发现这 ...

  8. CubeMx笔记 -- IIC(位带操作实现)+ IO拓展

    文章目录 1.理论基础 1.1.物理层特点 1.2.通信过程 1.3.IIC架构 2.工程建立(硬件iic) 2.1.配置步骤 2.2.cubemx具体配置 3.应用(软件iic) 3.1.原理图 3 ...

  9. 我对位带操作的新认识

    接触STM32快一年了,前段时间才偶尔听到一个叫位带操作的概念... 惭愧惭愧 经过查阅前辈们的经验和相关资料,有了点认识在此记录一下,有不正确的地方请多多指教 /****************** ...

最新文章

  1. 软件测试_单元测试反模式,完整列表
  2. UA MATH636 信息论7 高斯信道简介
  3. Windows下LaTeX安装及使用,使用VS Code改善LaTeX编辑环境
  4. php下载文件代码 数据库,PHP备份数据库生成SQL文件并下载的函数代码
  5. JAVA中 fastjson判断JSONObject是否为空,方法isEmpty()
  6. JavaScript 面向对象编程(二) —— 构造函数 / 原型 / 继承 / ES5 新增方法
  7. 杭电1799循环多少次?
  8. python遇到异常跳过_教你使用Python遇到的异常的处理方式!
  9. autocad ios 虚线_autocad中画箭头、虚线绘制方法介绍
  10. 会员积分兑换系统的基础运营
  11. 计算机的英语歌,好听的英文歌,该怎么解决
  12. java编程自学教程笔记,大量教程
  13. C++中fstream 的使用一
  14. Centos8安装NodeJs-16
  15. @Value的用法及(“#{}“)与@Value(“${}“)的区别
  16. position的absolute与fixed共同点与不同点
  17. 干货|五分钟轻松入门眼动实验软件之Tobii Pro Lab
  18. 人工智能有哪些应用场景?AI可以用来做什么?人工智能用途
  19. 【转】正确的硬盘分区方式
  20. 提示“Your session has expired. Please log in.” 解决办法

热门文章

  1. mysql时间正确时区错误_在app中的日期时间但在mysql [时区]错误
  2. python将一个文件的内容写入另一个文件_Python3中如何将文件中两个关键词中的信息写入到另一文件?...
  3. oracle导入导出还原,Oracle 备份 还原 数据库 导入导出
  4. ajax 请求成功 再执行javascript,jquery中ajax请求后台数据成功后既不执行success也不执行error的完美解决方法...
  5. 浪潮信息边缘服务器m5多少钱,浪潮边缘计算服务器NE5260M5发布!最高性能可达每秒70万亿次...
  6. 鸿蒙硬件HI3861-I2C-MCP23017
  7. Ubuntu18.04搭建Web服务器
  8. linux5.5 分辨率,Linux Kernel 5.5 正式发布
  9. java远程执行功能_Java远程连接Linux服务器并执行命令及上传文件功能
  10. Kubernetes架构及相关服务详解