STM32单片机APB1和APB2的区分

本文详细介绍了STM32单片机的时钟系统,包括HSE和HSI时钟源,主锁相环PLL的工作原理,以及如何根据外部晶振设置时钟参数。此外,还讲解了APB1和APB2总线的区别,APB1最高42MHz,APB2最高84MHz,定时器的时钟输入可能受到分频影响。通过理解这些概念,有助于更好地进行STM32的系统配置和外设操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STM32单片机APB1和APB2的区分

 

1.首先注意的的是图中画绿色圈圈的两个,HSE和HSI分别表示外部时钟和内部时钟,其中HSE 是是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,HSE 也可以直接做为系统时钟或者 PLL 输入(从红圈4处可以看出),频率范围为 4MHz~26MHz。STM32默认为25Mhz,像原子的板子就是8Mhz的,所以移植时一定要格外注意。

STM32单片机APB1和APB2的区分

 

2.注意红圈2代表的部分,这里是主锁相环倍频输出,用于产生系统需要的高速时钟信号,如图绿色箭头所示(STM32还有一个副锁相环,如红圈3)

主 PLL 时钟的时钟源要先经过一个分频系数为 M 的分频器,然后经过倍频系数为 N 的倍频器出来之后的时候还需要经过一个分频系数为 P(第一个输出 PLLP)或者 Q(第二个输出 PLLQ)的分频器分频之后,最后才生成最终的主 PLL 时钟。例如我们的外部晶振选择 8MHz。同时我们设置相应的分频器 M=8,倍频器倍频系数 N=336,分频器分频系数 P=2,那么主 PLL 生成的第一个输出高速时钟 PLLP 为:PLL=8MHz * N/ (M*P)=8MHz* 336 /(8*2) = 168MHz(来源:正点原子)

3.区分APB1和APB2

如红圈8表示的位置,STM32F4 很多外设的时钟来源,即两个总线桥: APB1 和 APB2,其中 APB1是低速总线(最高 42Mhz),APB2 是高速总线(最高 84Mhz)。另外定时器部分,如果所在总线( APB1/APB2)的分频系数为 1,那么就不倍频,如果不为 1(比如 2/4/8/16),那么就会 2 倍频( Fabpx*2)后,作为定时器时钟输入。

简单点说,举个APB1的例子,系统时钟是168Mhz,APB1分频系数为4(system_stm32f4xx.c配置),则APB1速度为42Mhz,但是挂靠在在该总线上的定时器3,由于分频系数4而不是1,因此定时器输入频率为42Mhz x 2 =84 Mhz,具体详见这篇文章点击打开链接

4.AHB总线频率

见图

STM32单片机APB1和APB2的区分

STM32F429IGT6是一款基于Cortex-M4的微控制器,它集成了一系列高级定时器,其中Timer1至Timer7都是常用的定时器资源。使用这些定时器进行定时操作,可以实现精确的时间控制,比如计数、PWM生成、间隔测量等功能。以下是一个基本的使用 TIM3 定时器(也称为通用定时器)进行定时的程序概述: 1. **初始化定时器**: 首先,你需要配置TIM3的时钟源工作模式。例如,如果你想要使用系统时钟的分频,可以这样设置: ```c RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBaseInitTypeDef.TIM_TimeBaseStructure.TIM_Prescaler = ...; // 根据系统时钟频率所需定时精度计算预分频值 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_Cmd(TIM3, ENABLE); // 启动定时器 ``` 2. **设置定时模式**: 如果是计数模式,可能需要设置计数器的初始值溢出事件处理(例如中断或DMA)。使用`TIM_SetCounter`函数设置初始计数值。 3. **启用定时中断**: ```c NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; // TIM3中断对应的中断号 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = ...; // 设置优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = ...; // 可选,设置子优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 开启中断 NVIC_Init(&NVIC_InitStructure); ``` 接下来,定义`TIM3_IRQHandler`中断服务函数来响应定时器溢出或到达指定时间。 4. **定时器回调**: 如果你想要在定时到达某个时间点后执行特定操作,可以使用`TIM_ITConfig`函数配置相应的中断标志,然后编写中断处理程序,在其中添加你的自定义逻辑。 ```c TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); // 更新中断启用 ``` 5. **关闭定时器**: 当定时任务完成或者不需要定时器时,记得调用`TIM_Cmd(TIM3, DISABLE)`关闭定时器。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值