一,什么是位操作

  之前我们已经介绍了库函数和寄存器控制LED跑马灯,其实无论使用哪一种方法(包括操作BSRR,BRR寄存器的方式)最终都是通过操作GPIO_ODR寄存器(32位寄存器只使用低16位)响应的位为该IO口赋值
 
  那么什么是位操作?我们知道GPIO_ODR寄存器的每一位对应一个IO口的电平操作,而每一位实际是一个IO口地址的映射,位操作就是跨越寄存器映射,直接为这个地址进行赋值
  
  在LED跑马灯-位操作的实验中我们将使用位操作的方式控制IO口输出高低电平

  


二,位与别名映射关系

1,支持位操作的两个内存区范围:

0x2000_0000-0x200F_FFFF     // SRAM区中的最低1M
0x4000_0000-0x400F_FFFF     // 片上外设区中的最低1M

2,地址映射关系计算:
对于SRAM位带区某比特,所在字节地址为A,位n(0<=n<=7),该比特在别名区的地址为:

AliasAddr=0x22000000+((A-0x20000000) * 8+n)*4=0x22000000+(A-0x20000000)*32+n*4

对于片上外设位带区某比特,所在字节地址为A,位n(0<=n<=7),该比特在别名区的地址为:

AliasAddr=0x42000000+((A-0x40000000) * 8+n)*4=0x42000000+(A-0x40000000)*32+n*4

三,位操作

寄存器每一个bit映射为一个32位地址,修改这个位,可直接修改其映射的地址达到操作位的目的


四,位操作的优越性

以前获取某个位的值:
  先获取整个寄存器的值
  掩盖不需要的位
 位操作获取某个位的值:
  从位带别名区读取状态位
  
 位操作对硬件I/O密集型底层程序最有好处
 以前的读-改-写需要三条指令,导致中间有两个可能被中断的空档


五,sys.h介绍

介绍一个sys.h文件对位操作进行了封装

#ifndef __SYS_H
#define __SYS_H
#include "stm32f10x.h"//计算寄存器地址addr下,第bitnum位映射的32位地址值
#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))//GPIOx_ODR寄存器地址
#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//GPIOx_IDR寄存器地址
#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//位操作封装
#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)    // 操作GPIOA_ODR寄存器的第n个位-输出
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)    // 操作GPIOA_IDR寄存器的第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)#endif

stm32f10x.h中找到GPIOA基地址GPIOA_BASE

#define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800)  // 在APB2总线下+偏移量0x0800

再找到APB2PERIPH基地址

#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)

最终操作寄存器的相应的位


六,LED硬件连接:

  

连接方式:LED0连接PB5引脚LED1连接PE5引脚

七,LED跑马灯实现流程-位操作

1,使能IO时钟调用函数RCC_APB2PeriphClockCmd2,初始化GPIO调用函数GPIO_Init();3,使用位操作实现操作IO口输出高低电平

八,LED跑马灯-位操作代码

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"  // 此头文件中间接引用了sys.h头文件int main(void){delay_init();LED_Init();while(1){PBout(5)=1;      // PB5设置为高电平,LED熄灭PEout(5)=1;delay_ms(500);   // 延迟500毫秒PBout(5)=0;      // PB5设置为低电平,LED点亮PEout(5)=0;delay_ms(500);}}

以上代码实现了LED0,LED1每间隔500毫秒闪烁

LED跑马灯-位操作相关推荐

  1. web展现mysql_web页面实现LED跑马灯效果(涉及web前端、原生JS、PHP、mysql)

    本帖最后由 yoin 于 2019-11-21 16:24 编辑 产品需求: LED跑马灯页面展示内容(班级电脑展示) setLED更改内容(老师电脑更改内容) LED页面及时更新内容设计思路: 最初 ...

  2. TQ2440+RealViewMDK调试LED跑马灯(成功!)

    去年买的TQ2440的开发板,搁了一年,没咋用,今年心血来潮,想学学了,于是又翻开了板子,结果是个伤脑筋的活啊......果然比单片机.AVR的来的难啊,搞了两天,也参考了网上的资料,竟然(居然)才弄 ...

  3. 手机屏大字滚动_LED跑马灯屏-LED跑马灯屏App下载-

    LED跑马灯屏软件是一款模拟LED显示屏应用软件,LED跑马灯软件可轻易实现发光LED跑马灯,使用这款LED跑马灯软件可以随你喜欢自行定义滚动的文字和文字样式. LED跑马灯软件是演唱会电子灯牌.机场 ...

  4. 基于51单片机8位竞赛抢答器_倒计时可调+LED跑马灯

    基于51单片机8位竞赛抢答器_倒计时可调+LED跑马灯仿真设计 (程序+proteus仿真+报告) Proteus仿真版本:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C ...

  5. ADI Blackfin DSP处理器-BF533的开发详解14:LED跑马灯(含源代码)

    接口讲完了,下面写点应用程序,GPIO最典型的应用,LED跑马灯. 硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DS ...

  6. HaaS学习笔记 | HaaS框架环境下基于MicroPython的LED跑马灯实现及比较

    [1]题目要求 [案例]:在HaaS框架下用原生MicroPython实现LED跑马灯.       蓝蜻蜓ESP32开发板的LED灯电路连接如下:          D3灯----GPIO14,高电 ...

  7. HaaS学习笔记 | 基于HaaS Python轻应用的LED跑马灯明细教程

    [1]题目要求     [案例]:在HaaS框架下实现LED跑马灯.       蓝蜻蜓ESP32开发板的LED灯电路连接如下:       D3灯----GPIO14,高电平点亮,低电平熄灭.   ...

  8. 10.4.4 51单片机控制系统8个LED“跑马灯”实验

    10.4.4 51单片机控制系统8个LED"跑马灯"实验 仿真+代码 方法一 利用数组 #include"reg52.h"#define u8 unsigned ...

  9. 【嵌入式】按键中断控制 LED 跑马灯实验

    [嵌入式]按键中断控制 LED 跑马灯实验 1. 操作内容 2. 原理解释 2.1 实验箱按键电路 2.2 实验箱LED电路 2.3 寄存器说明 3. 操作步骤 3.1 编写键控制 LED 代码,将代 ...

  10. LED跑马灯-库函数

    一,GPIO知识回顾 1,四种输入模式: 输入浮空输入上拉输入下拉模拟输入 2,四种输出模式: 开漏输出开漏复用输出推挽输出推挽复用输出 3,三种最大输出速度 2MHz 10MHz 50MHz 每组G ...

最新文章

  1. js时间搓化为今天明天_护肤品搓泥怎么办啊啊啊啊啊......
  2. 搭建项目前端页面环境
  3. onpagefinished等了很久才执行_其实,无所事事的日子才过得最累
  4. 解决:jsp 页面不全,response 内容不完整
  5. ExtJS4.2学习 php版(五)
  6. 最简易的流水记账软件分享
  7. Cocos2dx基础手册
  8. 苹果登录skype显示无法连接服务器,无法连接appstore服务器 无法连接appstore服务器怎么办呢...
  9. STM32串口屏应用
  10. 08_Linux系统之link(),symlink(),readlink()函数
  11. 汇编语言简明教程 实验报告
  12. 居然能查看微信访客记录,这款神器牛逼了。
  13. 网络面经总结-仅供参考
  14. 51信用卡通过网银来获得账单的安全问题
  15. GeneXus for SAP的最新动态
  16. python爬虫天气实例_Python爬虫实例扒取2345天气预报
  17. 区块链安全性(区块链应用)
  18. 微信公众号下载pdf,一行代码(安卓机是下载,苹果机是查看)
  19. iOS---集成融云SDK即时通讯
  20. KEIL Software Packs 软件包下载地址

热门文章

  1. iPad出现问题时,如何恢复出厂设置怎么操作?
  2. 机器学习(非线性回归)
  3. 《老子五千言》 ——《道德经》帛书版(珍藏原著)
  4. echarts横向柱形图显示不同类别所占整体百分比
  5. 人机平台:商业未来行动路线图
  6. 20162320刘先润 2016-2017-2《程序设计与数据结构》课程总结
  7. github上传代码步骤
  8. pdf拆分成一页一页,详细步骤介绍
  9. 对一段Oracle GoldenGate (OGG) 传输进程日志(.rpt文件)的解释
  10. python怎么换背景颜色_更换python默认编辑器背景色的操作方法