이번엔 TIM9와 KEY 인터럽트를 이용해 GPIO 응용을 연습한 코드입니다.
PWM 출력으로 LED(커넥터에 점프선으로 직접 배선) 1초 주기로 on/off
- 키 누른 회수가 5의 배수일 때마다 절반씩 주기 줄이며 돌아가며 변경.
1초->0.5초->0.25->0.125초->1초..
*그리고 5의 배수나, 일정 카운트 이상일때 key 입력을 처리하는 것은 채터링 방지 효과가 있습니다.
해야할 것
아래 내용 모두 이전 포스팅에 이용 방법, 구조 설명 등 있습니다
- PE5와 GND -> LED를 꽂기.(긴 쪽 다리 +, 짧은 다리는 GND)


- key 익셉션 핸들러로 인터럽트 구현
- TIM9도 핸들러 구현
- (토글 주기)ARR값 변경할 값을 저장한 list만들기
- 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 */
}
'Cortex-M' 카테고리의 다른 글
| 펌웨어 기본 동작 구현 5- PWM 출력으로 부저 도->레->미 출력, KEY입력으로 음 변경하기 (0) | 2025.05.25 |
|---|---|
| 펌웨어 기본 동작 구현 3 - 시리얼 포트로 문자열 입출력, LED 주기 변경 | Nucleo-STMF429ZI (0) | 2025.05.25 |
| 펌웨어 기본 동작 구현2- Timer활용하여 1초 주기로 LED토글 (0) | 2025.05.25 |
| 펌웨어 기본 동작 구현1- Key 입력 시 눌린 순서 번호+문장 UART출력 | STM32CubeIDE ,STM32F429ZI (0) | 2025.05.25 |
| TIM9 구조와 활용, 익셉션(인터럽트)활용, PWM 파형 출력 (로직 애널라이저) (0) | 2025.05.25 |