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 */
}

+ Recent posts