이번엔 TIM9와 KEY 인터럽트를 이용해 GPIO 응용을 연습한 코드입니다.

PWM 출력으로 LED(커넥터에 점프선으로 직접 배선) 1초 주기로 on/off

  • 키 누른 회수가 5의 배수일 때마다 절반씩 주기 줄이며 돌아가며 변경.
    1초->0.5초->0.25->0.125초->1초..

*그리고 5의 배수나, 일정 카운트 이상일때 key 입력을 처리하는 것은 채터링 방지 효과가 있습니다.

해야할 것

아래 내용 모두 이전 포스팅에 이용 방법, 구조 설명 등 있습니다

  1. PE5와 GND -> LED를 꽂기.(긴 쪽 다리 +, 짧은 다리는 GND)

  2. key 익셉션 핸들러로 인터럽트 구현
  3. TIM9도 핸들러 구현
  4. (토글 주기)ARR값 변경할 값을 저장한 list만들기
  5. main안에 while문 동작 구현
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 (인터럽트 플래그 리셋.)
    NVIC->ISER[1]|=0x1<<8;


}
int cnt=0;
int id_cnt=0;
int ledtime[4]={20000, 10000, 5000, 2500};//1 0.5 0.25 0.125


void EXTI15_10_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI15_10_IRQn 0 */
    if(EXTI->PR & (0x1<<13)){
          EXTI->PR = (0x1<<13);//pending bit 클리어
          ++cnt;
          if(cnt%5==0){
               TIM9->ARR=ledtime[(++id_cnt)%4]-1;
               TIM9->CCR1=(TIM9->ARR+1)/2;
           }}
  /* USER CODE END EXTI15_10_IRQn 0 */
 // HAL_GPIO_EXTI_IRQHandler(USER_Btn_Pin);
  /* USER CODE BEGIN EXTI15_10_IRQn 1 */

  /* USER CODE END EXTI15_10_IRQn 1 */
}


char msg[100];
volatile int id = 0;
volatile int sended = 0;



void TIM9_Init(void){
    RCC->AHB1ENR |= 1<<4;//GPIOE PE5

    GPIOE->MODER &= ~(0x3<<(5*2));
    GPIOE->MODER |= (0x2<<(5*2));//AF

    GPIOE->AFR[0] &= ~(0xf<<20);//MUX PE5
    GPIOE->AFR[0] |= (0x3<<20);//AF3

    RCC->APB2ENR |= 1<<16;//TIM9 clock
    TIM9->CR1= 0x0<<0;
      //168MHz
    TIM9->PSC=8400-1;    // 20KHz
    TIM9->ARR=10000-1;    //  1KHz
    TIM9->CCR1 = (TIM9->ARR)/2; // duty : 50%

    TIM9->CCMR1 |= 0x6<<4;//pwm 1 mode
    TIM9->CCER|=0x1;//output channel1

    // 타이머 시작
    TIM9->CR1 |= (1 << 0);
}


/* 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 */
  EXTI_KEY_Init();

   TIM9_Init();
    //TIM6_Init();
  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */


  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
 /* MX_GPIO_Init();
  MX_ETH_Init();
  MX_USART3_UART_Init();
  MX_USB_OTG_FS_PCD_Init();
  MX_TIM9_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