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