STM32F103ZE跑马灯基于位操作

位操作:把每个比特映射为一个32位的字,当访问这些字的时候就达到了访问比特的目的。

支持位操作的区域:

  1. 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);
}

}

编译并测试 结果,实验成功。

发布了31 篇原创文章 · 获赞 28 · 访问量 9492

猜你喜欢

转载自blog.csdn.net/visual_eagle/article/details/104145491