button Key 인터럽트로 LED 토글하기(레지스터제어) | STM32cubeIDE(32F429ZI) :: skylarvv 님의 블로그
Key 인터럽트 활용 관해서 전에 필기해두었습니다.
Nucleo-STM32F429ZI 보드를 사용했으며
이번엔 Key가 눌리면
%d th Key pressed로 몇번째 출력인지, UART로 출력하는 코드 구현 연습입니다.(Tera Term으로 메세지 확인)
사용한 UART, GPIO, Key 등 구조와 레지스터 사용에 대해서는 이전에 작성한 글들이 있습니다.
void USART3_Init(void)
{
RCC->AHB1ENR |= 1<<3;// GPIOD 클럭 활성화
RCC->APB1ENR |= 1<<18;//USART3
//PD8,9핀 Alternative Function으로 설정
GPIOD->MODER &= ~((0x3 << (2 * 8)) | (0x3 << (2 * 9)));
GPIOD->MODER |= ((0x2 << (2 * 8)) | (0x2 << (2 * 9)));
//MUX AFR uart tx,rx핀으로 설정
GPIOD->AFR[1]&= ~(0xf<<4 | 0xf<<0);//MUX PD8,9(AFRH 8~15)
GPIOD->AFR[1] |= (0x7<<4 | 0x7<<0);//uart3(AF7)
//uart 레지스터 설정
USART3->CR1 = (1<<13 | 1<<3 | 1<<2);//UE,TE,RE
USART3->BRR = (22 << 4) | 13; //115200bps,42MHZ =356
}
void UART3_Send(char c){
while(!(USART3->SR>>7 & 0x1));
USART3->DR=c;
}
void UART3_Print(const char* str){
while(*str){
UART3_Send(*str++);
}
}
void EXTI_KEY_Init(void){
RCC->AHB1ENR |= (0x1 << 2); // GPIOC
GPIOC->MODER &= ~(0x3 << (2 * 13)); // PC13: 입력 모드
RCC->APB2ENR |= (1<<14);//SYSCFG
SYSCFG->EXTICR[3]&= ~(0xF <<4);
SYSCFG->EXTICR[3]|=(0x2<<4);//SYSCFG_EXTICR4(Port C)
EXTI->IMR |=(1<<13); //line13인터럽트 마스크
EXTI->RTSR |=(1<<13);//Rising edge
EXTI->PR = (1<<13);//pending (인터럽트 플래그 리셋.)
}
char msg[100];
int cnt=0;
void EXTI15_10_IRQHandler(void)
{
/* USER CODE BEGIN EXTI15_10_IRQn 0 */
if(EXTI->PR & (0x1<<13)){
EXTI->PR = (1<<13);//pending bit 클리어
++cnt;
sprintf(msg,"%d th Key pressed ",cnt);
UART3_Print(msg);
}
/* USER CODE END EXTI15_10_IRQn 0 */
//HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
/* USER CODE BEGIN EXTI15_10_IRQn 1 */
/* USER CODE END EXTI15_10_IRQn 1 */
}
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
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();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
USART3_Init();
NVIC->ISER[1]|=0x1<<8;//EXTI15_10->40번
EXTI_KEY_Init();
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
/* MX_GPIO_Init();
MX_ETH_Init();
MX_USART3_UART_Init();
MX_USB_OTG_FS_PCD_Init();*/
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
'Cortex-M' 카테고리의 다른 글
| 펌웨어 기본 동작 구현 3 - 시리얼 포트로 문자열 입출력, LED 주기 변경 | Nucleo-STMF429ZI (0) | 2025.05.25 |
|---|---|
| 펌웨어 기본 동작 구현2- Timer활용하여 1초 주기로 LED토글 (0) | 2025.05.25 |
| TIM9 구조와 활용, 익셉션(인터럽트)활용, PWM 파형 출력 (로직 애널라이저) (0) | 2025.05.25 |
| TIM6 타이머 -polling, 익셉션 핸들러(인터럽트) 이용 | STMF429ZI (0) | 2025.05.25 |
| IWDG Independent watch dog | 레지스터 제어로 코드 구현(STM32F429ZI) (0) | 2025.05.23 |