简单记录一些折腾过的STM32程序。
MCU:STM32F103C8T6
HAL:STM32Cube_FW_F1_V1.8.4
GPIO的(按键)输入&输出(LED)
STM32CubeMX配置
将I/O口PB13
设置为输入模式
输出到LED的I/O口PC13
初始化为高电平,设置为推挽输出模式
选择高速时钟(HSE)为晶振/陶瓷振荡器
还需要对SYS
进行如下配置:
Clock Configuration
设置如下:
源码
在main.c
文件的main()
函数前添加一段自定义延时程序(延时长不确定),用于按键消抖;例如:
void delay(uint16_t x) //延时一段时间 |
在main()
函数的while
循环下添加如下程序:
LED初始处于熄灭状态,每次按下按键,LED的亮灭状态与此次按下按键前相反。
由按键触发的外部中断
STM32CubeMX配置
将I/O口PB14
配置为外部中断模式,上升沿触发
I/O口PC14
控制LED亮灭。
使能中断
RCC
、SYS
、Clock Configuration
配置照旧。
源码
在工程项目的stm32f1xx_it.c
文件中可找到STM32CubeMX生成的的中断服务函数EXTI15_10_IRQHandler(void)
中断服务函数EXTI15_10_IRQHandler(void)
调用GPIO外部中断处理函数HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
GPIO外部中断处理函数首先重置相应的中断标志位,然后调用中断回调函数HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
stm32f1xx_hal_gpio.c
文件的HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
函数在定义时使用了修饰符__weak
,表示这是一个弱函数,用户可以再定义一个同名的函数,编译器在编译的时候会选择用户定义的函数(无__weak
);若用户没有定义同名函数,编译器就会选择该函数(有__weak
)。
在main.c
文件中自定义一个中断回调函数HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
LED初始处于熄灭状态,每次按下按键,LED的亮灭状态与此次按下按键前相反。
定时器中断
STM32CubeMX配置
I/O口PC15
控制LED亮灭
RCC
、SYS
、Clock Configuration
配置照旧。
选择TIM2
,定时长500ms
Prescaler
(定时器分频系数):7199
Counter Mode
(计数模式):Up
(向上计数)
Counter Period
(自动重装载值):4999
CKD
(时钟分频因子):No Division
(不分频)
auto-reload preload
(自动重装载):Enable
使能TIM2
中断
源码
在stm32f1xx_it.c
文件中可以找到TIM2中断服务函数TIM2_IRQHandler(void)
,该函数调用定时器中断处理函数HAL_TIM_IRQHandler(&htim2)
。
HAL_TIM_IRQHandler(&htim2)
判断定时器中断类型和定时器通道,然后调用相应的中断回调函数,本程序用到的是定时器溢出中断回调函数,即HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
;在stm32f1xx_hal_tim.c
文件中可以找到弱函数HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
。
在main.c
文件内添加自定义的定时器溢出中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) |
再在main.c
文件的main()
函数内使能定时器2
HAL_TIM_Base_Start_IT(&htim2); |
LED亮灭交替。
参考资料:
【STM32】STM32CubeMX教程二–基本使用(新建工程点亮LED灯)