본문 바로가기

Lecture/ARM

stm32f407 I/O 제어 (1). GPIOD Periph clock enable

STM32F4 DISCOVERY BOARD 를 이용한 I/O 제어 


포트제어를 하기 위해 가장 먼저 부딛히는 명령어는 다음과 같다. 


  /* GPIOD Periph clock enable */

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);


Periph..... Peripheral 의 약어인듯...  


Peripheral은 SPI 의 P 이기도 하다.....

(난 지금까지 SPI의 P가 Parallel 병렬을 의미하는줄 알고있었는데......하긴 말도안되는 착각이였던게지....)


SPI는 직렬 주변기기 인터페이스 버스(Serial Peripheral Interface Bus)로 아키텍쳐 전이중통신 모드로 동작하는 모토로라 아키텍처에 이름을 딴 동기화 직렬 데이터 연결 표준이다.                참조 Wiki


그렇다면 Periph는 주변기기를 의미하는거겠지?


주반장치 Peripheral

CPU의 주변 장치에는 외부 기억 장치, 입출력 장치, 통신 장치 등이 있는데, 이것들을 총칭하여 주변 장치(peripheral unit, peripheral equipment), 또는 단순히 페리페럴(peripheral)이라고 한다. CPU를 인간의 뇌로 본다면, 주변 장치는 눈, 귀, 손, 발에 해당한다.    네이버 지식사전 



다시

  /* GPIOD Periph clock enable */

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);


stm32f4xx_rcc.c 파일에서 위의 함수를 선언해 놓은 것을 보자


stm32f4xx_rcc.c

/**

  * @brief  Enables or disables the AHB1 peripheral clock.

  * @note   After reset, the peripheral clock (used for registers read/write access)

  *         is disabled and the application software has to enable this clock before 

  *         using it.   

  * @param  RCC_AHBPeriph: specifies the AHB1 peripheral to gates its clock.

  *          This parameter can be any combination of the following values:

  *            @arg RCC_AHB1Periph_GPIOA:       GPIOA clock

  *            @arg RCC_AHB1Periph_GPIOB:       GPIOB clock 

  *            @arg RCC_AHB1Periph_GPIOC:       GPIOC clock

  *            @arg RCC_AHB1Periph_GPIOD:       GPIOD clock

  *            @arg RCC_AHB1Periph_GPIOE:       GPIOE clock

  *            @arg RCC_AHB1Periph_GPIOF:       GPIOF clock

  *            @arg RCC_AHB1Periph_GPIOG:       GPIOG clock

  *            @arg RCC_AHB1Periph_GPIOG:       GPIOG clock

  *            @arg RCC_AHB1Periph_GPIOI:       GPIOI clock

  *            @arg RCC_AHB1Periph_CRC:         CRC clock

  *            @arg RCC_AHB1Periph_BKPSRAM:     BKPSRAM interface clock

  *            @arg RCC_AHB1Periph_CCMDATARAMEN CCM data RAM interface clock

  *            @arg RCC_AHB1Periph_DMA1:        DMA1 clock

  *            @arg RCC_AHB1Periph_DMA2:        DMA2 clock

  *            @arg RCC_AHB1Periph_ETH_MAC:     Ethernet MAC clock

  *            @arg RCC_AHB1Periph_ETH_MAC_Tx:  Ethernet Transmission clock

  *            @arg RCC_AHB1Periph_ETH_MAC_Rx:  Ethernet Reception clock

  *            @arg RCC_AHB1Periph_ETH_MAC_PTP: Ethernet PTP clock

  *            @arg RCC_AHB1Periph_OTG_HS:      USB OTG HS clock

  *            @arg RCC_AHB1Periph_OTG_HS_ULPI: USB OTG HS ULPI clock

  * @param  NewState: new state of the specified peripheral clock.

  *          This parameter can be: ENABLE or DISABLE.

  * @retval None

  */

void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)

{

  /* Check the parameters */

  assert_param(IS_RCC_AHB1_CLOCK_PERIPH(RCC_AHB1Periph));


  assert_param(IS_FUNCTIONAL_STATE(NewState));

  if (NewState != DISABLE)

  {

    RCC->AHB1ENR |= RCC_AHB1Periph;

  }

  else

  {

    RCC->AHB1ENR &= ~RCC_AHB1Periph;

  }

}


assert_param에 대한설명 

assert_param은 디버깅할때 에러를 체크해서 어디서 에러가 났는지 표시해 주는 기능이다. 


stm32f4xx_conf.h


/* #define USE_FULL_ASSERT    1 */


/* Exported macro ------------------------------------------------------------*/

#ifdef  USE_FULL_ASSERT


/**

  * @brief  The assert_param macro is used for function's parameters check.

  * @param  expr: If expr is false, it calls assert_failed function

  *   which reports the name of the source file and the source

  *   line number of the call that failed. 

  *   If expr is true, it returns no value.

  * @retval None

  */

  #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))

/* Exported functions ------------------------------------------------------- */

  void assert_failed(uint8_t* file, uint32_t line);

#else

  #define assert_param(expr) ((void)0)

#endif /* USE_FULL_ASSERT */


이것은 STM32F407 datasheet 에 회색라인과 같다

아래는 데이터시트 17page



자료들을 확인해보면 포트및 이더넷 USB  DMA등의 장치를 제어하는 라인이라고 행각하면 된다. 


여기서 버스가 나온다.


AHB/ APB, AHB AHB2,AHB3 APB 등등.....

이것은 AMBA에 속하는데... 설명은 다음과 같다. 

AMBA (Advanced Microcontroller Bus Architecture) : ARM 프로세서에 사용되는 온칩(on-chip) 버스 아키텍처

  ASB  (Advanced  System Bus)

  APB  (Advanced  Peripheral BUS)

  AHB  (Advanced  High-Performance Bus)


AMBA는 4.0까지 나온듯 하고 나머지는 wiki와 arm사의 홈펭지를참조하면 될듯 




흐미....  한줄 공부하는데 한시간 넘게 걸리다니..ㅠㅠ  

빡세네.....


다음줄들은 다음번에 하도록 해야겠다....


마지막으로 ARM 사의 도움말 사이트를 링크로 걸어둔다






  /* Configure PD12, PD13, PD14 and PD15 in output pushpull mode */

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

  GPIO_Init(GPIOD, &GPIO_InitStructure);



  while (1)

  {

    /* PD12 to be toggled */

    GPIO_SetBits(GPIOD, GPIO_Pin_12);

    GPIO_ResetBits(GPIOD, GPIO_Pin_1|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);


  }