STM32之GPIO端口位带操作

#ifndef __SYS_H
#define __SYS_H
#include "stm32f10x.h"

//位带操作
//把“位带地址+位序号”转换别名地址宏
#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)) 

//GPIO输出输入地址映射
#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C
#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C
#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C
#define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C
#define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C
#define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C
#define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C    

#define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808
#define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08
#define GPIOC_IDR_Addr    (GPIOC_BASE+8) //0x40011008
#define GPIOD_IDR_Addr    (GPIOD_BASE+8) //0x40011408
#define GPIOE_IDR_Addr    (GPIOE_BASE+8) //0x40011808
#define GPIOF_IDR_Addr    (GPIOF_BASE+8) //0x40011A08
#define GPIOG_IDR_Addr    (GPIOG_BASE+8) //0x40011E08 

//GPIO输入输出定义
#define PAOut(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //GPIOA的输出
#define PAIn(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //GPIOA的输入

#define PBOut(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //GPIOB的输出
#define PBIn(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //GPIOB的输入

#define PCOut(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //GPIOC的输出
#define PCIn(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //GPIOC的输入

#define PDOut(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //GPIOD的输出
#define PDIn(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //GPIOD的输入

#define PEOut(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //GPIOE的输出
#define PEIn(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //GPIOE的输入

#define PFOut(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //GPIOF的输出
#define PFIn(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //GPIOF的输入

#define PGOut(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //GPIOG的输出
#define PGIn(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //GPIOG的输入

/*
使用方法
#define TM1637_CLK           PCOut(7)  ---设置GPIOC的7口向TM1637的CLK通讯进行输出
#define TM1637_DIO           PCOut(6)  ---设置GPIOC的6口向TM1637的DIO通讯进行输出
#define TM1637_READ_DIO      PCIn(6)   ---设置GPIOC的6口读取TM1637的DIO数据
*/
时间: 2024-12-14 18:42:45

STM32之GPIO端口位带操作的相关文章

Duanxx的STM32学习:GPIO的位带操作

支持了位带操作后,可以使用普通的加载/存储指令来对单一的比特进行读写.在 CM3中,有两个区中实现了位带.其中一个是 SRAM 区的最低 1MB 范围,第二个则是片内外设区的最低 1MB 范围.这两个区中的地址除了可以像普通的 RAM 一样使用外,它们还都有自己的"位带别名区",位带别名区把每个比特膨胀成一个 32 位的字.当你通过位带别名区访问这些字时,就可以达到访问原始比特的目的. 关于位带操作的博客说明有很多,这里主要将代码贴出来,并做详细的注释 /** ************

STM32位带操作总结---浅显易懂

正在准备做毕业设计,配置LED_Config()的时候,又看到了位带操作的宏定义,我又嘀咕了,什么是位带操作,一年前在使用位带操作的时候,就查阅过好多资料,Core-M3也看过,但是对于博主这种"低能儿"来说,你不把它说的白一点,就是感觉理解的不够透彻,于是今天又一次,查阅了各种手册,也算是基本弄懂了,鉴于博主的个人特点,所以本人的介绍也会十分浅显易懂,希望能帮到各位! 首先,抛砖引玉,来两个问题: 1)为什么STM32里面会有位带操作? 2)STM32里面的位带操作是什么意思? 我也

玩转X-CTR100 | 位带操作-GPIO

更多塔克创新资讯欢迎登陆[塔克社区www.xtark.cn ][塔克博客www.cnblogs.com/xtark/ ] STM32F4位带概念,及位带的GPIO操作实践应用. 原理介绍 51单片机相信各位都用过,假设P1.1的IO口上挂了一个LED,那么你单独对LED的操作就是P1.1 = 0或P1.1 = 1,注意,是你可以单独的对P1端的第一个IO口进行操作,然而STM32是不允许这样做的,那么为了像51单片机一样能够单独的对某个端的某一个IO单独操作,就引入了位带操作这样的概念,简单说就

第13章 GPIO—位带操作

第13章     GPIO-位带操作 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege 本章参考资料:<STM32F4xx 中文参考手册>存储器和总线构架章节.GPIO章节,<Cortex?-M4内核编程手册>2.2.5 Bit-banding.学习本章时,配套这些参考资料学习效果会更佳. 13.1 位带简介 位操作就是可以单独的对一个比特位读和写,这个在51单片机

08_stm32位带操作

一:位带操作介绍 1.   位带操作 在学习 51 单片机的时候就使用过位操作, 通过关键字 sbit 对单片机 IO 口进行位定义. 但是 STM32 没有这样的关键字, 而是通过访问位带别名区来实现.即将每个比特位膨胀成一个 32 位字, 当访问这些字的时候就达到了访问比特的目的. 比方说 BSRR 寄存器有 32 个位, 那么可以映射到 32 个地址上, 当我们去访问这 32 个地址就达到访问 32 个比特的目的. STM32F1 中有两个区域支持位带操作, 一个是 SRAM 区的最低 1

STM32F030系列实现仿位带操作

1.闲言 最近开发的时候,用到了STM32F030F4P6型号的单片机,它只有20个引脚,价格非常便宜,但是功能齐全:定时器.外部中断.串口.IIC.SPI.DMA和WWDG等等,应用尽有,非常适合用来做小设备.可是有个问题是,它是Cortex-M0内核的,不像M3,M4内核一样,可以支持位带操作(就是一位一位地操作,像80C51单片机一样),这就给程序移植或者开发带来了一点点小麻烦,因此我就利用C语言结构的位段操作,实现了个访位带操作,只是在效率可能会稍逊于真正的位带操作,但是代码上可以兼容,

位带操作

1.位带区: 支持位带操作的地址区 2.位带别名:对别名地址的访问最终作用在位带区的访问(中途有地址映射) 3. 4. 5. 对于片上外设,映射关系参照上图关系修改即可. 6.举例: 建立一个把“位带地址+位序号”换成别名地址的宏,再建立一个把别名地址转换成指针类型的宏. 使用位带功能时,要访问的变量必须用volatile 来定义.(指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.)

STM32中的位带(bit-band)操作(转)

源:STM32中的位带(bit-band)操作 支持了位带操作后,可以使用普通的加载/存储指令来对单一的比特进行读写.在 CM3 中,有两个区中实现了位带.其中一个是 SRAM 区的最低 1MB 范围,第二个则是片内外设区的最低 1MB范围.这两个区中的地址除了可以像普通的 RAM 一样使用外,它们还都有自己的“位带别名区”,位带别名区把每个比特膨胀成一个 32 位的字.当你通过位带别名区访问这些字时,就可以达到访问原始比特的目的.       位带操作的概念其实 30 年前就有了,那还是805

STM32中的位带(bit-band)操作

支持了位带操作后,可以使用普通的加载/存储指令来对单一的比特进行读写.在 CM3 中,有两个区中实现了位带.其中一个是 SRAM 区的最低 1MB 范围,第二个则是片内外设区的最低 1MB范围.这两个区中的地址除了可以像普通的 RAM 一样使用外,它们还都有自己的"位带别名区",位带别名区把每个比特膨胀成一个 32 位的字.当你通过位带别名区访问这些字时,就可以达到访问原始比特的目的.       位带操作的概念其实 30 年前就有了,那还是8051 单片机开创的先河,如今,CM3 将