完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
前景回顾
上一节主要介绍了在STM32CubMx中如何配置中断,并且如何使用其中的中断函数,首次提到了回调函数这个概念,这一小节,我们在此基础上实现通过定时器来实现。。。。。 主要介绍 我们知道时钟就是单片机的心脏,并且,使用单片机万万离不开时钟,可以说时钟是单片机内容的重中之重,之前配置文件时,我们都没有介绍时钟这一模块,在这里,将要花费大量篇幅介绍STM32中的时钟小节。关于时钟的基本概念请转至时钟超详细讲解。这里还是主要对STM32CubMx中的时钟进行介绍。 工程配置 首先进入软件界面,使能HSE(高速时钟)和LSE(低速时钟),使能完成之后进入Clock Configuration界面。 系统时钟图介绍 下图为STM32F407ZGT6的时钟树界面。以系统时钟SYSCLK为界限划分左中右。我们可以清晰的看到左侧部分系统的时钟源有LSE(低速外部时钟)、HSE(高速外部时钟),系统内部有LSI(低速内部时钟)、HSI(高速内部时钟)。箭头指向不同的地方,是为不同的外设提供时钟信号。 中间部分系统时钟源(SYSCLK)来源有3处,HSI,HSE,PLLCLK锁相环。PLL锁相环是一个倍频器,可以把频率低的时钟经过乘除运算放大成为频率高的时钟。下图中PLL锁相环将25MHz的HSE倍频成为了168MHz的高速时钟。 右侧将得到的系统时钟在经过预分频器AHB处理得到了HCLK,HCLK再通过APB1和APB2预分频器将时钟分配给外设。如APB1外设时钟,APB1定时器时钟、APB2外设时钟、APB2定时器时钟。 配置时钟有一个原则,就是用到哪些外设就配置哪些时钟。下图为定时器1-14所挂载在时钟树上的位置,在本次实验中我们用到了timer6,可以看到timer6挂载在APB1上,而配置的APB1时钟为84MHz。 系统时钟设置 通用定时器的工作原理: 首先,定时器的时钟信号送入16位可编程预分频器(Prescaler),该预分频器的系数为0-65535之间的任意数值,预分配器溢出之后,会向16位的主计数器(Counter Period)发送一个脉冲信号。 预分频器,实质上是一个加法计数器,预分频系数就是加计数的溢出值。 定时器一个周期产生的时间我们如何计算呢?下面以timer6为例,具体配置细节。 先介绍定时器发生中断时间的计算方法: 定时器时间=(Prescaler+1)X(Counter Period)X1/定时器时钟频率 单位:秒/s 这里我们配置Prescaler为8400-1,Counter Period为5000-1,可以得到0.5s的计时时间,同时也要使能自动重装载。 同样的这里我们配置Prescaler为8400-1,Counter Period为2000-1,可以得到0.2s的计时时间。 时钟初始化配置完成,紧接着要使能两个定时器中断,如下图所示,至此,工程配置完毕,可以生成系统文件了。 系统代码编写 观察生成的系统文件。 void MX_TIM6_Init(void) { TIM_MasterConfigTypeDef sMasterConfig = {0}; htim6.Instance = TIM6; htim6.Init.Prescaler = 8399; //预分频设置,就是将84MHz的系统时钟均分成8400份,得到一份的时间为0.1ms htim6.Init.CounterMode = TIM_COUNTERMODE_UP; htim6.Init.Period = 1999; //计数器设置为2000,2000*0.1ms=0.2s htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; if (HAL_TIM_Base_Init(&htim6) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK) { Error_Handler(); } } 依照惯例,首先打开stm32f4xx__it.c文件,在中断函数里面追溯根源,找到中断回调函数。 或者在hal库的定时器的头文件找到回调函数,复制到主函数对它进行重写。 在 main.c函数中添加如下代码: void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance==TIM6) //是否是定时器6触发中断 { HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);//翻转LED0的电平 } if(htim->Instance==TIM7)//是否是定时器7触发中断 { HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);//翻转LED1的电平 } } 在main函数中添加: HAL_TIM_Base_Start_IT(&htim6);//启动定时器中断6 HAL_TIM_Base_Start_IT(&htim7);//启动定时器中断7 代码验证 我们将代码下载到开发板上,观察现象,发现LED0按照定时器6设置的时间翻转。LED1按照定时器7设置的时间翻转。 结语 本节介绍了STM32中基本定时器6&7的使用,通过配置定时器6&7,LED灯精准时间翻转。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1786 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1622 浏览 1 评论
1089 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
730 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1680 浏览 2 评论
1939浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
736浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
571浏览 3评论
598浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
560浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 09:04 , Processed in 0.736797 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号