stm32F4程序运行时间代码
05_STM32F4通用定时器详细讲解精编版
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); ///使能TIM3时钟
2时钟Timer3的配置。
TIM_TimeBaseInitStructure.TIM_Period = arr;//自动重装载值
Timer3是一个16位的定时器,有四个独立通道,分别对应着PA6 PA7 PB0 PB1
主要功能是:1输入捕获——测量脉冲长度。
2输出波形——PWM输出和单脉冲输出。
Timer3有4个时钟源:
1:内部时钟(CK_INT),来自RCC的TIMxCLK
2:外部时钟模式1:外部输入TI1FP1与TI2FP2
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM3
3使能中断
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //允许定时器3更新中断。
4打开Timer3。
TIM_Cmd(TIM3,ENABLE); //使能定时器3
3:捕获/比较选择
8TIM3捕获/比较模式寄存器2 (TIM3_CCMR2)
9TIM3捕获/比较使能寄存器(TIM3_CCER)
1:上升沿触发or下降沿触发
2:捕获/比较输出使能
10 TIM3计数器(TIM3_CNT)
11 TIM3预分频器(TIM3_PSC)
计数器时钟频率CK_CNT等于fCK_PSC/ (PSC[15:0] + 1)。
1TIM3控制寄存器1 (TIM3_CR1)
作用:1使能自动重载TIM3_ARR
STM32F40x 41x微控制器时钟配置工具说明书
2011 年 10 月文档 ID 022298 第 1 版1/21AN3988应用笔记适用于 STM32F40x/41x 微控制器的时钟配置工具简介本应用笔记介绍了适用于 STM32F4xx 微控制器系列的时钟系统配置工具。
此工具的目的是帮助用户配置微控制器时钟,并将电源和 Flash 访问模式等参数考虑在内。
此配置工具在“STM32F4xx_Clock_Configuration_VX.Y .Z.xls ”文件中实现,该文件随 STM32F4xx 标准外设库提供,并可以从 下载。
此工具支持 STM32F4xx 的下列功能:●配置系统时钟、HCLK 源和输出频率。
●配置 Flash 延迟(等待周期数取决于 HCLK 频率)。
●设置 PCLK1、PCLK2、TIMCLK (定时器时钟)、USBCLK 和 I2SCLK 频率。
●生成含有上述全部设置的可直接使用的 system_stm32f4xx.c 文件(STM32F4xx CMSIS Cortex-M4 器件外设访问层系统源文件)。
在本文档中,STM32F4xx_Clock_Configuration_VX.Y .Z.xls 称为“时钟工具”。
在使用时钟工具之前,必须阅读 STM32F4xx 微控制器参考手册 (RM0090)。
本应用笔记不是参考手册的替代。
此工具仅支持 A 版 STM32F4xx 。
注:对于 VX.Y .Z ,请参见工具版本,例如 V1.0.0目录AN3988目录1词汇表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52使用入门 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.1软件要求 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.2硬件要求 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.2.1简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.2.2STM32F4xx 微控制器的时钟方案 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.2.3I2S 时钟发生器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93教程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113.1向导模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113.1.1分步过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113.2专家模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 4已知限制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 5结论 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 6版本历史 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202/21文档 ID 022298 第 1 版AN3988表格索引表格索引表 1.术语定义. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5表 2.等待周期数与 CPU 时钟 (HCLK) 频率对应关系 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9表 3.文档版本历史 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20文档 ID 022298 第 1 版3/21图片索引AN3988图片索引图 1.时钟方案. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8图 2.I2S 时钟发生器架构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9图 3.向导模式用户界面. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11图 4.HSE 值超出范围. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12图 5.VDD 超出范围. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12图 6.HCLK 错误消息. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13图 7.选择时钟源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13图 8.无可用配置错误. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14图 9.文件生成错误 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14图 10.专家模式用户界面. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15图 11.超出系统时钟频率. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16图 12.超出 PLL 输入频率 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16图 13.I2S 频率超出范围 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 4/21文档 ID 022298 第 1 版AN3988词汇表1 词汇表表 1.术语定义术语说明HCLK AHB 时钟PCLK1APB1 时钟PCLK2APB2 时钟TIMCLK定时器时钟USB OTG FS USB 全速 OTGF CPU Cortex-M4 时钟Ext.Clock外部时钟V DD电源HSI高速内部时钟HSE高速外部时钟MCLK主时钟I2S内部集成音频Fs采样频率I2SCLK I2S 时钟RNG随机数发生器SDIO安全数字输入/输出接口文档 ID 022298 第 1 版5/21使用入门AN3988 2 使用入门本节介绍开始使用时钟工具所需的系统要求和步骤。
stm32单片机小时计时程序代码
stm32单片机小时计时程序代码STM32单片机小时计时程序代码一、引言在现代社会中,时间是非常重要的一个因素。
而在很多应用中,对时间的计时需求也是非常常见的。
STM32单片机是一种常用的嵌入式微控制器,具有强大的计时功能。
本文将介绍如何使用STM32单片机编写一个小时计时程序代码。
二、程序设计思路本程序的设计思路是通过定时器中断来实现小时计时功能。
具体步骤如下:1. 初始化STM32单片机的定时器和相关寄存器。
2. 设置定时器的计时周期,使其每隔一定时间触发一次中断。
3. 在中断服务函数中,每次触发中断时进行计时器的累加操作。
4. 根据累加的值判断是否达到1小时,如果达到,则进行相关处理。
三、程序代码实现以下是一个简单的示例代码,演示了如何使用STM32单片机实现小时计时功能:```c#include "stm32f10x.h"#include "stm32f10x_tim.h"volatile uint32_t hour_count = 0;void TIM2_IRQHandler(void){if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET){hour_count++;TIM_ClearITPendingBit(TIM2, TIM_IT_Update);}}int main(void){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);TIM_TimeBaseStructure.TIM_Period = 3600000 - 1; // 设置定时周期为1小时TIM_TimeBaseStructure.TIM_Prescaler = 7199; // 设置定时器预分频值,使定时器时钟为10kHzTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);TIM_Cmd(TIM2, ENABLE);while (1){if (hour_count > 0){// 在这里进行每小时的处理操作,例如打印计时结果等// 重置计时器hour_count = 0;}}}```四、代码解析1. 首先,我们需要包含相关的头文件,其中"stm32f10x.h"是STM32单片机的头文件,"stm32f10x_tim.h"是定时器相关的头文件。
STM32F427xx系列芯片系统时钟讲解
STM32F427xx系列芯片系统时钟讲解——写代码的Tobem 为了进行通用定时器的设置,有必要先了解STM32F427xx系列芯片的时钟系统。
为了实现低功耗(对于每个时钟源来说,在未使用时都可单独打开或者关闭,以降低功耗),STM32F427xx设计了功能完善但却有点复杂的时钟系统,见下图:图2 STM32F427xx系统时钟树从图中可以看出,STM32F427xx具有4个时钟源,分别为2个内部时钟源和2个外部时钟源,也可以分为2个高速时钟源和2个低速时钟源,具体为:1、HSE(高速外部时钟):以外部晶振作时钟源,晶振频率可取范围为4~26MHz,实际电路图中我们采用12MHz的晶振。
2、HSI(高速内部时钟):由内部RC振荡器产生,频率为16MHz。
其特点是起振快,在芯片刚上电的时候,就是使用高速内部时钟,但其精度不高,因此,上电之后我们再通过软件配置(SystemInit()函数),转而采用高速外部时钟信号。
3、LSE(低速外部时钟):以外部晶振作时钟源,主要提供给实时时钟模块(RTC),一般采用32.768KHz。
4、LSI(低速内部时钟):由内部RC振荡器产生,频率为32KHz,主要用于驱动独立看门狗,也可选择提供给RTC 用于停机/待机模式下的自动唤醒。
程序在执行主函数main()之前,要先进行堆栈指针SP、程序计数器PC的初始化、设置异常中断向量地址等工作,最后才进入到主函数main()中去执行,这其中包括系统时钟的配置(在startup_stm32f4xx.s启动文件中)。
系统时钟的配置由system_stm32f4xx.c文件中的SystemInit()函数完成,配置结果如下:图3 系统时钟配置情况从时钟树中可以看到,系统时钟SYSCLK是大部分器件的时钟来源,因此SYSCLK的配置就显得十分重要。
SYSCLK可以从三个时钟源中进行选择,分别为HSI、HSE和PLLCLK。
HSI 不稳定,而HSE速率太低(4~26MHz),为了使系统获得较快的运行速率和稳定性,我们选择PLLCLK来作为SYSCLK(见备注1),而PLLCLK又可以选择HSI或者HSE作为时钟源,我们选择HSE作为时钟源(见备注2)根据时钟树的走向,SYSCLK(即PLLCLK)计算过程为:PLL_VCO = (HSE_VALUE / PLL_M) * PLL_NSYSCLK = PLL_VCO / PLL_P而宏定义有#if !defined (HSE_VALUE)#define HSE_VALUE ((uint32_t)12000000) /*!< Value of the External oscillator in Hz */#endif /* HSE_VALUE */#define PLL_M 12#define PLL_Q 7#if defined (STM32F427_437xx) || defined (STM32F429_439xx)#define PLL_N 360#define PLL_P 2故SYSCLK最终为180MHz。
STM32F4 第6讲 STM32时钟系统+SystemInit函数解读-M4
③、LSI是低速内部时钟,RC振荡器,频率为32kHz,提供低功耗时钟。主要供独立看 门狗和自动唤醒单元使用。
④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。RTC ⑤、PLL为锁相环倍频输出。STM32F4有两个PLL:
目录
1
时钟系统框图讲解
2 时钟配置相关函数讲解
时钟系统讲解
参考资料:
Keil MDK中自带的英文资料
✓ 时钟系统框图
✓ 时钟系统知识总结
1. STM32 有5个时钟源:HSI、HSE、LSI、LSE、PLL。
①、HSI是高速内部时钟,RC振荡器,频率为16MHz,精度不高。可以直接作为系统 时钟或者用作PLL时钟输入。
2. 时钟源和时钟相关配置:
RCC_HSEConfig, RCC_LSEConfig, RCC_PLLConfig, RCC_PLLI2SConfig, RCC_PLLSAIConfig, RCC_MCO1Config, RCC_MCO2Config, RCC_SYSCLKConfig, RCC_HCLKConfig,RCC_PCLK1Config, RCC_PCLK2Config,RCC_RTCCLKConfig,RCC_I2SCLKConfig
主PLL(PLL)由HSE或者HSI提供时钟信号,并具有两个不同的输出时钟。 ✓ 第一个输出PLLP用于生成高速的系统时钟(最高168MHz) ✓ 第二个输出PLLQ用于生成USB OTG FS的时钟(48MHz),随机数发生器 的时钟和SDIO时钟。
专用PLL(PLLI2S)用于生成精确时钟,从而在I2S接口实现高品质音频性能。
STM32外部时钟更改后程序设置方法
FLASH_SetLatency(FLASH_Latency_2);//设置 FLASH 存储器延时时钟周期数 FLASH_Latency_2 2 延时周期 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//选择 FLASH 预取指缓存的模,预取指缓存使能
RCC_DeInit();//将外设 RCC 寄存器重设为缺省 RCC_HSICmd(ENABLE);//设置外部高速晶振(HSE) HSE 晶振打开(ON) while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY_HCLKConfig(RCC_SYSCLK_Div1);//设置 AHB 时钟(HCLK) RCC_SYSCLK_Div1 ----- AHB 时钟 = 系统时钟 RCC_PCLK2Config(RCC_HCLK_Div1);//设置高速 AHB 时钟(PCLK2) RCC_HCLK_Div1 ----- APB2 时钟 = HCLK RCC_PCLK1Config(RCC_HCLK_Div2);//设置低速 AHB 时钟(PCLK1) RCC_HCLK_Div2 ----- APB1 时钟 = HCLK/2
RCC_PCLK2Config(RCC_HCLK_Div1);//设置高速 AHB 时钟(PCLK2) RCC_HCLK_Div1 ----- APB2 时钟 = HCLK
RCC_PCLK1Config(RCC_HCLK_Div2);//设置低速 AHB 时钟(PCLK1) RCC_HCLK_Div2 ----- APB1 时钟 = HCLK/2
#endif /* HSE_VALUE */
注意:以上是以外部晶振为 16MHz 为例
方法(2): 使用 STM32F10x 内部时钟来配置 STM32F10x 各个模块的系统时钟。(不推荐使用,内部 8MHz RC 振荡器不稳定)
第二十章 RTC实时时钟实验-STM32F4开发指南-正点原子探索者STM32开发板
STM32F4 的实时时钟(RTC)相对于 STM32F1 来说,改进了不少,带了日历功能了, STM32F4 的 RTC,是一个独立的 BCD 定时器/计数器。RTC 提供一个日历时钟(包含年月日 时分秒信息)、两个可编程闹钟(ALARM A 和 ALARM B)中断,以及一个具有中断功能的周 期性可编程唤醒标志。RTC 还包含用于管理低功耗模 式的自动唤醒单元。
291
STM32F4 开发指南(库函数版)
ALIENTEK 探索者 STM32F407 开发板教程
图 20.1.3 RTC_DR 寄存器各位描述 同样,该寄存器的的数据始化模式下,对该寄存器进行写操作,可以设置日期。 接下来,看 RTC 亚秒寄存器:RTC_SSR,该寄存器各位描述如图:20.1.4 所示:
1, 一个通过 RTC_PRER 寄存器的 PREDIV_A 位配置的 7 位异步预分频器。 2, 一个通过 RTC_PRER 寄存器的 PREDIV_S 位配置的 15 位同步预分频器。 图 20.1.1 中,ck_spre 的时钟可由如下计算公式计算:
Fck_spre=Frtcclk/[(PREDIV_S+1)*( PREDIV_A+1)] 其中,Fck_spre 即可用于更新日历时间等信息。PREDIV_A 和 PREDIV_S 为 RTC 的异步 和同步分频器。且推荐设置 7 位异步预分频器(PREDIV_A)的值较大,以最大程度降低功耗。 要设置为 32768 分频,我们只需要设置:PREDIV_A=0X7F,即 128 分频;PREDIV_S=0XFF, 即 256 分频,即可得到 1Hz 的 Fck_spre。 另外,图 20.1.1 中,ck_apre 可作为 RTC 亚秒递减计数器(RTC_SSR)的时钟,Fck_apre 的计算公式如下:
STM32F4系列RTC模块中文翻译..
22 实时时钟(RTC)22.1 简介实时时钟是一个独立的BCD定时/计数器。
可以提供一个时钟日历、两个可编程的闹钟中断以及一个有中断能力的周期性可编程的唤醒标志,RTC同时包括一个自动唤醒单元来管理低功耗模式。
RTC有两个32位寄存器,其中包括以BCD码表示的秒、分、时(12或24小时制)、日(Day of week)、日期(day of mouth)以及年。
亚秒(sub-seconds)值也可以用BCD码表示。
自动执行28、29(闰年)、30、31天的补偿以及夏令时的补偿。
附加的32位寄存器包含可编程的闹铃亚秒、秒、分、小时、日(day of week)可日期(day of mouth).数字校准器可以补偿任何晶振带来的偏差。
上电复位后所有的RTC寄存器都被保护,以防止可能的误写访问。
不管设备处于什么状态(运行模式(Run mode),低功耗模式(Low power mode)或者正在复位(under reset)),只要供电在工作范围内,RTC就不会停止。
22.2 RTC的主要特性RTC单元的主要特性如下:·拥有亚秒、秒、分、小时、星期、日期,月和年的日历。
·软件编程的夏令补偿。
·两个有中断功能的可编程闹钟。
闹钟可以通过任何日历的组合来触发。
·自动唤醒单元产生一个周期标志来触发一个自动唤醒中断。
·参考时钟选择:可以选择一个更精确的源秒时候来确保日历的精确度。
·使用亚秒切换特性通过一个外部时钟来达到精确的同步。
·可屏蔽中断/事件:- 闹钟A- 闹钟B- 唤醒中断- 时间戳- 侵入检测·数字校验电路(周期计数校正)- 5 ppm的精度- 0.95ppm的精度,获得一个几秒种的校准窗口·可保存事件的时间戳功能(一个事件)·侵入事件- 两个可配置滤波器和侵入上拉的侵入事件。
·20个后备寄存器(80个字节).当一个选择的侵入检测事件发生时后备寄存器被复位。
STM32中的tic与toc,用SysTick统计代码段执行时间
STM32中的tic与toc,用SysTick统计代码段执行时间STM32中的systick,一共有4个寄存器,名称和地址分别是:SysTick_CTRL,0xE000E010--控制寄存器SysTICK_LOAD,0xE000E014--重载寄存器SysTick_VAL,0xE000E018--当前值寄存器SysTick_CALRB,0xE000E01C--校准值寄存器首先看SysTick->;CTRL控制寄存器:寄存器内有4个位具有意义第0位:ENABLE,Systick使能位(0:关闭Systick功能;1:开启Systick功能)第1位:TICKINT,Systick中断使能位(0:关闭Systick中断;1:开启Systick中断)第2位:CLKSOURCE,Systick时钟源选择(0:使用HCLK/8作为Systick时钟;1:使用HCLK 作为Systick时钟)第16位:COUNTFLAG,Systick计数比较标志,如果在上次读取本寄存器后,SysTick已经数到了0,则该位为1。
如果读取该位,该位将自动清零SysTick_LOAD重载寄存器:SysTick_VAL当前值寄存器:也是个24位的寄存器,读取时返回当前倒计数的值;写它则使之清零,同时还会清除在SysTick控制及状态寄存器中的COUNTFLAG标志。
SysTick_CALRB校准值寄存器:这个寄存器好像目前的水平我还用不到,大体意思明白点,把英文说明放这吧:位31NOREF:1=没有外部参考时钟(STCLK不可用)0=外部参考时钟可用位30SKEW:1=校准值不是准确的1ms0=校准值是准确的1ms位[23:0]:Calibrationvalue IndicatesthecalibrationvaluewhentheSysTickcounter runsonHCLKmax/8asexternalclock.Thevalueisproductd ependent,pleaserefertotheProductReferenceManual,S ysTickCalibrationValuesection.WhenHCLKisprogramme datthemaximumfrequency,theSysTickperiodis1ms.Ifca librationinformationisnotknown,calculatethecalibr ationvaluerequiredfromthefrequencyoftheprocessorc lockorexternalclock.类似matlab里的tic与toc函数,用来统计程序代码执行需要的时间:uint16_t OverFlowTimes=0;void tic(void)//程序开始计时{SysTick->;CTRL |= (1;CTRL |= (1;VAL=0X00;//当前数值寄存器清零,并清除溢出标志位SysTick->;LOAD=0XFFFFFF;//计数器赋初值SysTick->;CTRL |= (1;CTRL &= ~(1;VAL; //读取计数器的值ElaspTime=(OverFlowTimes*((float)0xffffff/SystemC oreClock)+(float)(0xffffff-ClkNum)/SystemCoreCloc k); //计算时间OverFlowTimes=0;printf("\r\nEscaple timeis %f\r\n",ElaspTime);}/*溢出的次数*/void SysTick_Handler(void){OverFlowTimes++;}。
STM32F4与STM32F1的区别
STM32F4与STM32F1的区别• stm32F1是cortex- M3的内核。
Stm32f4是cortex-M4的内核• F1最⾼主频 72MHz, F4最⾼主频168MHz。
• F4具有单精度浮点运算单元,F1没有浮点运算单元。
• F4的具备增强的DSP指令集。
F4的执⾏16位DSP指令的时间只有F1的30%~70%。
F4执⾏32位DSP指令的时间只有F1的25%~60%。
• 程序存储器、数据存储器、寄存器和输⼊输出端⼝被组织在同⼀个 4GB 的线性地址空间内。
可访问的存储器空间被分成 8 个主要块,每个块为 512MB 。
F1⼩容量产品是指闪存存储器容量在 16K ⾄ 32K 字节,中容量产品是指闪存存储器容量在 64K ⾄ 128K ,⼤容量产品是指闪存存储器容量在 256K ⾄ 512K 。
主存储块容量:⼩容量产品主存储块最⼤为 4K × 64 位,每个存储块划分为 32 个 1K 字节的页 ( 见表 2) 。
中容量产品主存储块最⼤为 16K × 64 位,每个存储块划分为 128 个 1K 字节的页 ( 见表 3) 。
⼤容量产品主存储块最⼤为 64K × 64 位,每个存储块划分为 256 个 2K 字节的页 ( 见表 4) 。
互联型产品主存储块最⼤为 32K × 64 位,每个存储块划分为 128 个 2K 字节的页 ( 见表 5) 。
• F1内部SRAM最⼤64K字节, F4内部SRAM有192K字节(112K+64K+16K)。
STM32F10xxx 内置 64K 字节的静态 SRAM 。
它可以以字节、半字 (16 位 ) 或全字 (32 位 ) 访问。
SRAM 的起始地址是 0x2000 0000 。
STM32F405xx/07xx 和 STM32F415xx/17xx 带有 4 KB 备份 SRAM,和 192 KB 系统 SRAM 。
2-4 STM32F4时钟系统
提纲 CONTENTS
1 STM32F4时钟树与时钟源 2 STM32F4系统时钟初始化
1 STM32F4时钟树与时钟源
1 STM32F4时钟树与时钟源 时钟树
1 STM32F4时钟树与时钟源
1 STM32F4时钟树与时钟源
计算公式: PLLCLK = 25MHz * N/ (M*P) = 25MHz * 336 / (25*2)
= 168MHz
2 STM32F4系统时钟初始化 STM32F4 时钟系统初始化是在system_stm32f4xx.c中的SystemInit()函数
中完成的,对于系统时钟关键寄存器设置主要是在SystemInit()函数中调用 SetSysClock()函数来设置的。
存储器架构图
2 STM32F4系统时钟初始化 STM32F4 时钟系统初始化是在system_stm32f4xx.c中的SystemInit()函数
2 STM32F4系统时钟初始化
程序是如何初始化时钟呢? 最后,要知道如何设置外部晶振频率,在stm32f4xx.h 文件中,HSE_VALUE宏
定义晶振频率,一定要与电路中的实际晶振频率一样,若使用了8MHz的晶振,则需 要把25000000修改为8000000。
谢 谢!
感谢
谢谢,精品课件
2 STM32F4系统时钟初始化
程序是如何初始化时钟呢? 其次)函数,这两个函数都在
system_stm32f4xx.c之中。SetSysClock()函数中代码是设置STM32F4的PLL分频和倍 频参数设置宏,实现PLL、AHB、APB1、APB2等时钟。
资料搜集
中完成的,对于系统时钟关键寄存器设置主要是在SystemInit()函数中调用 SetSysClock()函数来设置的。
05_STM32F4通用定时器详细讲解
STM32F4系列共有14个定时器,功能很强大。
14个定时器分别为:2个高级定时器:Timer1和Timer810个通用定时器:Timer2~timer5 和 timer9~timer142个基本定时器: timer6和timer7本篇欲以通用定时器timer3为例,详细介绍定时器的各个方面,并对其PWM 功能做彻底的探讨。
Timer3是一个16位的定时器,有四个独立通道,分别对应着PA6 PA7 PB0 PB1 主要功能是:1输入捕获——测量脉冲长度。
2 输出波形——PWM 输出和单脉冲输出。
Timer3有4个时钟源:1:内部时钟(CK_INT ),来自RCC 的TIMxCLK2:外部时钟模式1:外部输入TI1FP1与TI2FP23:外部时钟模式2:外部触发输入TIMx_ETR ,仅适用于TIM2、TIM3、TIM4,TIM3,对应着PD2引脚4:内部触发输入:一个定时器触发另一个定时器。
时钟源可以通过TIMx_SMCR 相关位进行设置。
这里我们使用内部时钟。
定时器挂在高速外设时钟APB1或低速外设时钟APB2上,时钟不超过内部高速时钟HCLK ,故当APBx_Prescaler 不为1时,定时器时钟为其2倍,当为1时,为了不超过HCLK ,定时器时钟等于HCLK 。
例如:我们一般配置系统时钟SYSCLK 为168MHz ,内部高速时钟 AHB=168Mhz ,APB1欲分频为4,(因为APB1最高时钟为42Mhz ),那么挂在APB1总线上的timer3时钟为84Mhz 。
《STM32F4xx 中文参考手册》的424~443页列出与通用定时器相关的寄存器一共20个, 以下列出与Timer3相关的寄存器及重要寄存器的简单介绍。
1 TIM3 控制寄存器 1 (TIM3_CR1)SYSCLK(最高AHB_Prescaler APBx_Prescaler作用:1使能自动重载TIM3_ARR2定时器的计数器递增或递减计数。
强大的STM32F4的定时器设定方法-附源码
STM32定时器比较多,使用起来也比较混乱。
windows下做过编程的人一定对SetTimer有印象,不过该定时器也不那么好用,因为id要自己维护,并且保证不跟程序中的其他id冲突。
手头上的项目要用到定时器,又不想每次都跑到寄存器里详细设定参数,所以就写了个类似SetTimer的定时器。
注:请在STM32F407上使用该定时器,其他内核需要修改,如M3内核是没有32位定时器的使用方法:u8 SetTimer(u32 unTime, u32 unCount, TIMERFUN pHandler,u32 ucPara)使用SetTimer去向系统申请一个定时器,如果成功,返回定时器ID,失败返回0.为了使定时器ID更有意义,这里设定返回值为定时器编号这里根据计时时间自动分配定时器。
比如你需要一个比较长时间的定时,那么SetTimer会给你分配一个32位定时器(M4内核)参数:unTime:计时时间(ms,如需ns请自行修改或者使用delay)unCount :计时器运行次数,0为无限运行,非零的话,运行unCount次后,该定时器关闭。
pHandler:定时器定时后执行的函数,该处如果不需要执行,可填0(什么都不需要做,干嘛要开启定时器?),当然这里可以自己定义函数指针类型(比如传2个参数或者变参:呃,变参太变态)ucPara:函数参数/*关闭定时器tmrId:定时器ID*/void KillTimer(TIMER tmrId);例如:view sourceprint?1 //每隔0.5s 反转4bit 灯2 tmrIrb = SetTimer(500, 0, IndRvsBit, 4);3 printf("IndRvsBit Timer Id: %d\r\n",tmrIrb);45 if(0 != tmrIrb)6 {7 ucCnt = SetTimer(10 * 1000, 1, KillBlink, tmrIrb); //10s 后关闭位4反转8 printf("KillBlink Timer Id: %d\r\n",ucCnt);9 }view sourceprint?1view sourceprint?1view sourceprint?1view sourceprint?1view sourceprint?1view sourceprint?1这里要提前定义好参数里的函数指针view sourceprint?01 void KillBlink(u8 ucOpt)02 {03 // RTC_ShutWakeUp();04 KillTimer(ucOpt);05 printf("KillBlink(%d)\r\n", ucOpt);06 }0708 void AdPickTime(u8 ucOpt)09 {10 PushCmd(0xF2,0);11 }1213 void IndRvsBit(u8 ucOpt)14 {15 SubBoardIndSingle(4, acCurInd[4] ^ (1 << ucOpt));16 }header:view sourceprint?01 #ifndef __TIMER_H02 #define __TIMER_H03 #include "board.h"04 #include "zkekglobe.h"0 5 /////////////////////////////////////////////////////////////////// ///////////////60//All rights reserved708 //////////////////////////////////////////////////////////////////////////////////09101112 /*使能基本计时器13 ucTimerIdx:计时器编号 范围:2~5 9~1414 unCount 自动重装值。
STM32Cube_FW_F4中RTC_Calendar例程的BUG
© 2015 STMicroelectronics - 保留所有权利
结论
由于 STM32Cube_FW_F4_V1.3.0\Projects\STM324x9I_EVAL\Examples\RTC 中的 RTC_Calendar 例程没有注意到 HAL_RTC_Init()函数里边会有关闭 LSE 的动作,而每次上电都会运行这个函数,每次上电都会导致时间变慢,上电的次数多 了,变慢就很明显了。所以,例程上是有 Bug 的,需要进行修复。
set */ != RESET) on */
!= RESET) on */
/* Wait for RTC APB registers synchronisation */ if(HAL_RTC_WaitForSynchro(&RtcHandle) != HAL_OK) { /* synchronisation Error */ Error_Handler(); } /* Clear the RTC Alarm Flag */ __HAL_RTC_ALARM_CLEAR_FLAG(&RtcHandle,RTC_FLAG_ALRAF); nding bit (Connected internally to RTC Alarm) */ __HAL_RTC_EXTI_CLEAR_FLAG(RTC_EXTI_LINE_ALARM_EVENT); /* Clear Reset Flag */ __HAL_RCC_CLEAR_RESET_FLAGS(); }
处理
需要将 HAL_RTC_Init()这个初始化函数的位置做个修改。如果 RTC 未被配置过,则进行配置;如果是已经被配置过的,就不 需要再重新初始化一次了。标准外设库 STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Project\STM32F4xx_StdPeriph_Examples\RTC 中的 RTC_Calendar 例程是没有问 题的,参考此例程,修改得一基于 STM32Cube_FW_F4 的 RTC_Calendar 例程,见附件。
stm32单片机小时计时程序代码
stm32单片机小时计时程序代码stm32单片机小时计时程序是一种基于stm32单片机的软件程序,用于实现小时计时的功能。
在本文中,我们将详细介绍如何编写这样一个程序,以及程序的实现原理和使用方法。
我们需要了解stm32单片机的基本知识。
stm32单片机是一种高性能、低功耗的嵌入式微控制器,具有丰富的外设和强大的计算能力。
它广泛应用于各种电子设备中,包括计时器、时钟、计步器等。
在编写小时计时程序之前,我们需要先了解stm32单片机的时钟模块。
时钟模块是单片机中非常重要的一个模块,它提供了系统时钟和外设时钟,控制单片机的时序和节拍。
在小时计时程序中,我们需要使用时钟模块来计算时间的流逝。
接下来,我们开始编写小时计时程序。
首先,我们需要初始化时钟模块。
在stm32单片机中,时钟模块的初始化包括设置系统时钟源、设置时钟分频器等。
我们可以根据实际需求选择适合的时钟源和分频系数。
初始化完时钟模块后,我们需要设置计时器。
在小时计时程序中,我们可以使用定时器模块来实现计时功能。
定时器模块可以通过配置计数器的初值和计数器的溢出时间来实现定时功能。
我们可以根据实际需求选择适合的定时器模块和计数器参数。
在设置计时器后,我们需要编写中断服务函数。
中断服务函数是在计数器溢出时自动调用的函数,用于处理计时器溢出事件。
在小时计时程序中,我们可以在中断服务函数中将计数器的值加1,以实现计时功能。
编写完中断服务函数后,我们需要设置中断优先级和使能中断。
在stm32单片机中,每个中断都有一个优先级,用于确定中断的响应顺序。
我们可以根据实际需求设置中断优先级,并使能中断,以保证中断能够正常工作。
我们可以在主函数中调用计时器模块,并通过串口或LCD等外设输出计时结果。
在小时计时程序中,我们可以使用串口模块将计时结果输出到电脑上进行显示,也可以使用LCD模块将计时结果显示在液晶屏上。
stm32单片机小时计时程序是一种基于stm32单片机的软件程序,用于实现小时计时的功能。
STM32F4 第19讲 RTC实时时钟程序讲解-M4
✓ RTC原理
RTC闹钟配置一般步骤
① RTC已经初始化好相关参数。 ② 关闭闹钟:RTC_AlarmCmd(RTC_Alarm_A,DISABLE); ③ 配置闹钟参数:RTC_SetAlarm(); ④ 开启闹钟:RTC_AlarmCmd(RTC_Alarm_A,EABLE); ⑤ 开启配置闹钟中断:
RTC_SetWakeUpCounter(); ① 使能WakeUp : RTC_WakeUpCmd( ENABLE); ② 开启配置闹钟中断:
RTC_ITConfig(); EXTI_Init(); NVIC_Init(); ⑤编写中断服务函数: RTC_WKUP_IRQHandler();
✓ RTC原理 讲解RTC实时时钟实验程序。
✓ RTC原理
RTC日历配置一般步骤
① 使能PWR时钟:RCC_APB1PeriphClockCmd(); ② 使能后备寄存器访问: PWR_BackupAccessCmd(); ③ 配置RTC时钟源,使能RTC时钟:
RCC_RTCCLKConfig(); RCC_RTCCLKCmd(); 如果使用LSE,要打开LSE:RCC_LSEConfig(RCC_LSE_ON);
uint32_t RTC_GetAlarmSubSecond(uint32_t RTC_Alarm);
✓ RTC原理
RTC周期唤醒相关函数
void RTC_WakeUpClockConfig(uint32_t RTC_WakeUpClock); void RTC_SetWakeUpCounter(uint32_t RTC_WakeUpCounter); uint32_t RTC_GetWakeUpCounter(void); RTC_WakeUpCmd(DISABLE);//关闭WAKE UP
基于LinkedInSTM32F4时钟系统初始化设置
{
#if(__FPU_PRESENT == 1)">SCB-》CPACR |=((3UL《《10*2)|(3UL《《11*2));
#endif
RCC-》CR |=(uint32_t)0x00000001;
RCC-》CFGR = 0x00000000;
RCC-》CR
在设置完相关寄存器后,接下来SystemInit函数内部会调用SetSysClock函数。这个函数比较长,我们就把函数一些关键代码行截取出来给大家讲解一下。这里我们省略一些宏定义标识符值的判断而直接把针对STM32F407比较重要的内容贴出来:
static void SetSysClock(void)
基于LinkedInSTM32F4时钟系统初始化设置
LinkedInSTM32F4时钟系统初始化是在system_stm32f4xx.c中的SystemInit()函数中完成的。对于系统时钟关键寄存器设置主要是在SystemInit函数中调用SetSysClock()函数来设置的。我们可以先看看SystemInit()函数体:
RCC-》CFGR |= RCC_CFGR_PPRE2_DIV2;
RCC-》CFGR |= RCC_CFGR_PPRE1_DIV4;
RCC-》CFGR |= RCC_CFGR_PPRE2_DIV1;
RCC-》CFGR |= RCC_CFGR_PPRE1_DIV2;
RCC-》PLLCFGR = PLL_M |(PLL_N《《6)|(((PLL_P》》1)-1)《《16)|
#endif
这里默认固件库配置的是25000000,我们外部时钟为8MHz,所以我们根据我们硬件情况修改为8000000即可。