0%

STM32-HAL折腾杂记(一)

简单记录一些折腾过的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)		//延时一段时间
{
uint16_t i,j;
for(i=0;i<x;i++)
{
for(j=0;j<65535;j++);
}
}

main()函数的while循环下添加如下程序:

LED初始处于熄灭状态,每次按下按键,LED的亮灭状态与此次按下按键前相反。

由按键触发的外部中断

STM32CubeMX配置

将I/O口PB14配置为外部中断模式,上升沿触发

I/O口PC14控制LED亮灭。

使能中断

RCCSYSClock 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亮灭

RCCSYSClock 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)
{
if(htim==(&htim2))
{
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_15);
}
}

再在main.c文件的main()函数内使能定时器2

HAL_TIM_Base_Start_IT(&htim2);

LED亮灭交替。


参考资料

【STM32】STM32CubeMX教程二–基本使用(新建工程点亮LED灯)

【STM32】HAL库 STM32CubeMX教程三—-外部中断(HAL库GPIO讲解)

【STM32】HAL库 STM32CubeMX教程六—-定时器中断