板子到手,快一个星期了,然而年底却还是比较忙的,没时间搭理。今天有空,从官方提供的代码一个一个看过来。虽说HAL库比之前库的是更繁了点,但是静下心来看看,还是写的不错的。我感觉如今用到库函数,与底层的寄存器的交道越来与少。将来可能全部底层封装,只调用中间层和应用层。那搞软件的都可以兼职搞了,硬件的岂不是要失业。
在看到GPIO的第二个例程:GPIO_EXIT时,我看到了stm32f4xx_hal_gpio.c里面有个函数:
中断函数:
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
/* EXTI line interrupt detected */
if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
HAL_GPIO_EXTI_Callback(GPIO_Pin);
}
}
中断函数里的真正执行函数:
__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(GPIO_Pin);
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_GPIO_EXTI_Callback could be implemented in the user file
*/
}
对里面的 UNUSED(GPIO_Pin)进行define:
#define UNUSED(x) ((void)(x))
那么这个函数完全就是个空函数。
我去什么鬼!!这不是没有任何动作执行么?
细看里面的NOTE:说这个函数不必在意,当真正需要的时候,可以在USER的文件里重新写一个。
果然在main.c里面有个同名的:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_13)
{
/* Toggle LED1 */
BSP_LED_Toggle(LED1);
}
}
好家伙,这个才是正真的执行函数。
给我感觉被__weak 修饰的函数怎么有点类似C++里面的虚函数,如果无其他正真执行的就用它,有正真的执行函数就用正真的。
果然有意思,不是C语言么?怎么也支持这个!看来我的C基础还是不牢固啊!
|