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

物联网之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个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

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