0
点赞
收藏
分享

微信扫一扫

stm32f407探索者开发板(六)——位操作


文章目录

  • ​​一、位操作原理​​
  • ​​二、哪些区域支持位操作​​
  • ​​三、硬件连接​​
  • ​​四、跑马灯——位带操作​​
  • ​​4.1 代码展示​​

一、位操作原理

把每个比特膨胀为一个32位的字,当访问这些字的时候就达到了访问比特的目的,比如说BSRR寄存器有32个位,那么可以映射到32个地址上,我们去访问(读-改-写)这32个地址就达到访问32个比特的目的。

stm32f407探索者开发板(六)——位操作_#define

二、哪些区域支持位操作

stm32f407探索者开发板(六)——位操作_#define_02


stm32f407探索者开发板(六)——位操作_单片机_03


stm32f407探索者开发板(六)——位操作_位操作_04

stm32f407探索者开发板(六)——位操作_位操作_05

三、硬件连接

stm32f407探索者开发板(六)——位操作_位操作_06

四、跑马灯——位带操作

使能IO口时钟。调用函数RCC_ AHB1PeriphColckCmd();

初始化IO口模式。调用函数GPIO_ Init();

操作IO口,输出高低电平。使用位带操作。

​sys.h​

stm32f407探索者开发板(六)——位操作_嵌入式硬件_07

​#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //输出​​​ 比方说PFout(9)=1,则端口输出高电平
其中​​GPIOF_ODR_Addr​​,是​​#define GPIOF_ODR_Addr (GPIOF_BASE+20) //0x40021414 ​​即,PF的基地址加上偏移地址,n就是16位中的第几位,例如:9
​BIT_ADDR​​是​​#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum)) ​​ 其中​​ MEM_ADDR​​,是​​#define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) ​​,即强转成地址类型
而​​BITBAND(addr, bitnum)​​,是​​#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) ​​也就是映射关系,根据基地址加上那个​​9​​ 输出是​​ODR​​寄存器,读取是​​IDR​​寄存器

4.1 代码展示

delay_init(168);// 时钟是168兆
LED_Init();
while(1)
{
PFout(9)=1;
PFout(10)=1;
delay_ms(500);
PFout(9)=1;
PFout(10)=1;
delay_ms(500);
}

因为在​​led.h​​里面有宏定义

//LED端口定义
#define LED0 PFout(9) // DS0
#define LED1 PFout(10) // DS1

所以也可以写成

delay_init(168);// 时钟是168兆
LED_Init();
while(1)
{
LED0=1;
LED1=1;
delay_ms(500);
LED0=0;
LED1=0;
delay_ms(500);
}


举报

相关推荐

0 条评论