 //!**************************************************
//! Файл							: BitBand.h
//! Авторское право (с)				: 
//! Разработка						: 
//! Дата создания					: 
//! Описание						: использовать с уровнем оптимизации не ниже -o2
//!**************************************************
#ifndef _BitBand_h_
#define _BitBand_h_
#include "stm32f10x_lib.h"
/* Private define ------------------------------------------------------------*/
#define RAM_BASE		0x20000000
#define RAM_BB_BASE		0x22000000
#define PERI_BASE		0x40000000  
#define PERI_BB_BASE		0x42000000
/* Private macro -------------------------------------------------------------*/

#define  Var_ResetBit_BB(VarAddr, BitNumber)    \
          (*(vu32 *) (RAM_BB_BASE | ((VarAddr - RAM_BASE) << 5) | ((BitNumber) << 2)) = 0)
   
#define Var_SetBit_BB(VarAddr, BitNumber)       \
          (*(vu32 *) (RAM_BB_BASE | ((VarAddr - RAM_BASE) << 5) | ((BitNumber) << 2)) = 1)

#define Var_GetBit_BB(VarAddr, BitNumber)       \
          (*(vu32 *) (RAM_BB_BASE | ((VarAddr - RAM_BASE) << 5) | ((BitNumber) << 2)))

#define  Perif_ResetBit_BB(VarAddr, BitNumber)    \
          (*(vu32 *) (PERI_BB_BASE | ((VarAddr - PERI_BASE) << 5) | ((BitNumber) << 2)) = 0)
   
#define Perif_SetBit_BB(VarAddr, BitNumber)       \
          (*(vu32 *) (PERI_BB_BASE | ((VarAddr - PERI_BASE) << 5) | ((BitNumber) << 2)) = 1)

#define Perif_GetBit_BB(VarAddr, BitNumber)       \
          (*(vu32 *) (PERI_BB_BASE | ((VarAddr - PERI_BASE) << 5) | ((BitNumber) << 2)))

#define Perif_ToggleBit_BB(VarAddr, BitNumber)\
	  (*(vu32 *) (PERI_BB_BASE | ((VarAddr - PERI_BASE) << 5) | ((BitNumber) << 2)) = 1 -\
          (*(vu32 *) (PERI_BB_BASE | ((VarAddr - PERI_BASE) << 5) | ((BitNumber) << 2))))

//---------------------------------------------------------------------------------
//	example            clear GPIOC->5 bit 
//	                   Perif_ResetBit_BB(&(u32)(GPIOC->ODR),5);
//	#define CLOCK 5
//	#define PORT_CLOCK GPIOC
//	#define CLOCK_LOW() Perif_ResetBit_BB((u32)&(PORT_CLOCK->ODR),CLOCK);
//	#define CLOCK_HI() Perif_SetBit_BB((u32)&(PORT_CLOCK->ODR),CLOCK);
//  #define BITTST1(PORT_CLOCK,CLOCK) Perif_GetBit_BB((u32)&(PORT_CLOCK->IDR), CLOCK)
//---------------------------------------------------------------------------------

#endif //_BitBand_h_

