STM32源码阅读记录之HAL库(SystemTick)

这篇具有很好参考价值的文章主要介绍了STM32源码阅读记录之HAL库(SystemTick)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题

  1. HAL_Delay是怎么做到可以延迟控制的?

分析记录

步骤01:看函数本身

void HAL_Delay(uint32_t Delay);

/**
  * @brief 此函数根据变量递增提供最小延迟(以毫秒为单位)。
  * @note 在默认的实现中,SysTick计时器是时基的来源。它用于以固定的时间间隔生成中断,其中 uwTick 递增
  * @note 此函数声明为__weak在用户文件中出现其他实现时要覆盖。
  * @param Delay 指定延迟时间长度(以毫秒为单位)。
  * @retval None
  */
__weak void HAL_Delay(uint32_t Delay)
{
  // 获取一个计数值,简单来说就是一个记录当前时刻的记录值
  uint32_t tickstart = HAL_GetTick();
 
  uint32_t wait = Delay;

  /* 添加频率以保证最短的等待时间 */
  if (wait < HAL_MAX_DELAY)
  {
    wait += (uint32_t)(uwTickFreq);
  }
  //  死循环,直到不满足要求时结束
  while ((HAL_GetTick() - tickstart) < wait)
  {
  }
}

uint32_t HAL_GetTick(void)

/**
  * @brief 提供以毫秒为单位的刻度值。
  * @note  此函数声明为__weak在用户文件中出现其他实现时要覆盖。
  * @retval tick value
  */
__weak uint32_t HAL_GetTick(void)
{
  return uwTick;
}

void HAL_IncTick(void)

/**
  * @brief 调用此函数以递增用作应用程序时基的全局变量“uwTick”。
  * @note 在默认实现中,此变量在 SysTick ISR 中每 1 毫秒递增一次。
  * @note 此函数声明为__weak在用户文件中出现其他实现时要覆盖。
  * @retval None
  */
__weak void HAL_IncTick(void)
{
  uwTick += uwTickFreq;
}

步骤02:观察相关联的变量

STM32源码阅读记录之HAL库(SystemTick),STM32之HAL源码记录,stm32,单片机,嵌入式硬件

步骤03:观察变化的地方

STM32源码阅读记录之HAL库(SystemTick),STM32之HAL源码记录,stm32,单片机,嵌入式硬件1. 在SysTick_Handler中被调用
STM32源码阅读记录之HAL库(SystemTick),STM32之HAL源码记录,stm32,单片机,嵌入式硬件

步骤04:中断要执行是需要开启的

  1. 在程序的开头HAL_Init();
    STM32源码阅读记录之HAL库(SystemTick),STM32之HAL源码记录,stm32,单片机,嵌入式硬件STM32源码阅读记录之HAL库(SystemTick),STM32之HAL源码记录,stm32,单片机,嵌入式硬件
/**
  * @brief  此函数用于初始化 HAL 库;它必须是在主程序中执行的第一个指令(在调用任何其他 HAL 函数之前), 它执行以下操作:
  *           1. 配置闪存预取。
  *           2. 将 SysTick 配置为每 1 毫秒生成一次中断,
  *           3. 由 HSI 计时(在此阶段,时钟尚未配置,因此系统从内部 HSI 以 16 MHz 运行).
  *           4. 将 NVIC 组优先级设置为 4
  *           5. 调用用户文件 “stm32f1xx_hal_msp.c” 中定义的 HAL_MspInit() 回调函数来执行全局低级硬件初始化
  *
  * @note   SysTick 用作 HAL_Delay() 函数的时基,应用程序需要确保 SysTick 时基始终设置为 1 毫秒,以便具有正确的 HAL 操作
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_Init(void) {
    /* 配置闪存预取 */
#if (PREFETCH_ENABLE != 0)
#if defined(STM32F101x6) || defined(STM32F101xB) || defined(STM32F101xE) || defined(STM32F101xG) || \
    defined(STM32F102x6) || defined(STM32F102xB) || \
    defined(STM32F103x6) || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG) || \
    defined(STM32F105xC) || defined(STM32F107xC)

    /* 预取缓冲区在超值行设备上不可用 */
    __HAL_FLASH_PREFETCH_BUFFER_ENABLE();
#endif
#endif /* PREFETCH_ENABLE */

    /* NVIC 组优先级设置 */
    HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);

    /*将 SysTick 配置为每 1 毫秒生成一次中断(重置后的默认时钟为 HSI) */
    HAL_InitTick(TICK_INT_PRIORITY);

    /* 初始化低级硬件 */
    HAL_MspInit();

    /* 返回函数状态 */
    return HAL_OK;
}

步骤04:查看HAL_InitTick执行函数

STM32源码阅读记录之HAL库(SystemTick),STM32之HAL源码记录,stm32,单片机,嵌入式硬件

/**
  * @brief 此函数配置时基源。时间源配置为具有 1ms 时基,具有专用的 Tick 中断优先级
  * @note 此函数在程序开始时由 HAL_Init() 重置后或在时钟由 HAL_RCC_ClockConfig() 重新配置时自动调用。
  * @note 在默认实现中,SysTick 计时器是时基的来源。它用于以固定的时间间隔生成中断。
  *       如果从外设 ISR 进程调用 HAL_Delay(),则必须小心,SysTick 中断的优先级必须高于外设中断(数值较低)。否则,调用方 ISR 进程将被阻止。
  * @param TickPriority Tick interrupt priority.
  * @retval HAL status
  */
__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) {
    /* 将系统滴答配置为在 1ms 时间内中断*/
    if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U) {
        return HAL_ERROR;
    }

    /* 配置系统滴答 IRQ 优先级 */
    if (TickPriority < (1UL << __NVIC_PRIO_BITS)) {
        HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U);
        uwTickPrio = TickPriority;
    } else {
        return HAL_ERROR;
    }

    /* Return function status */
    return HAL_OK;
}

步骤05: 查看HAL_SYSTICK_Config函数

  1. 这一步就是对外再包装了一层
    STM32源码阅读记录之HAL库(SystemTick),STM32之HAL源码记录,stm32,单片机,嵌入式硬件

步骤06: 查看SysTick_Config函数(实际执行的)

STM32源码阅读记录之HAL库(SystemTick),STM32之HAL源码记录,stm32,单片机,嵌入式硬件

步骤07: 重点记录SystemCoreClock的变化:

STM32源码阅读记录之HAL库(SystemTick),STM32之HAL源码记录,stm32,单片机,嵌入式硬件STM32源码阅读记录之HAL库(SystemTick),STM32之HAL源码记录,stm32,单片机,嵌入式硬件

第一次使用的地方

STM32源码阅读记录之HAL库(SystemTick),STM32之HAL源码记录,stm32,单片机,嵌入式硬件

第一次变化的地方

STM32源码阅读记录之HAL库(SystemTick),STM32之HAL源码记录,stm32,单片机,嵌入式硬件

查看HAL_RCC_ClockConfig执行函数

STM32源码阅读记录之HAL库(SystemTick),STM32之HAL源码记录,stm32,单片机,嵌入式硬件STM32源码阅读记录之HAL库(SystemTick),STM32之HAL源码记录,stm32,单片机,嵌入式硬件文章来源地址https://www.toymoban.com/news/detail-672119.html

到了这里,关于STM32源码阅读记录之HAL库(SystemTick)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32】HAL库自学记录-旋转编码器的使用

    通过本文可学会两种实现判断旋转编码器正转反转的方法,可根据自己的应用场景来选择使用哪种方法。 1、芯片:STM32F103RCT6 2、STM32CubeMx软件 3、IDE: MDK-Keil软件 4、旋转编码器模块 5、XCOM V1.4串口软件 图中C端为GND。 方向 :A相和B相相差一个相位,一般来说是90°。A相信号在

    2024年02月11日
    浏览(49)
  • STM32 HAL库多路PWM没有输出踩坑记录

      之前只弄过单路的,这次想用4路PWM,CUBE里面一顿配置,生成,然后套用之前的代码: 这算是开启第一路了,心想后面无非就复制几条,改下通道的事了,无意中点了下TIM_CHANNEL_1,进头文件看看: 看到TIM_CHANNEL_ALL时,眼前一亮,连续开启1、2、3、4怎么都显得不够优雅,于

    2024年02月20日
    浏览(34)
  • HAL库STM32CUBEMX学习记录(一)——USART(串口中断收发数据)

    一、首先使用STM32CUBEMX新建一个工程 二、打开工程文件 1.在usart.c中添加以下代码  2.然后在最后面加入中断回调函数 3.在usart.h文件中加入  4.新建一个cmd.c文件,创建命令check函数 5.在mian函数中的while(1)循环中调用USART1_Check(USART_RX_BUF)函数 6.最后串口初始化函数后打开串口中

    2024年02月16日
    浏览(42)
  • STM32---SG90舵机控制(HAL库,含源码)

    写在前面: 在嵌入式的项目中,舵机是一个十分常见的元器件模块,其主要的功能是实现机械转动,实质上舵机是一个伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。例如在机器人的电控制器系统中,飞行器设计,遥控机器人等。舵机的使用需要PWM信号

    2024年04月13日
    浏览(32)
  • 单片机:STM32F4x HAL库软硬SPI驱动ST7735s 1.8寸LCD屏幕

    说明:此篇为学习记录。可能存在错误或者不足。如有问题请指出。 主控芯片:STM32F411CEU6 主控开发板:WeAct STM32F411CEU6最小系统板 TFT-LCD屏幕:合宙1.8寸TFT-LCD,驱动为ST7735s MDK版本:5,32 HAL库版本:1.27.1 STM32CubeMX版本:6.7.0 ST7735s支持8080并口,3线和4线串行接口,模块的驱动方

    2024年02月03日
    浏览(57)
  • 0.96OLED 4针IIC STM32-HAL库版本(附源码)

    OLED源码放在文章末,有需要自己下滑取用即可。关于如何移植到自己定义的引脚上也做了说明。 另外,本人在代码中封装了一个OLED显示的接口,方便开发者对字符显示位置的快速定位,以及像C语言printf()函数一样在屏幕上进行int,float,char等变量的格式化输出。非常方便实用

    2023年04月26日
    浏览(100)
  • stm32毕设 单片机与GSM的手机短信收发系统(源码+论文)

    Hi,大家好,这里是丹成学长,今天向大家介绍一个 单片机项目 毕业设计 单片机与GSM的手机短信收发系统(源码+论文) 大家可用于 课程设计 或 毕业设计 🧿 项目分享:见文末! 使用单片机控制GSM,首先:单片机下载完程序后,先不要接GSM,先让单片机和电脑通信,利用串口

    2024年04月25日
    浏览(36)
  • 单片机毕设 STM32智能饮水机控制系统(源码+硬件+论文)

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月11日
    浏览(45)
  • 单片机毕设 stm32智能鱼缸监控投喂系统(源码+硬件+论文)

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年03月18日
    浏览(61)
  • 使用标准库和HAL库的STM32单片机进行串口通信/解决因例程为HAL库的传感器,而其他模块都是标准库,需要将数据用串口传送给标准库的单片机的相关问题

    (本文使用STM32F103C8T6,在CubeMX里演示用的是RBT6,但实际上引脚是一样的)         本文 着重解决一个大工程中,某些传感器的例程是HAL库的,而其他模块(或算法)都是标准库,导致难以移植的问题。 本文的解决方法是:使用一片单片机用HAL库(CubeMX)配置例程,然后

    2024年02月06日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包