[TT] Cortex Peripheral bit-banding (STM32 GPIO Bitband)


main.c

위 첨부는 ST 예제중인 하나인 내부 SRAM Bitband 시험 예제이고요.



F12 Programming Manual.pdf

위 첨부는 cortex 의 원론적인 내부 명령어 설명서 입니다.



저는 8051코드을 M3로 변환하다 심심해서 사용을 해봤습니다.


아래 예제는 GPIOB 10번, GPIOB 11번 핀을 Peripheral Bitband기능을 이용해서 고속으로 제어 합니다.

실제 scope관측시나, 코드 생성시 비교해보면 당연히 기본 Peripheral lib에서 제공하는 함수 보다 월등히 빠릅니다.

scope캡쳐 해놨는데 사라지고 없네요...ㅋ


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#define PERIPHERAL_BASE       0x40000000

#define PERIPHERAL_BB_BASE    0x42000000


#define GPIOB_ODR             0x40010C0C

#define GPIO_I2C_SCL_BIT      (10)

#define GPIO_I2C_SDA_BIT      (11)

 


#define  D1_MCU_SCL         *(volatile INT32U *) (PERIPHERAL_BB_BASE | ((GPIOB_ODR - PERIPHERAL_BASE) << 5) | ((GPIO_I2C_SCL_BIT) << 2)) 

#define  D0_MCU_SDA         *(volatile INT32U *) (PERIPHERAL_BB_BASE | ((GPIOB_ODR - PERIPHERAL_BASE) << 5) | ((GPIO_I2C_SDA_BIT) << 2)) 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


정의는 저정도로 하면 되고, #define문은 컴파일시에 계산이 모두되어 상수로 들어가니 연산자가 많다고 실제 코드상에서 실행 속도가 늘어나지는 않습니다.


프로그램 상에서는 아래와 같이 8051처럼 쓰시면 됩니다.


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  D0_MCU_SDA = 0;

  wait_us(1); // 

  D1_MCU_SCL = 1;

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



주의 할 점은 저렇게 GPIO출력으로 쓰다 보면 무의식적으로 입력을 자연스럽게 아래처럼 받게 됩니다.

당연히 동작이 제대로 안되겠죠.

M3 Core는 입출력 레지스터가 분리되어 있어서 읽어 들일때는 또 다른 define을 정의 해야 합니다. 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

if( D0_MCU_SDA == 0 ) 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



그냥 심심풀이 였습니다.