STM32位操做點燈

1 基礎知識ui

  (1)位的認識指針

   位 就是bit ,一般一個字節有八個,n個字節有 n*8 個位ip

  位操做就是單獨對一個位進行操做    置零或者置一  內存

(2) 如何進行位操做it

 咱們知道在道給變量賦值,其實是過訪問地址對內存的操做,位也是同樣的,須要知道它的地址才能進行操做。基礎

   當咱們要對一個GPIO來高電平,或者拉低電平,也會用到位操做變量

如下爲:經常使用的位操做di


#define  BITBAND(addre,bitnum) ((addr& 0xf0000000)+0x02000000)+((addr&0x00ffffff)<<5)+(bitnum<<2)while

//將地址轉換成指針
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))volatile

#define BIT_ADDR(addr,bitnum)  MEM_ADDR(BITBAND(addr,bitnum));
 2 實際案例 :

led.h

#ifndef   LED__H__
#define   LED__H__
#include  "stm32f10x.h"
#define   BANDBIT(Addr,num)  (((Addr&0xf0000000)+0x2000000)+((Addr&0x00ffffff)<<5)+(num<<2))
#define   MEM_ADDR(Addr)       (*(volatile unsigned long*)(Addr))
#define   BIT_ADDR(Addr,num)     MEM_ADDR(BANDBIT(Addr,num))
//輸出地址
#define   GPIOA_ODR_Addr     (GPIOA_BASE+12)
#define   GPIOB_ODR_Addr     (GPIOB_BASE+12)
#define   GPIOC_ODR_Addr     (GPIOC_BASE+12)
#define   GPIOD_ODR_Addr     (GPIOD_BASE+12)
#define   GPIOE_ODR_Addr     (GPIOE_BASE+12)
#define   GPIOF_ODR_Addr     (GPIOF_BASE+12)
#define   GPIOG_ODR_Addr     (GPIOG_BASE+12)

//輸入地址
#define  GPIOA_IDR_Addr      (GPIOA_BASE+8)
#define  GPIOB_IDR_Addr      (GPIOB_BASE+8)
#define  GPIOC_IDR_Addr      (GPIOC_BASE+8)
#define  GPIOD_IDR_Addr      (GPIOD_BASE+8)
#define  GPIOE_IDR_Addr      (GPIOE_BASE+8)
#define  GPIOF_IDR_Addr      (GPIOF_BASE+8)
#define  GPIOG_IDR_Addr      (GPIOG_BASE+8)

//設置GPIO_x__PIN_n爲輸出
#define  PAout(n)       (BIT_ADDR(GPIOA_ODR_Addr,n))
#define  PBout(n)       (BIT_ADDR(GPIOB_ODR_Addr,n))
#define  PCout(n)       (BIT_ADDR(GPIOC_ODR_Addr,n))
#define  PDout(n)       (BIT_ADDR(GPIOD_ODR_Addr,n))
#define  PEout(n)       (BIT_ADDR(GPIOE_ODR_Addr,n))
#define  PFout(n)       (BIT_ADDR(GPIOF_ODR_Addr,n))
#define  PGout(n)       (BIT_ADDR(GPIOG_ODR_Addr,n))

//設置GPIOx_Pin_n 爲輸入

#define  PAin(n)        (BIT_ADDR(GPIOA_IDR_Addr,n))
#define  PBin(n)        (BIT_ADDR(GPIOB_IDR_Addr,n))
#define  PCin(n)        (BIT_ADDR(GPIOC_IDR_Addr,n))
#define  PDin(n)        (BIT_ADDR(GPIOD_IDR_Addr,n))
#define  PEin(n)        (BIT_ADDR(GPIOE_IDR_Addr,n))
#define  PFin(n)        (BIT_ADDR(GPIOF_IDR_Addr,n))
#define  PGin(n)        (BIT_ADDR(GPIOG_IDR_Addr,n))

void  Init_LED(void);
void  delay(uint32_t size);
#endif

3  點燈  :

led.c

#include "led.h"
void  Init_LED(void){
   
    GPIO_InitTypeDef  Init_Struct;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  Init_Struct.GPIO_Pin = GPIO_Pin_0;
    Init_Struct.GPIO_Mode = GPIO_Mode_Out_PP;
  Init_Struct.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(GPIOB,&Init_Struct);
    GPIO_SetBits(GPIOB,GPIO_Pin_0);
}

void  delay(uint32_t size)
{
  while(size--);
}
 

main.c 

#include "system_stm32f10x.h"
#include "led.h"
int main(){
    
    
     Init_LED();

             while(1){                        PBout(0) = 0;              delay(0x0fffff);              PBout(0)=1;              delay(0x0fffff);          } }

相關文章
相關標籤/搜索