你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

物联网之STM32开发五(时钟系统)

[复制链接]
STMCU 发布时间:2020-9-27 14:48
STM32-时钟系统内容概要:

STM32时钟系统概述

SysTick定时器讲解

HAL_Delay()函数的实现

STM32通用定时器介绍

STM32通用定时器实例


STM32时钟系统概述

内容概要:

时钟系统的概念及意义

常见振荡器介绍

时钟树分析

时钟配置

时钟系统的概念及意义:


概念:时钟系统是由振荡器(信号源)、定时唤醒器、分频器等组成的电路。常用的信号源有晶体振荡器和RC振荡器。

意义:时钟是嵌入式系统的脉搏,处理器内核在时钟驱动下完成指令执行,状态变换等动作,外设部件在时钟的驱动下完成各种工作,比如串口数据的发送、A/D转换、定时器计数等等。因此时钟对于计算机系统是至关重要的,通常时钟系统出现问题也是致命的,比如振荡器不起振、振荡不稳、停振等。


1_meitu_1.jpg


常见振荡器简介:

概念:振荡器是用来产生重复电子讯号的电子元件。其构成的电路叫振荡电路,能将直流电转换为具有一定频率交流信号输出的电子电路或装置。

分类:振荡器主要分为RC,LC振荡器和晶体振荡器。RC振荡器是采用RC网络作为选频移相网络的振荡器。LC振荡器是采用LC振荡回路作为移相和选频网络的正反馈振荡器。晶体振荡器的振荡频率受石英晶体控制。

RC振荡器:

RC振荡器是又电阻电容构成的振荡电路,能将直流电转换为具有一定频率交流信号输出的电子电路或装置。

优点:实现的成本比较低,毕竟就是一个电阻电容

缺点:由于电阻电容的精度问题所以RC振荡器的震荡频率会有误差,同时受到温度、湿度的影响


2_meitu_2.jpg


晶体振荡器:

石英晶体振荡器是高精度和高稳定度的振荡器,被广泛应用于彩电、计算机、遥控器等各类振荡电路中,以及通信系统中用于频率发生器、为数据处理设备产生时钟信号和为特定系统提供基准信号。

优点:相对来说震荡频率一般都比较稳定,同时精度也较高

缺点:就是价格要稍微高点了,还有用晶体振荡器一般还需要接两个15-33pF起振电容


3_meitu_3.jpg


STM32F0时钟源介绍:

STM32 中有四个时钟源:

    HSI:高速内部时钟,RC振荡器,频率为8MHz;

    HSE:高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz

    LSI:低速内部时钟,RC振荡器,频率为40KHz。独立看门狗时钟源只能是这个,还可做RTC时钟源

    LSE:低速外部时钟,接32.768KHz的石英晶体。这个主要是RTC的时钟源


STM32 时钟树的分析:


4_meitu_4.jpg



复位和时钟控制 (RCC):

5_meitu_5.jpg



STM32Cubemx配置时钟:

6_meitu_6.jpg



SystemInit () 系统时钟初始化:

void SystemInit(void)

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

void SystemClock_Config(void)

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



SysTick定时器讲解

内容概要:

SysTick定时器简介

SysTick定时器工作原理分析

SysTick寄存器

SysTick定时器使用实例

SysTick定时器简介:


概念:

    定时器,能够定时、计数的器件称为定时器。

    SysTick,  称作系统滴答定时器,简称滴答定时器。是一个定时设备,位于Cortex-M0内核中,可以对输入的时钟进行计数,当然,如果时钟信号是周期性的,计数也就是计时。

    系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。根据这个中断,系统就可以实现时间片的计算从而切换进程。


工作原理:滴答定时器是一个24位定时器,也就是最多能计数2^24。在使用的时候,我们一般给计数器送一个初始的计数值,计数器向下计数,每来一个时钟信号,计数初值就减一,计数值减到0的时候,就会发出一次中断。然后重新从计数初值再减一计数,循环不断。

SysTick定时器工作原理图:


7_meitu_7.jpg



SysTick寄存器:

8_meitu_8.jpg



9_meitu_9.jpg



SysTick定时器初始化:

Main中已经实现对SysTick定时器的初始化



  1. void SystemClock_Config(void);
  2. HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);//HAL_RCC_GetHCLKFreq()函数得到的就是HCLK的频率,除以1000表示1/(HCLK/1000)秒钟计数一次
  3. SysTick_Config(TicksNumb);
复制代码


在core_cm0.h定义了SysTick_Config(uint32_t ticks)


10_meitu_10.jpg



SysTick中断相关:



11_meitu_11.jpg



SysTick定时器使用实例:


实例: 利用SysTick定时器实现0.5秒钟打印一个字符串



12_meitu_12.jpg



设置串口:


13_meitu_13.jpg



设置系统时钟为外部时钟:

14_meitu_14.jpg



追加到回调函数:

15_meitu_15.jpg



16_meitu_16.jpg



在main.c函数中重新编写fputc 和 回调函数:

17_meitu_17.jpg



  1. int fputc(int ch,FILE *f){       
  2.     while((USART1->ISR&(1<<7)) == 0);       
  3.     USART1->TDR=(uint8_t)ch;
  4.     return ch;
  5. }

  6. void HAL_SYSTICK_Callback(void)
  7. {
  8.         static int time_flag = 0;
  9.         time_flag++;
  10.         if(time_flag >= 500)
  11.         {
  12.                 printf("this is systick test!\n");
  13.                 time_flag = 0;
  14.         }
  15. }
复制代码

测试结果:

18.png


HAL_Delay()函数的实现

HAL_Delay()分析:

利用SysTick实现精准的延时:


  1. __weak void HAL_Delay(__IO uint32_t Delay)
  2. {
  3.   uint32_t    tickstart = 0U;

  4.   tickstart     = HAL_GetTick();
  5.   while((HAL_GetTick() - tickstart) < Delay) ;
  6. }
复制代码


19_meitu_19.jpg


HAL_Delay()  的局限:

HAL库的延时函数有一个局限性,在中断服务函数中使用HAL_Delay会引起混乱,因为它是通过中断方式实现,而 Systick 的中断一般操作系统优先级是最低的,所以在中断中运行 HAL_Delay 会导致死锁的现象。



STM32通用定时器介绍

内容概要:

STM32F051定时器介绍

几种定时器功能比较

定时器的计数原理

定时器输入捕获与输出比较

STM32F051定时器介绍:

STM32F051xx 系列器件包括多达 6 个通用定时器,1个基本定时器和1个高级定时器。



20_meitu_20.jpg



几种定时器功能比较:

通用定时器TIMx功能:

    ● 定时器定时计数

    ● 输入捕获

    ● 输出比较

    ● PWM输出

    ● 使用外部信号控制定时器和定时器互连的同步电路

高级定时器TIM1功能:

    ● 通用定时器的有功能

    ● 带死区控制和紧急刹车,可用于PWM控制电机

基本定时器TIM1功能:

    ● 主要运用于定时计数以及驱动DAC



定时器计数模式:

向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。

向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。

中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。



21_meitu_21.jpg



定时器计数原理:(很重要,后面编程时配置通用定时器要用到)



22_meitu_22.jpg



时钟源:定时器时钟 TIMxCLK,即内部时钟 CK_INT,经 APB 预分频器后分频提供

计数器时钟:定时器时钟经过 PSC 预分频器之后,即 CK_CNT,用来驱动计数器计数

计数器CNT: 是一个 16 位/32的计数器

自动重装载寄存器:这里面装着计数器能计数的最大数值。当计数到这个值的时候,如果使能了中断的话,定时器就产生溢出中断

计时中断时间:     1/(TIMxCLK/(PSC+1))  *  (ARR+1)

定时器输入捕获与输出比较:

输入捕获:输入捕获可以用来捕获外部事件,比如引脚的电平变化(上升沿,下降沿),并记录下变化的时间,通常可以用来测量外部信号的频率或者电平持续的时间。



23_meitu_23.jpg



输出比较:此项功能是用来控制一个输出波形,当计数器与捕获/比较寄存器的内容相同时,输出比较功能做出相应动作,比如电平的翻转。通常用于生产PWM波形。



24_meitu_24.jpg



STM32通用定时器实例

STM32定时器使用实例:利用通用定时器实现定时0.5秒中断,并在中断处理函数中打印输出字符。


25_meitu_25.jpg



26_meitu_26.jpg


27_meitu_27.jpg


28_meitu_28.jpg


29_meitu_29.jpg



追加到回调函数:


30_meitu_30.jpg

31_meitu_31.jpg

重新编写fputc 和 回调函数:


32_meitu_1.jpg



  1. ​int fputc(int ch,FILE *f){       
  2.     while((USART1->ISR&(1<<7)) == 0);       
  3.     USART1->TDR=(uint8_t)ch;
  4.     return ch;
  5. }

  6. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  7. {
  8.         if(htim->Instance == TIM3)
  9.         {
  10.                 printf("my name is 张三\n");
  11.         }
  12. }
复制代码

启动定时器并使能中断:



33_meitu_2.jpg


  1. HAL_TIM_Base_Start_IT(&htim3);//启动定时器并使能中断
复制代码

测试结果:


34.png



收藏 1 评论0 发布时间:2020-9-27 14:48

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版