一.现象(未使用freertos等操作系统) 不管是在main中的task还是中断服务函数,调用HAL_Delay系统就处于卡死状态;(起初怀疑优先级过低导致,但NVIC配置Base SysTick优先级高于中断优先级也不触发Base SysTick中断) 二.断点调试 发现HAL_GetTick()->uwTick始终不变,问题确定uwTick未进行设置,对应到改变uwTick的库函数HA...
HAL库,笔者的理解是,ST把对不同系列MCU的操作经过一层一层的封装,将硬件进行抽象化表达出来,最后呈现给我们的就是HAL库。硬件抽象化,也就是将对寄存器的操作做了一系列封装,将外设抽象组织为句柄,使我们看不到寄存器的影子,最后分离出可以调用的API,使用者可以不去关注底层、不必关注复杂的硬件寄存器就可以进行...
HAL_GetTick 函数主要用于提供自系统启动以来的时间基准,通常用于实现延时、超时检测等功能。 返回值类型: HAL_GetTick 函数的返回值类型是 uint32_t,即无符号32位整数。 返回值的具体含义: 返回值表示自系统启动以来经过的毫秒数。每次 SysTick 定时器中断发生时,该值会自增 1,因此它反映了系统运行的时间长度...
多实例特性意味着应用程序的所有API都是可重入的,因此会避免使用全局变量,当子例程递归调用时,如果子例程依赖全局变量保持不变但是该变量在循环调用时发生改变,则可能会造成子例程无法重入; 因此要遵守: 可重入代码区域不应包含任何静态或全局的非常量数据,可重入函数则可以使用全局数据;例如在整个中断服务函数中使用硬...
static uint32_t SD_PowerON(SD_HandleTypeDef *hsd) { __IO uint32_t count = 0; uint32_t response = 0, validvoltage = 0; uint32_t errorstate = HAL_SD_ERROR_NONE; #if (USE_SD_TRANSCEIVER != 0U) uint32_t tickstart = HAL_GetTick(); #endif /* CMD0: GO_IDLE_STATE */ error...
* @param hsd: Pointer to SD handle * @retval None */ void HAL_SD_IRQHandler(SD_HandleTypeDef *hsd) { uint32_t errorstate = HAL_SD_ERROR_NONE; uint32_t tickstart = HAL_GetTick(); /* Check for SDMMC interrupt flags */ if (__HAL_SD_GET_FLAG(hsd, SDMMC_IT_DATAEND) != RESET...