Giỏ hàng
Danh mục sản phẩm

Lập trình Bit Band Region STM32F1 Và STM32F4

Đăng bởi Trần Văn Bùi ngày bình luận

Lập trình  Bit Band Region STM32F1 Và STM32F4
Hôm nay mình giới thiệu qua Bit Band 

Vùng bit-band đầu tiên là từ 0x2000 0000 đến 0x200F FFFF của SRAM và vùng bí danh tương ứng của nó là 0x2200 0000 tới 0x23FF FFFF.

Vùng bit-band còn lại là từ 0x4000 0000 và kết thúc ở 0x400F FFFF của các ngoại vi và vùng bí danh tương ứng là từ 0x4200 0000 đến 0x43FF FFFF

Ví dụ: Chúng ta sẽ điều khiển led trên chân PC13

  • Vùng alias_region_base = 0x4200 0000 là địa chỉ bắt đầu vùng bí danh của ngoại vi
  • Vùng regione_base_offset  chính là địa chỉ thanh ghi muốn truy cập của Port C là 0x4001100C
  • bit number = 13 chính là bit số bao nhiêu trên thanh ghi đó

Vậy theo công thức chúng ta tính được địa chỉ bitband của PC13 là: 0x422201B4

Thư Viện STM32F1:

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) 
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) 

#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C 
#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C 
#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C 
#define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C 
#define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C 
#define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C    
#define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C    

#define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808 
#define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08 
#define GPIOC_IDR_Addr    (GPIOC_BASE+8) //0x40011008 
#define GPIOD_IDR_Addr    (GPIOD_BASE+8) //0x40011408 
#define GPIOE_IDR_Addr    (GPIOE_BASE+8) //0x40011808 
#define GPIOF_IDR_Addr    (GPIOF_BASE+8) //0x40011A08 
#define GPIOG_IDR_Addr    (GPIOG_BASE+8) //0x40011E08 
#define PORT_A(n)              BIT_ADDR(GPIOA_ODR_Addr,n)  // 
#define PIN_A(n)               BIT_ADDR(GPIOA_IDR_Addr,n)  // 

#define PORT_B(n)              BIT_ADDR(GPIOB_ODR_Addr,n)  //
#define PIN_B(n)               BIT_ADDR(GPIOB_IDR_Addr,n)  //

#define PORT_C(n)              BIT_ADDR(GPIOC_ODR_Addr,n)  //
#define PIN_C(n)               BIT_ADDR(GPIOC_IDR_Addr,n)  //

#define PORT_D(n)              BIT_ADDR(GPIOD_ODR_Addr,n)  //
#define PIN_D(n)               BIT_ADDR(GPIOD_IDR_Addr,n)  //

#define PORT_E(n)              BIT_ADDR(GPIOE_ODR_Addr,n)  //
#define PIN_E(n)               BIT_ADDR(GPIOE_IDR_Addr,n)  //

#define PORT_F(n)              BIT_ADDR(GPIOF_ODR_Addr,n)  //
#define PIN_F(n)               BIT_ADDR(GPIOF_IDR_Addr,n)  //

#define PORT_G(n)              BIT_ADDR(GPIOG_ODR_Addr,n)  //
#define PIN_G(n)               BIT_ADDR(GPIOG_IDR_Addr,n)  //

 

Thư Viện STM32F4:

#define GPIO_ON(gpio,pin)     (gpio)->BSRRH = (pin)
#define GPIO_OFF(gpio,pin)    (gpio)->BSRRL = (pin)
#define GPIO_TOGGLE(gpio,pin) (gpio)->ODR ^= (pin)

#define BITBAND(addr,bitnum) ((addr&0xF0000000)+0x2000000+((addr&0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long*)(addr))
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr,bitnum))      //*((volatile unsigned long  *)((0x42000000)+(addr<<5)+(bitnum<<2)))                   //
//IO¿ÚµØÖ·Ó³Éä                                                                
#define GPIOA_ODR_Addr    (GPIOA_BASE+20)//0x01080C  
#define GPIOB_ODR_Addr    (GPIOB_BASE+20)//0x010C0C 
#define GPIOC_ODR_Addr    (GPIOC_BASE+20)//0x01100C 
#define GPIOD_ODR_Addr    (GPIOD_BASE+20)//0x01140C 
#define GPIOE_ODR_Addr    (GPIOE_BASE+20)//0x01180C
//
#define GPIOF_ODR_Addr    (GPIOF_BASE+20) //0x40021414    
#define GPIOG_ODR_Addr    (GPIOG_BASE+20) //0x40021814   
#define GPIOH_ODR_Addr    (GPIOH_BASE+20) //0x40021C14    
#define GPIOI_ODR_Addr    (GPIOI_BASE+20) //0x40022014  
//IOģʽ¶¨Òå
#define GPIOA_IDR_Addr    (GPIOA_BASE+16)//0x010808 
#define GPIOB_IDR_Addr    (GPIOB_BASE+16)//0x010C08 
#define GPIOC_IDR_Addr    (GPIOC_BASE+16)//0x011008 
#define GPIOD_IDR_Addr    (GPIOD_BASE+16)//0x011408 
#define GPIOE_IDR_Addr    (GPIOE_BASE+16)//0x011808
//
#define GPIOF_IDR_Addr    (GPIOF_BASE+16) //0x40021410 
#define GPIOG_IDR_Addr    (GPIOG_BASE+16) //0x40021810 
#define GPIOH_IDR_Addr    (GPIOH_BASE+16) //0x40021C10 
#define GPIOI_IDR_Addr    (GPIOI_BASE+16) //0x40022010 
//IO¿Ú²Ù×÷,Ö»¶Ôµ¥Ò»µÄIO¿Ú!

//È·±£nµÄֵСÓÚ16!
#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //Êä³ö 
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //ÊäÈë 

#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //Êä³ö 
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //ÊäÈë 

#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //Êä³ö 
#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //ÊäÈë 

#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //Êä³ö 
#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //ÊäÈë 

#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //Êä³ö 
#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //ÊäÈë 
//
#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //Êä³ö 
#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //ÊäÈë

#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //Êä³ö 
#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //ÊäÈë

#define PHout(n)   BIT_ADDR(GPIOH_ODR_Addr,n)  //Êä³ö 
#define PHin(n)    BIT_ADDR(GPIOH_IDR_Addr,n)  //ÊäÈë

#define PIout(n)   BIT_ADDR(GPIOI_ODR_Addr,n)  //Êä³ö 
#define PIin(n)    BIT_ADDR(GPIOI_IDR_Addr,n)  //ÊäÈë

Các Bạn copy Vào Chương Trình Sau đó gọi Hàm ra chạy nhé 

VD:PHout(1)=1;PHout(1)=0;

 

 


Mới hơn