stm32f103 系统时钟72MHZ 配置定时器3为50us中断一次
时间: 2024-12-29 18:31:35 浏览: 7
STM32F103系列微控制器通常采用HSE(高频外部振荡器)作为系统时钟源,如果已配置为72MHz,你需要通过时钟分频器将这个频率降低到适合作为定时器的工作频率,并设置定时器3以达到50us中断的要求。
首先,你需要确定一个合适的预分频器(例如PCLK1,即系统时钟除以2或4)和分频系数,使得定时器3的基本周期(Timer Prescaler)满足要求。对于72MHz的系统时钟,如果需要50us中断,假设基本周期设为8(因为2^3 = 8),那么实际工作频率大约是:
```c
72MHz / (8 * 分频系数) ≈ 9MHz
```
选择一个合适的分频系数(通常是2、4、8或更高,取决于是否可以得到整数倍的9MHz),例如分频系数为8,则实际工作频率接近于9.765625MHz。然后配置定时器3的Prescaler为此值。
接下来,在STM32CubeMX或通过HAL库中,配置定时器3的计数模式为Up(递增计数),然后设置其周期寄存器(如ARR)为8,这样计数值达到8时会触发溢出中断。
配置中断时,选择Timer3_IRQn并设置它的优先级,设置中断服务函数ISER寄存器使得当计数溢出时(到达8)自动中断,然后在该中断服务函数内,测量当前的时间,判断是否达到了50us。如果超过了50us,清除定时器并可能延时调整,然后再次开始计时。
相关问题
stm32f103 标准库定时器1进行50us中断一次配置
STM32F103系列微控制器中的定时器1可以用于实现周期性的中断,例如每50us触发一次。以下是基本步骤:
1. **初始化定时器1**:
- 首先需要设置定时器1的工作模式为PWM或通用定时器模式。对于50us中断,通常选择通用定时器模式(TIM管理模式)。
```c
TIM_TimeBaseInitTypeDef.TIM_InitStruct = {0};
TIM_InitStruct.TIM_Prescaler = (SystemCoreClock / 16) - 1; // 预分频值取决于系统时钟频率
TIM_InitStruct.TIM_Period = 50; // 设置定时周期为50个时间单位,每个单位等于系统时钟的1/8
TIM_InitStruct.TIM_ClockDivision = 0; // 分频系数为1,无额外时钟分割
TIM_InitStruct.TIM_CounterMode = TIM_COUNTERMODE_UP; // 向上计数模式
HAL_TIM_TimeBaseInit(&htim1, &TIM_InitStruct);
```
2. **使能定时器和中断**:
- 激活定时器和设置定时器溢出中断。在STM32 HAL库中,这是通过`HAL_TIM_IRQHandler`函数处理的。
```c
__HAL_TIM_ENABLE_IT(&htim1, TIM_IT_Update); // 更新中断使能
NVIC_EnableIRQ(TIM1_IRQn); // 开启定时器1中断
```
3. **注册中断服务函数**:
- 你需要提供一个回调函数,当定时器溢出时会被调用。在这个函数里处理你的50us中断逻辑。
```c
void TIM1_IRQHandler(void)
{
HAL_TIM_IRQHandler(&htim1);
// 在这里编写你的50us中断处理代码
}
```
4. **启用定时器**:
```c
HAL_TIM_Base_Start_IT(&htim1);
```
请注意,实际应用中可能还需要根据具体的中断优先级、中断向量组设置等调整。
怎么配置STM32F103ZET6定时器系统时钟为72MHz标准库代码
要配置STM32F103ZET6定时器系统时钟为72MHz,可以按照以下步骤进行:
1. 首先,确保你已经正确地设置了系统时钟为72MHz。这可以通过RCC(Reset and Clock Control)模块来实现。使用`RCC_DeInit()`函数将RCC模块恢复到默认设置,然后配置时钟源为外部晶振(HSE),并设置适当的分频系数。
```c
// 复位并配置RCC模块
RCC_DeInit();
// 启用外部晶振
RCC_HSEConfig(RCC_HSE_ON);
RCC_WaitForHSEStartUp();
// 设置PLL时钟源为外部晶振,分频系数设置为9(8MHz / 1 * 9 = 72MHz)
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
// 启用PLL
RCC_PLLCmd(ENABLE);
// 等待PLL稳定
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
// 设置系统时钟源为PLL
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
// 设置AHB总线分频系数为1(72MHz)
RCC_HCLKConfig(RCC_SYSCLK_Div1);
// 设置APB1总线分频系数为2(36MHz)
RCC_PCLK1Config(RCC_HCLK_Div2);
// 设置APB2总线分频系数为1(72MHz)
RCC_PCLK2Config(RCC_HCLK_Div1);
// 更新系统时钟频率
SystemCoreClockUpdate();
```
2. 然后,根据你要配置的定时器,选择相应的定时器外设,并对其进行配置。
以定时器2为例,使用标准库函数进行配置,可以按照以下步骤进行:
```c
// 启用定时器2的时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
// 配置定时器
TIM_TimeBaseInitTypeDef TIM_InitStructure;
TIM_InitStructure.TIM_Prescaler = 0; // 不分频
TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式
TIM_InitStructure.TIM_Period = 7199; // 计数周期为7200(72MHz / 7200 = 10kHz)
TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 不分频
TIM_InitStructure.TIM_RepetitionCounter = 0; // 重复计数器为0
TIM_TimeBaseInit(TIM2, &TIM_InitStructure);
// 启用定时器2
TIM_Cmd(TIM2, ENABLE);
```
3. 最后,你可以根据需要配置定时器的其他功能,如中断、PWM等。
这样,你就成功地将STM32F103ZET6的定时器系统时钟配置为72MHz了。
阅读全文