GPIO 출력을 위해서는 먼저 GPIO 를 초기화 해야하는데,
STM 계열의 문법은, 먼저 다음과 같은 구조체로 GPIO 변수를 선언하는 군요.
main.c 파일에서 global 구조체 함수로 다음과 같이 정의를 합니다.
static GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitTypeDef 라는 구조체 형식은 다음과 같습니다.
/**
* @brief GPIO Init structure definition
*/
typedef struct
{
uint32_t Pin; /*!< Specifies the GPIO pins to be configured.
This parameter can be any value of @ref GPIO_pins_define */
uint32_t Mode; /*!< Specifies the operating mode for the selected pins.
This parameter can be a value of @ref GPIO_mode_define */
uint32_t Pull; /*!< Specifies the Pull-up or Pull-Down activation for the selected pins.
This parameter can be a value of @ref GPIO_pull_define */
uint32_t Speed; /*!< Specifies the speed for the selected pins.
This parameter can be a value of @ref GPIO_speed_define */
uint32_t Alternate; /*!< Peripheral to be connected to the selected pins.
This parameter can be a value of @ref GPIO_Alternate_function_selection */
}GPIO_InitTypeDef;
제가 갖고 있는 Nucleo 보드에서 LED가 PA5 에 연결되어 있어서 핀을 출력으로 설정해 봤습니다.
main.c 파일 내에, uart 테스트에 사용했던 프로젝트에서 사용된 초기화 함수에 PA5 설정에 대한 코드를 추가했습니다.
다음의 빨간 색으로 된 부분이 추가된 코드입니다.
__HAL_RCC_GPIOA_CLK_ENABLE() 함수는 원래 부터 uart 테스트 프로젝트에 있던건데 아마도 Uart 포트가 PA2,3 이라 포트를 사용하기 위해서 Clock Enable이 필요한 듯 합니다.
static void MX_GPIO_Init(void)
{
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
/* -2- Configure PA05 IO in output push-pull mode to
drive external LED */
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
다음으로 main()함수에 출력으로 설정된 LED GPIO 를 Toggle 하고 딜레이 함수로 100ms 기다리고를 반복하는 코드를 추가했습니다.
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
HAL_UART_Transmit(&huart2,"UART2 Test~!!! \n\r",17,0xFFFF);
//HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
/* Insert delay 100 ms */
HAL_Delay(100);
}
/* USER CODE END 3 */
}
자동으로 리셋이 되지 않아서, 프로그램이 잘 안됐나 했는데...
리셋 버튼을 눌러주니 동작하기 시작하네요.
uart2 테스트와 gpio 테스트 파일을 첨부(공유)함니다.
댓글 없음:
댓글 쓰기