stm32标准库和HAL库的对比学习4.《学习时钟源,时钟树与内部时钟和外部时钟的用法》

这篇具有很好参考价值的文章主要介绍了stm32标准库和HAL库的对比学习4.《学习时钟源,时钟树与内部时钟和外部时钟的用法》。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        本人是大一的学生,学习了一段时间的stm32,此系列博客为个人的学习笔记,方便个人复习,如有错误或问题,非常非常欢迎大家来大力指正。

        简单用文字说一下原理。

        如果先要清楚了解建议去b站看一下keysking大佬的教程,很有趣易懂(本视频的部分图也来自keysking视频中的图片,大家如果要学习强烈推荐他的视频)时钟树我认为视频讲解要比图文效果好很多,所以这节课强烈推荐看视频

单片机内的逻辑电路都是由各种与或非门组成,假设有下面那种电路结构stm32标准库和HAL库的对比学习4.《学习时钟源,时钟树与内部时钟和外部时钟的用法》,stm32,学习,嵌入式硬件​        A,B两段同时输送高低电平信号,在理想情况下电平在同一时间到达门进行判断,然后再读入寄存器中。但事实上如果没有边缘触发器(下端写clk那个),门里面的电路非常复杂,等到门运算完,没有经过门的电信号早已到达下一个门,与未知的信号产生运算。寄存器读到的数也不是我们想要的数据。这会导致电路处理的混乱。而单片机内的这种结构非常非常多,按照这样就乱套了。所以我们要做的就是延长寄存器读取的时间,等到上个门的信号到达下一个门运算得到了数据再读取。

        所以就有了我们的边缘触发器,他clk端是控制端,d的输入q是输出。时钟源产生,其特性是当低电平转化为高电平时产生的上升沿时,才会输出信号,一个上升沿到另外一个上升沿的时间已经够门运算的电平到达边缘触发器,一个周期之内副作用电平不会对寄存器造成影响。

        而片上外设也需要精确的时钟信号,如串口需要精确的比特率,spi,iic等需要时钟线,定时器需要计时,ADC需要采样间隔。

这个是时钟树的基本结构

stm32标准库和HAL库的对比学习4.《学习时钟源,时钟树与内部时钟和外部时钟的用法》,stm32,学习,嵌入式硬件

还有其他的时钟树分支可以在cubeMX看到如css是时钟安全系统,当一个时钟故障可以迅速转换另一个时钟,并产生中断,FCLK是自由运行时钟,当我们需要低功耗的停止模式时,AHB上的HCLK时钟会停止运行,所有的外设也会停止运行,当需要唤醒stm32,需要外部中断,就要用到FCLK。fclk来自AHB的预分频器,还有RTC时钟和MCOstm32标准库和HAL库的对比学习4.《学习时钟源,时钟树与内部时钟和外部时钟的用法》,stm32,学习,嵌入式硬件

定时器,定时器的时钟信号来自APB时钟线

TIM定时器stm32标准库和HAL库的对比学习4.《学习时钟源,时钟树与内部时钟和外部时钟的用法》,stm32,学习,嵌入式硬件高级定时器多了:死区时间互补,刹车信号输入等关于电机的功能

        定时器是读取,计数脉冲的次数,然后然后根据周期算出时间,实现计时的原理。计算器也可以加入分频器去增加计时器计数的时间。(就是因为计数器是16位,最多有65536位数可以计算,如果按照72mhz,一次计数的时间就太短了。如果2分频,就是将两个周期变为一个,使周期变长,可计算的时间也更长了。)

stm32标准库和HAL库的对比学习4.《学习时钟源,时钟树与内部时钟和外部时钟的用法》,stm32,学习,嵌入式硬件

当计数器和自动重装载寄存器相同时就会触发中断,然后计数器重新加载

上面是定时器的基本逻辑。预分频器和自动重装载寄存器有影子寄存器,当开启影子寄存器机制的时候,真正在工作的是影子寄存器,当预分频器和自动重装载寄存器的数值改变的时候,先储存在原寄存器上,然后等一个周期过后再改变。

一,标准库的实现

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	TIM_InternalClockConfig(TIM2);
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_Prescaler=7200-1;         //psc预分频器
  TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数器模式       

  TIM_TimeBaseInitStructure.TIM_Period=10000-1;            //ARR自动重装器的初始值

  TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;     //滤波分频,TIM_CKD_DIV1为不分频

  TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;  //重复计数器,0为载入一次开启中断,1为载入两次中断,以此类推
                                
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//初始化tim
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//选择中断组
	NVIC_InitTypeDef NVIC_InitStructure;					
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;			
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;	//指定NVIC线路的抢占优先级为2
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			//指定NVIC线路的响应优先级为1
	NVIC_Init(&NVIC_InitStructure);								
	TIM_Cmd(TIM2, ENABLE);

步骤为①打开RCC时钟

②用结构体定义时基单元(PSC预分频器,ARR自动重装值,计数方式)

③定义NVIC中断优先级(因为要用到中断)

完成一次计数,就在中断函数执行一遍

void TIM2_IRQHandler(void)

要实现定时,我们可以在中断函数上设置一个num变量,触发函数时自增就行。

二,hal库的实现

按照标准库上的,先开启RCC时钟stm32标准库和HAL库的对比学习4.《学习时钟源,时钟树与内部时钟和外部时钟的用法》,stm32,学习,嵌入式硬件

开启tim内部时钟,并根据标准库的预分频器和自动重装载寄存器填写数据(auto-reload-preload是开启影子寄存器)

stm32标准库和HAL库的对比学习4.《学习时钟源,时钟树与内部时钟和外部时钟的用法》,stm32,学习,嵌入式硬件

打开tim的NVIC

stm32标准库和HAL库的对比学习4.《学习时钟源,时钟树与内部时钟和外部时钟的用法》,stm32,学习,嵌入式硬件

之后生成代码。

        先开启tim

HAL_TIM_Base_Start(&htim3);

现在tim就开启成功了,可以使用_hal_tim_get_counter之类的去读取计数器的值,还有很多函数在库中可以找到。

接下来打开中断

将上面代码改为

HAL_TIM_Base_Start_IT(&htim3);

然后写回调函数(也可以理解成是中断函数)

	void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
	{
		if(htim==&htim3)//判断一下是否为tim3的中断
		{
		}
	}

然后一次中断就可以执行一次上面的代码

要实现定时,我们可以在中断函数上设置一个num变量,触发函数时自增就行。

三,外部时钟:stm32标准库和HAL库的对比学习4.《学习时钟源,时钟树与内部时钟和外部时钟的用法》,stm32,学习,嵌入式硬件ETR是外部触发器,就是外部时钟的来源

TI1_ED是双边缘触发。TI1FP1,TI2FP2可调

        ETR2:使用的方法和内部时钟是一样的,在HAL库中,将tim的CLOCK SOURCE改为ETR就可以进行计数了。

输入滤波器也是十分重要的,因为外部的时钟源经常会发生抖动,使得传输进来的数据不稳定。所以我们要开启滤波器

首先,滤波器会对传输进来的信号进行检测他的脉宽,当脉宽小于设定值,则判断此信号无效stm32标准库和HAL库的对比学习4.《学习时钟源,时钟树与内部时钟和外部时钟的用法》,stm32,学习,嵌入式硬件

HAL库的实现:在这里打开stm32标准库和HAL库的对比学习4.《学习时钟源,时钟树与内部时钟和外部时钟的用法》,stm32,学习,嵌入式硬件clock fiter那里,一般写15就ok了

ETR1:是用到了触发控制器的从模式,只需要在cubeMX里面设置成这样即可,代码无需改动

stm32标准库和HAL库的对比学习4.《学习时钟源,时钟树与内部时钟和外部时钟的用法》,stm32,学习,嵌入式硬件clock fiter设置变为了trigger fiter设置,用法和功能一样

标准库的实现:

和上面的内部时钟一样

将内部时钟改为外部时钟。因为外部时钟要用到外部设备接GPIO,所以要用到定义GPIO

	TIM_InternalClockConfig(TIM2);//改为下面的
	TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x0F);

而外部中断的定义与hal库对应,第一个为通道,第二个为分频,第三个为外部极性选择,第四个为滤波器(clock fiter)

上面也要加个GPIO的定义

RCC_APB1PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC, &GPIO_InitStructure);	
	
	TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x0F);

就🆗了文章来源地址https://www.toymoban.com/news/detail-833703.html

到了这里,关于stm32标准库和HAL库的对比学习4.《学习时钟源,时钟树与内部时钟和外部时钟的用法》的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • HAL库和标准库的区别

    本文回答来源于chat gpt4,非原创,也是我初学过程中所遇到的问题,答案分享给大家,如有侵权请联系删除: HAL 库(Hardware Abstraction Layer,硬件抽象层)和标准库(Standard Peripheral Library,标准外设库,又称为 SPL)都是 STM32 微控制器的固件库。它们的主要区别在于结构和抽象

    2024年02月07日
    浏览(37)
  • freemodbus移植进STM32(包含HAL库和标准库两种方法)

    基于freemodbus1.6 使用HAL库 软件:stm32cubemx stm32cubeide 后续会更新标准库的移植。以及rtos下的移植(尽量) 这个获取方法网上到处都是,不细说了。 新建工程只列出了与移植freemodbus相关的设置 这里我使用的是485通信,所以额外使能了一个引脚 使能一个定时器,这里我用的是

    2024年02月05日
    浏览(48)
  • STM32实现薄膜压力传感器数据采集(标准库和HAL库实现)

    单片机型号及压力传感器: STM32F103C8T6 最小系统板 压力传感器选用的是薄膜压力传感器 生活中经常遇到需要测量压力值,因此,考虑到这样的需求从网上买了一个薄膜压力传感器,实物图如下: 柔性薄膜压力传感器的 产品特点 : 超薄,厚度小于0.3mm 响应速度快 寿命长,通

    2024年02月02日
    浏览(48)
  • 基于HAL库的STM32的单定时器的多路输入捕获测量脉冲频率(外部时钟实现)

    目录 写在前面 一般的做法(定时器单通道输入捕获) 以外部时钟的方式(高低频都适用) 测试效果 STM32的定时器本身有输入捕获的功能。可选择双端捕获,上升沿捕获或者是下降沿捕获。对应捕获频率来说,连续捕获上升沿或下降沿的时间间隔就是其脉冲的周期. 定时器设置频率

    2024年02月08日
    浏览(49)
  • 【STM32】基于HAL库的中断详细学习

    1.中断概述 1.1中断相关概念 1.2 STM32中断系统 2 .HAL库的中断处理 2.1 HAL 库的中断封装 2.2 外部中断处理流程 3.外部中断的HAL库定义 3.1. 外部中断的数据类型 3.2. 外部中断的接口函数 在计算机系统中,处理器常常需要与外部设备进行数据传输。常见的数据传输方式有以下四种:

    2024年02月02日
    浏览(81)
  • 【STM32】标准库与HAL库对照学习系列教程大全

    前言:开始工作后,学习的时间变少了很多,但是今年的1024节,还是打算送个福利给大家,将之前的STM32教程汇总,方便大家学习与查找,学习嵌入式已经快3年了吧,感觉自己还是在入门阶段,STM32也快一年没碰了,现在经常用的大多都还是工作上的内容,所以文章有不对的

    2024年02月08日
    浏览(43)
  • (一)gpio-逐飞TC264库学习(对比STM32 HAL库)

    void gpio_init (gpio_pin_enum pin, gpio_dir_enum dir, uint8 dat, gpio_mode_enum pinmode) //------------------------------------------------------------------------------------------------------------------- // 函数简介     gpio 初始化 // 参数说明     pin         选择的引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值

    2024年02月02日
    浏览(35)
  • 【STM32】标准库与HAL库对照学习教程十四--CAN总线

    STM32全部教程 :【STM32】标准库与HAL库对照学习系列教程大全 本篇介绍如何使用STM32的标准库与HAL库对CAN总线的使用,由于我那块普中的STM32F103ZET6开发板送人了,因此我这边用STM32F103C8最小系统板,进行简单的演示一下功能,最主要的还是需要理解CAN总线的原理,在本篇中,

    2024年02月15日
    浏览(46)
  • STM32基于HAL库和STM32CubeMX的实时操作系统FreeRtOS开发

    1、FreeRTOS RTOS是一类操作系统,µC/OS,FreeRTOS,RTX,RT-Thread 等这些都是RTOS 类的操作系统 FreeRTOS 是众多RTOS 类操作系统中的一种,FreeRTOS 十分的小巧,可以在资源有限的微控制器中运行,FreeRTOS 也不仅仅局限于在微控制器中使用。就单从文件数量上来看FreeRTOS 要比µC/OS 少得多

    2024年02月21日
    浏览(64)
  • 【12】STM32·HAL库开发-STM32时钟系统 | F1/F4/F7时钟树 | 配置系统时钟

      下图的clk是clock(时钟)的缩写,下面的波形可以理解为脉冲信号或者方波。简单来说,时钟是具有周期性的脉冲信号,最常用的是占空比50%的方波。 时钟是单片机的脉搏,搞懂时钟走向及关系,对单片机使用至关重要!   下图是F1系列的时钟树,从左侧竖线开始,

    2024年02月14日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包