#include "stm32c0xx_hal.h"
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
// Mức ưu tiên 0 dành cho SysTick để HAL_Delay không bị treo
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
// Mức ưu tiên: SW3 (D7) > SW2 (D3) > SW1 (A0)
HAL_NVIC_SetPriority(EXTI4_15_IRQn, 1, 0); // SW3 (PA8) - Ưu tiên 1
HAL_NVIC_SetPriority(EXTI2_3_IRQn, 2, 0); // SW2 (PB3) - Ưu tiên 2
HAL_NVIC_SetPriority(EXTI0_1_IRQn, 3, 0); // SW1 (PA0) - Ưu tiên 3
HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);
HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);
HAL_NVIC_EnableIRQ(EXTI0_1_IRQn);
while (1) {
// Chờ ngắt xảy ra
}
}
// ISR cho SW1 (PA0)
void EXTI0_1_IRQHandler(void) {
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}
// ISR cho SW2 (PB3)
void EXTI2_3_IRQHandler(void) {
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
}
// ISR cho SW3 (PA8)
void EXTI4_15_IRQHandler(void) {
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_8);
}
// Callback xử lý logic
void HAL_GPIO_EXTI_FallingCallback(uint16_t GPIO_Pin) {
if (GPIO_Pin == GPIO_PIN_0) { // SW1 (Xanh lá)
for (int i = 0; i < 5; i++) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_SET); // LED1 (D2)
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_RESET);
HAL_Delay(500);
}
}
else if (GPIO_Pin == GPIO_PIN_3) { // SW2 (Xanh dương)
for (int i = 0; i < 10; i++) {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET); // LED2 (D4)
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
HAL_Delay(100);
}
}
else if (GPIO_Pin == GPIO_PIN_8) { // SW3 (Vàng)
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET); // LED3 (D5)
HAL_Delay(3000);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET);
}
}
// Khởi tạo GPIO
static void MX_GPIO_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
// 1. Cấu hình 3 LED làm Output
// LED1 ở D2 (PA10)
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// LED2 ở D4 (PB5) và LED3 ở D5 (PB4)
GPIO_InitStruct.Pin = GPIO_PIN_4 | GPIO_PIN_5;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// 2. Cấu hình 3 Nút bấm (Ngắt sườn xuống, trở kéo lên nội)
// SW1 ở A0 (PA0), SW3 ở D7 (PA8)
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// SW2 ở D3 (PB3)
GPIO_InitStruct.Pin = GPIO_PIN_3;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}Loading
st-nucleo-c031c6
st-nucleo-c031c6