STM32开发实战系列4-在时间夹缝中说话

举报
神龙居市 发表于 2022/02/23 20:09:42 2022/02/23
【摘要】 1、时钟系统的概念及意义 概念        时钟系统是由振荡器(信号源)、定时唤醒器、分频器等组成的电路。常用的信号源有晶体振荡器和RC振荡器。 意义        时钟是嵌入式系统的脉搏,处理器内核在时钟驱动下完成指令执行,状态变换等动作,外设部件在时钟的驱动下完成各种工作,比如串口数据的发送、A/D转换、定时器计数等等。因此时钟对于计算机系统是至关重要的,通常时钟系统出现问题也是致命的...

1、时钟系统的概念及意义

  1.  概念
            时钟系统是由振荡器(信号源)、定时唤醒器、分频器等组成的电路。常用的信号源有晶体振荡器和RC振荡器。
  2.  意义
            时钟是嵌入式系统的脉搏,处理器内核在时钟驱动下完成指令执行,状态变换等动作,外设部件在时钟的驱动下完成各种工作,比如串口数据的发送、A/D转换、定时器计数等等。因此时钟对于计算机系统是至关重要的,通常时钟系统出现问题也是致命的,比如振荡器不起振、振荡不稳、停振等。

2、STM32F0时钟源介绍

  1.  STM32 中有四个时钟源
  • HSI:高速内部时钟,RC振荡器,频率为8MHz;
  • HSE:高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz
  • LSI:低速内部时钟,RC振荡器,频率为40KHz。独立看门狗时钟源只能是这个,还可做RTC时钟源
  • LSE:低速外部时钟,接32.768KHz的石英晶体。这个主要是RTC的时钟源

3、SystemInit () 系统时钟初始化

  • void SystemInit(void) 

           System_stm32f0xx.c中定义,在系统启动之后,程序会先执行 HAL 库定义的 SystemInit 函数,进行系统一些初始化配置,复位 RCC 时钟配置为默认复位值(默认开启 HSI)

  • void SystemClock_Config(void)

             在main.c中定义,实现时钟的具体配置,配置PLL, 配置AHB和HPB的时钟

    4、代码SysTick中断

    系统在每隔一段时间就会产生一个中断,用来处理其他事情,中断的执行入口在 SysTick_Handler

    可以在函数名称上右键专项实现的位置(需要先编译通过,才能转到实现)

    在用户代码段内加入处理函数

    /**
      * @brief This function handles System tick timer.
      */
    void SysTick_Handler(void)
    {
      /* USER CODE BEGIN SysTick_IRQn 0 */
    
      /* USER CODE END SysTick_IRQn 0 */
      HAL_IncTick();
      /* USER CODE BEGIN SysTick_IRQn 1 */
      HAL_SYSTICK_IRQHandler(); //老版本系统自动有此方法,新版本需要手动加入
      /* USER CODE END SysTick_IRQn 1 */
    }

    同样转到HAL_SYSTICK_IRQHandler();函数的实现看看

    /**
      * @brief  This function handles SYSTICK interrupt request.
      * @retval None
      */
    void HAL_SYSTICK_IRQHandler(void)
    {
      HAL_SYSTICK_Callback();
    }
    
    /**
      * @brief  SYSTICK callback.
      * @retval None
      */
    __weak void HAL_SYSTICK_Callback(void)
    {
      /* NOTE : This function Should not be modified, when the callback is needed,
                the HAL_SYSTICK_Callback could be implemented in the user file
       */
    }

    这里的HAL_SYSTICK_Callback是一个弱函数,允许用户重新定义。看看里面的Note说明也知道了。如果需要时间中断回调到自己的代码,就重写次函数。

    我这里在main.c里面进行了实现。

    从分析系统时钟可以看出来,没1ms会产生一个中断,我这里实现了一个500ms反转一下LED灯的GPIO操作

    /* USER CODE BEGIN 0 */
    void HAL_SYSTICK_Callback(void)
    {
      static uint16_t tick = 0;
    	tick ++;
    	if(tick == 500)
    	{
    		HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
    		
    		tick=0;
    	}
    }
    /* USER CODE END 0 */
    【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
    • 点赞
    • 收藏
    • 关注作者

    评论(0

    0/1000
    抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。