STM32 (21) 썸네일형 리스트형 [stm32F746] PWM * 목표 : PWM 생성하고 100ms마다 PWM 10씩 변화 1. TIM PWM 설정 2. 코드 작성 1) PWM 시작 함수 /* USER CODE BEGIN 2 */ if(HAL_TIM_PWM_Start(&htim12, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } /* USER CODE END 2 */ 2) PWM 변화 /* USER CODE BEGIN WHILE */ uint16_t ccr = 0; while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ TIM12->CCR1 = ccr; ccr += 10; if(ccr > TIM12->ARR) ccr = 0; HAL_Delay(100); } /* USER .. [stm32F746] printf 사용 시 추가해야할 코드 #include ------------------------------------- /* USER CODE BEGIN 0 */ #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* __GNUC__ */ /** * @brief Retargets the C library printf function to the U.. [stm32F746] UART + LED control * UART 통신을 통해 '0' -> LED OFF / '1' -> LED ON 1) USART1_IRQHandler() 함수 구현 - stm32f7xx_it.c 파일에 USART1 수신 인터럽트 발생 시 콜백 함수를 호출하고 플래그를 클리어해 주는 코드 작성 void USART1_IRQHandler(void) { /* USER CODE BEGIN USART1_IRQn 0 */ if((__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET) && (__HAL_UART_GET_IT_SOURCE(&huart1, UART_IT_RXNE) != RESET)) { HAL_UART_RxCpltCallback(&huart1); // 콜백 함수 호출 __HAL_UART_CLEA.. [stm32F746] UART Echo 프로그램 * 목표 : USART 수신 인터럽트를 이용하여 수신 데이터를 링 버퍼에 저장하고 링 버퍼 데이터를 읽어 송신하는 Echo 1. USART1 인터럽트 설정 - 인터럽트 사용하기 위해 enable 설정 / Call HAL handler 체크 해제 2. 코드 작성 1) 링 버퍼 라이브러리 프로젝트 추가 2) USART1_IRQHandler() 함수 구현 - stm32f7xx_it.c 파일에 USART1 수신 인터럽트 발생 시 콜백 함수를 호출하고 플래그를 클리어해 주는 코드 작성 void USART1_IRQHandler(void) { /* USER CODE BEGIN USART1_IRQn 0 */ if((__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET) && .. [stm32F746] 100ms마다 USART1 1byte tx test * 목표 : 타이머를 사용하여 100ms마다 UART1 1byte data(0x1) 송신 1. 코드 작성(main.c) /* USER CODE BEGIN PV */ volatile int gTimerCnt; // Count를 위한 변수 /* USER CODE END PV */ ----------------------------------------------------------------- - 타이머 시작 함수 호출 /* USER CODE BEGIN 2 */ if(HAL_TIM_Base_Start_IT(&htim3) != HAL_OK) { Error_Handler(); } /* USER CODE END 2 */ ---------------------------------------------------.. [stm32F746] UART 송신 while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_Delay(3); // 3ms delay USART1->TDR = 0x1; // tx data = 0x1 } [stm32F746] 3. 외부인터럽트 + 타이머 * 목표 : 스위치를 누를 때 외부인터럽트가 발생하여 LED가 3초 켜지고 꺼진다. - 인터럽트 루틴은 시간이 많이 걸리는 코드를 실행하면 문제가 생길 수 있음. 따라서 인터럽트는 flag를 처리하고 메인 무한루프 안에서 flag를 체크해서 처리하도록 작성함 - MX 설정은 이전의 2 와 동일 1. 코드 작성(main.c) void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == GPIO_PIN_11) { flag = 1; // 인터럽트 발생 시 콜백함수에서는 flag 값만 변경 } } --------------------------------------------------------------------------------------- whi.. [stm32F746] 2. EXTI (외부인터럽트) * 목표 : 보드의 B1(User Button)을 누르면 외부 인터럽트가 발생하여 LED(PK3) Toggle 1. GPIO 설정 - button이 연결된 PK3 핀을 EXTI_OUTPUT으로 설정 - mode : External Interrupt Mode with Falling edge trigger detection => B1 버튼 회로도를 보면 버튼을 눌렀을 때 신호가 High에서 Low로 바뀌도록 설계되어 있음. 따라서, 버튼을 누를 때 인터럽트가 발생하게 하려면 Falling edge 모드로 변경하는 것이 적합. 2. NVIC 설정 - EXTI line interrupt : ENABLE 설정 3. 코드 작성 - 인터럽트가 발생하면 EXT15_10_IRQHandler() -> HAL_GPIO_EX.. 이전 1 2 3 다음