位操作:把每个比特映射为一个32位的字,当访问这些字的时候就达到了访问比特的目的。
支持位操作的区域:
- SRAM 区的最低 1MB 范围,0x20000000 ‐ 0x200FFFFF(SRAM 区中的最低 1MB)。
2.片内外设区的最低 1MB范围,0x40000000 ‐ 0x400FFFFF(片上外设区中最低 1MB)。
映射关系:
位带区:支持位带操作的地址区。
位带别名:对别名地址的访问最终作用到位带区的访问上。
公式不用记忆,本质就是映射关系。
直接对位进行了操作,实质还是操作寄存器的位。配置和基于库函数的跑马灯一样。区别在于主函数中,库函数是对SetBits和ResetBits的操作,位操作是直接对PXout(n)进行赋值。
源码:
led.c
#include "led.h"
#include "stm32f10x.h"
void LED_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//GPIOB
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//GPIOE
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//ÍÆÍìÊä³ö
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//ÍÆÍìÊä³ö
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_SetBits(GPIOE,GPIO_Pin_5);
}
led.h
#ifndef __led_h
#define __led_h
void LED_init(void);
#endif
main.c
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
int main(void)
{
delay_init();
LED_init();
while(1){
PBout(5)=1;
PEout(5)=1;
delay_ms(500);
PBout(5)=0;
PEout(5)=0;
delay_ms(500);
}
}
编译并测试 结果,实验成功。
来源:CSDN
作者:visual_eagle
链接:https://blog.csdn.net/visual_eagle/article/details/104145491