STM32 HAL各种外设配置方法(不包括CubeMX)

1.外部中断

只需要在CubeMX里对IO配置,自己重写一下回调函数就行了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin==KEY0_Pin)
{
HAL_Delay(10);/* 延时一小段时间,消除抖动 */
if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin)==GPIO_PIN_RESET)
flag=0;
}
else if(GPIO_Pin==KEY2_Pin)
{
HAL_Delay(10);/* 延时一小段时间,消除抖动 */
if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)==GPIO_PIN_RESET)
flag=1;
}
else if(GPIO_Pin==KEY1_Pin)
{
HAL_Delay(10);/* 延时一小段时间,消除抖动 */
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==GPIO_PIN_RESET)
flag=2;
}
}

2.定时器中断

1.实例一个相应定时器的结构体

1
TIM_HandleTypeDef htim2;

2.在main.c主函数上方初始化使能定时器(自己写)

1
HAL_TIM_Base_Start_IT(&htim2);

3.重写中断的回调函数

1
2
3
4
5
6
7
8
9
10
11
12
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static unsigned char ledState = 0;
if (htim == (&htim2))
{
if (ledState == 0)
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_15,GPIO_PIN_RESET);
else
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_15,GPIO_PIN_SET);
ledState = !ledState;
}
}
  • 若主函数内容较少,由于优化作用,程序可能一直在定时器中断内循环,这样的话可以在主函数内加点内容使其时间增长或者把优化等级降低

3.PWM

1.实例一个相应定时器的结构体

1
TIM_HandleTypeDef htim3;

2.在main.c主函数上方使能PWM通道(自己写)

1
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);

3.用户自定义占空比

1
__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_1,123);

==HAL库定时器配置了PWM也可以用定时器中断,用之前开启定时器并且重写回调函数就行了==

如果不用定时器中断则不需要HAL_TIM_Base_Start_IT();