#include "stm32f10x.h"void delay_ms(uint32_t ms)
{for (uint32_t i = 0; i < ms * 8000; i++){ // 8 MHz HSI}
}void GPIO_Inits(void)
{// 1. 启用 GPIO 时钟、AFIO时钟使能RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_AFIOEN;GPIOA->CRL |= GPIO_CRL_CNF0_1;GPIOA->CRL &= ~GPIO_CRL_CNF0_0;GPIOA->CRL &= ~GPIO_CRL_MODE0;GPIOA->ODR &= ~GPIO_ODR_ODR0;// 配置 PA1 为推挽输出(2 MHz)GPIOC->CRH &= ~(GPIO_CRH_CNF13 | GPIO_CRH_MODE13);GPIOC->CRH |= GPIO_CRH_MODE13_1; // 2 MHz 输出 (10)GPIOC->ODR &= ~GPIO_ODR_ODR13;// 2. 选择 EXTI0 的PA0AFIO->EXTICR[0] |= AFIO_EXTICR1_EXTI0_PA;// 3.配置EXTI// 上升沿触发EXTI->RTSR |= EXTI_RTSR_TR0;// 开启中断频闭寄存器EXTI->IMR |= EXTI_IMR_MR0;NVIC_SetPriorityGrouping(3);NVIC_SetPriority(EXTI0_IRQn, 1); // 设置优先级// 启用中断NVIC_EnableIRQ(EXTI0_IRQn); // 启用 TIM1 更新中断
}void EXTI0_IRQHandler(void)
{EXTI->PR |= EXTI_PR_PR0; // 清除中断标志位delay_ms(10);if ((GPIOA->IDR & GPIO_IDR_IDR0) != 0){GPIOC->ODR ^= GPIO_ODR_ODR13; // 翻转PA0}
}int main(void)
{GPIO_Inits();