STM32 LED跑马灯-位操作

最新更新时间:2021-12-02来源: eefocus关键字:STM32  LED跑马灯  位操作 手机看文章 扫描二维码
随时随地手机看文章

一,什么是位操作

  之前我们已经介绍了库函数和寄存器控制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_APB2PeriphClockCmd


2,初始化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毫秒闪烁

关键字:STM32  LED跑马灯  位操作 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic556239.html

上一篇:FSMC驱动TFTLCD原理,时序和寄存器介绍
下一篇:系统初始化函数SystemInit讲解

推荐阅读

STM32单片机-汇编指令1
--------------------------------------------说明:STM32单片机汇编指令使用一STM32单片机汇编指令使用二ARM单片机汇编指令的查找见“STM32单片机二之十五、查找汇编指令”。--------------------------------------------.macro restore_user_regs //宏   ldr r1,[sp, #S_PSR]   ldr lr,[sp, #S_PC]!   @ !用来控制基址变址寻址的最终新地址是否进行回写操作,         
发表于 2022-01-12
<font color='red'>STM32</font>单片机-汇编指令1
STM32-GPRS模块连接系统主站
一、GPRS基础讲解(GSM/CDMA/GPRS介绍)1、通信专业术语BSS--基站子系统,通过无线接口与移动台直接联系,负责在一定区域内和移动台通信。(GSM)BTS--基站收发台,可以看作一复杂的无线调制器,BSS的主要部分,每个分配有若干信道。(GSM)RBS--Radio Base Station,无线基站:RBS是基站内所有设备的总称,在GSM规范中对应的主要部分是BTS,它由BSC来控制,用来提供移动台与系统的无线接口,它是CME20系统中的无线设备部分,主要由无线收发信机构成。BSC--基站控制器,其功能是作为无线电设备与MSC的控制和通信的接口,直接控制BTS。(GSM) GPRS--General Pac
发表于 2022-01-12
STM32-GPRS模块连接系统主站
AD转换汇总(STM32、取平均、过采样)
}-----------------------------------------------------------------------------------------------------三、STM32关于使用定时器触发ADC转换以STM32 ADC的常规通道为例(注入通道类似):配合上ADC外设的框图:如上图,STM32 ADC的常规通道可以由以上6个信号触发任何一个,我们以使用TIM2_CH2触发ADC1,独立模式,每次仅测一条通道,则ADC的配置如下:(以下代码使用STM32固件库V3.5)void ADC_Configuration(void){    ADC_InitTypeDef ADC_InitStructure;    ADC_InitStructure.ADC_Mode
发表于 2022-01-12
AD转换汇总(<font color='red'>STM32</font>、取平均、过采样)
STM32单片机-低功耗设置
STM32F103R8和RC的停机模式的休眠电流还不一样,R8停机模式实测为11uA,RC停机模式实测为30uA,还以为又是我的程序哪里没做好呢,仔细看了PDF,这两个芯片PDF上标的值的确有区别,和我测的值差不多,那我就没有再深究的意义了! 结合下文的高手经验,反复摸索,standby模式1.9uA,PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);stop模式:11uA, PWR_EnterSTANDBYMode(); 实验证明,将IO端口设成IPU/IPD/AIN/PPOUT=1/PPOUT=0/ODOUT=0,电流是基本相同的,最可怕
发表于 2022-01-12
<font color='red'>STM32</font>单片机-低功耗设置
STM32单片机-操作访问内部Flash
目录:1、STM32 FLASH操作流程2、Flash基本知识点3、OK,上干货,上代码-------------------------------------------------------------------------------------------------STM32中存储区分为:随机存取存储器RAM和只读存储器ROM。 其中:RAM为常说的内存,比如手机的2G内存4G内存等,就是程序跑起来的时候所占用的存储空间,特点是掉电数据丢失。ROM为常说的硬盘,比如手机的64G和128G等,可以简单的理解为硬盘的存储空间,特点是掉电数据不丢失,所以又叫“非易失性存储器件”。 ROM又包含
发表于 2022-01-12
<font color='red'>STM32</font>单片机-操作访问内部Flash
STM32单片机-标准库编译成lib库
--------------------------------------------------------------------------------------------------------------------------------以前一直使用STM32的标准库,需要一步步地将代码加进去,将编译选项设置好,然后再编译整个工程。这个编译过程是一个相当慢的过程!完全编译大约需要一支烟的时间。每次建立工程都这么编译,是一个相当浪费时间和香烟的过程。于是,我有了将库编译成lib文件的想法。本博文就是我将STM32F4的标准库编译成lib文件并在工程中使用的过程。适用对象:1、熟悉库,不想再看库里边代码2、有稳定的库
发表于 2022-01-12
<font color='red'>STM32</font>单片机-标准库编译成lib库
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved