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