【发布时间】:2021-04-22 01:02:21
【问题描述】:
这几天我一直在阅读参考手册并更改代码以配置 STM32F401RE 定时器时钟。好像SYSCLK设置为84MHZ,PCLK1为42MHZ,PCLK2为84MHZ。但是每次我想用TIM2,时钟都设置在1.6MHZ。我用我的手机从开启和关闭状态开始计时,使用 PSC 和 ARR 我假设时钟频率约为 1.6MHZ
这里是时钟配置
RCC->APB1ENR |= RCC_APB1ENR_PWREN;
PWR->CR &= ~PWR_CR_VOS_Msk;
PWR->CR |= PWR_CR_VOS_1; // scale mode 2
// flash
FLASH->ACR &= ~FLASH_ACR_LATENCY;
FLASH->ACR |= FLASH_ACR_LATENCY_2WS;
// HSI CONFIGURATION
RCC->CR |= RCC_CR_HSION;
while( !(RCC->CR & RCC_CR_HSIRDY) ){}
// PLL CONFIGURATION
RCC->PLLCFGR &= ~RCC_PLLCFGR_PLLSRC; // PLL SRC= HSI
RCC->PLLCFGR &= ~RCC_PLLCFGR_PLLM_Msk;
RCC->PLLCFGR |= 16 << RCC_PLLCFGR_PLLM_Pos;
RCC->PLLCFGR &= ~RCC_PLLCFGR_PLLN_Msk;
RCC->PLLCFGR |= 336 << RCC_PLLCFGR_PLLN_Pos;
RCC->PLLCFGR &= ~RCC_PLLCFGR_PLLP_Msk;
RCC->PLLCFGR |= RCC_PLLCFGR_PLLP_0; // div4
RCC->PLLCFGR &= ~RCC_PLLCFGR_PLLQ_Msk;
RCC->PLLCFGR |= 4 << RCC_PLLCFGR_PLLQ_Pos;
RCC->CR |= RCC_CR_PLLON;
while( !(RCC->CR & RCC_CR_PLLRDY) ){}
// CPU, AHB, APB buses clocks
RCC->CFGR &= ~RCC_CFGR_SW_Msk;// PLL CLK SRC
RCC->CFGR |= RCC_CFGR_SW_PLL;
while( !(RCC->CFGR & RCC_CFGR_SWS_PLL) ){}
// flash
FLASH->ACR &= ~FLASH_ACR_LATENCY;
FLASH->ACR |= FLASH_ACR_LATENCY_2WS;
RCC->CFGR &= ~RCC_CFGR_HPRE; // AHB DIV 1
RCC->CFGR |= RCC_CFGR_HPRE_DIV1;
RCC->CFGR &= ~RCC_CFGR_PPRE1_Msk; // APB1 DIV 2
RCC->CFGR |= RCC_CFGR_PPRE1_DIV2;
RCC->CFGR &= ~RCC_CFGR_PPRE2_Msk; // APB2 DIV 1
RCC->CFGR |= RCC_CFGR_PPRE2_DIV1;
SystemCoreClockUpdate();
这是 timer2 的配置
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
TIM2->CR1 |= TIM_CR1_CKD_1;
TIM2->PSC = 1093-1;
TIM2->ARR = 1024 - 1;
TIM2->CNT = 0;
TIM2->DIER |= TIM_DIER_UIE;
NVIC_EnableIRQ(TIM2_IRQn);
TIM2->CR1 |= TIM_CR1_CEN;
我在配置中有什么遗漏或误解的吗?
【问题讨论】:
-
您尚未显示切换 LED 的代码,因此我们无法确定这是否正确 - 即我们不知道您在计时。您要设置什么定时器频率?您的 PSC/ARR 建议 ~74.9823Hz,这可能不是有意的。
-
SystemCoreClockUpdate();在我使用 RCC 魔法之后确实看起来很可疑。它可能以不同的方式设置时钟。 -
@0___________ 该函数仅更新在供应商提供的 init 文件中定义的
SystemCoreClock全局变量。如果在 RCC 魔法 之后立即调用它,如果固件没有等待实际发生更改,它可能会计算错误的值。但由于 OP 不使用 HAL 库,我认为即使是损坏的SystemCoreClock在这种情况下也不会导致问题。
标签: timer embedded stm32 stm32f4discovery stm32f4