1) ioc파일을 열고 output으로 설정할 Pin을 클릭하고 GPIO_Output을 선택한다.
2) output으로 설정할 Pin을 오른 쪽 클릭하여 Label이름을 변경한다.
3) 저장을 하면 변경한 Label이름으로 Output pin이 설정되어 Code로 generate되는 것을 확인 할 수 있다.
main.c
static void MX_GPIO_Init(void)
{
...
GPIO_InitStruct.Pin = LD3_Red_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
...
}
4) 해당 Pin을 High출력할지 Low출력할지 설정 할수있다.
- Low출력
HAL_GPIO_WritePin(GPIOB, LD3_Red_Pin, GPIO_PIN_RESET);
- High출력
HAL_GPIO_WritePin(GPIOB, LD3_Red_Pin, GPIO_PIN_SET);
1) ioc파일을 열고 input으로 설정할 Pin을 클릭하고 GPIO_Input을 선택한다.
2) input으로 설정할 Pin을 오른 쪽 클릭하여 Label이름을 변경한다.
3) 저장을 하면 변경한 Label이름으로 Input pin이 설정되어 Code로 generate되는 것을 확인 할 수 있다.
main.c
static void MX_GPIO_Init(void)
{
...
/*Configure GPIO pin : User_Btn_Pin */
GPIO_InitStruct.Pin = User_Btn_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(User_Btn_GPIO_Port, &GPIO_InitStruct)
...
}
4) 해당 Pin을 High인지 Low인지 읽어올수있다.
GPIO_PinState user_btn_pin_value = HAL_GPIO_ReadPin(User_Btn_GPIO_Port, User_Btn_Pin );
-> User_Btn_Pin이 Low이면 GPIO_PIN_RESET (0) return
-> User_Btn_Pin이 High이면 GPIO_PIN_SET (1) return
1) ioc파일을 열고 interrupt input으로 설정할 Pin을 클릭하고 GPIO_EXTI을 선택한다.
2) interrupt input으로 설정할 Pin을 오른 쪽 클릭하여 Label이름을 변경한다.
3) GPIO Mode를 확인한다.
Rising edge를 인지하면 interrupt발생한다.
※ Falling edge일때 interrupt발생을 원하면 External Interrupt Mode with Falling edge trigger detection으로 변경한다.
4) Interrupt Control을 위해서 NVIC항목에서 해당 Interrupt를 Enable한다.
※ EXTI0 ~ EXTI4는 각각 제어하므로 EXTI line0 interrupt ~ EXTI line4 interrupt까지 항목중에 선택하여 사용합니다.
EXTI5 ~ EXTI9는 하나의 그룹으로 제어하므로 EXTI line[9:5] interrupt 항목을 선택하여 사용합니다.
EXTI10 ~ EXTI15도 그룹으로 제어하므로 EXTI line[15:10] interrupt 항목을 선택하여 사용합니다.
예제에서는 GPIO_EXTI pin을 PC13을 사용하므로 EXTI line[15:10] interrupt 항목을 Enable해줍니다.
5) 저장을 하면 변경한 Label이름으로 Input interrupt pin이 설정되어 Code로 generate되는 것을 확인 할 수 있다.
main.c
static void MX_GPIO_Init(void)
{
...
/*Configure GPIO pin : User_Btn_IT_Pin */
GPIO_InitStruct.Pin = User_Btn_IT_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(User_Btn_IT_GPIO_Port, &GPIO_InitStruct);
...
}
stm32f4xx_it.c
/**
* @brief This function handles EXTI line[15:10] interrupts.
*/
void EXTI15_10_IRQHandler(void)
{
/* USER CODE BEGIN EXTI15_10_IRQn 0 */
/* USER CODE END EXTI15_10_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(User_Btn_IT_Pin);
/* USER CODE BEGIN EXTI15_10_IRQn 1 */
/* USER CODE END EXTI15_10_IRQn 1 */
}
6) 원하는 파일에 Callback함수를 재정의하여 사용할 수 있다.
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_13 )
{
}
}
interrupt enable한 EXTI pin High될때 호출됨을 확인할 수 있다.
1) stm32f4xx.it.c
Systick_Handler함수에 HAL_SYSTICK_IRQHandler();를 추가한다.
2) 사용할 파일에 Callback함수를 재정의 하여 사용한다.
1ms마다 함수가 호출된다.
void HAL_SYSTICK_Callback(void)
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_14); //PB14 pin이 1ms주기로 toggle되는 것을 할 수 있다.
}
3) PB14 Pin이 High/Low 각각 1ms씩 유지되고
High/Low주기가 2ms임을 확인할 수 있다.
[STM] TIM7(Timer) 타이머 인터럽트 (0) | 2022.12.23 |
---|---|
[STM32]8bit parallel-in/serial-out shift registers (0) | 2022.12.12 |
[STM32]8bit Serial-in/Parallel-out Shift register Control (0) | 2022.12.12 |
[STM32]Uart 통신 (HAL_UART_Receive_IT/HAL_UART_Transmit) & printf (0) | 2022.12.09 |
[STM32]IDE Project 생성하기 (0) | 2022.12.08 |