STM32F103ZE跑马灯基于位操作

瘦欲@ 提交于 2020-02-03 00:03:50

位操作:把每个比特映射为一个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);
}

}

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!