为什么我的STM32F7仅每43秒中断一次
Why does my STM32F7 only interrupt every 43 seconds?
我的目标是中断38kHz并切换一个LED,但是无论我设置为预定器和周期
static TIM_HandleTypeDef s_TimerInstance = {
.Instance = TIM2,
};
void Hal::initTim()
{
__TIM2_CLK_ENABLE();
s_TimerInstance.Init.Prescaler = 96; // This does nothing
s_TimerInstance.Init.CounterMode = TIM_COUNTERMODE_UP;
s_TimerInstance.Init.Period = 26; // This does nothing
s_TimerInstance.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(&s_TimerInstance);
HAL_TIM_Base_Start_IT(&s_TimerInstance);
HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM2_IRQn);
}
extern "C" void TIM2_IRQHandler()
{
HAL_TIM_IRQHandler(&s_TimerInstance);
}
extern "C" void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
HAL_GPIO_TogglePin(GPIOI, GPIO_PIN_1); // Happens every 43 seconds for some reason
}
extern "C" void HAL_TIMEx_BreakCallback(TIM_HandleTypeDef *htim){}
extern "C" void HAL_TIMEx_CommutationCallback(TIM_HandleTypeDef *htim){}
当我将其刷新到目标时,LED每43秒切换一次,无论将预定器和周期设置为什么。
我一定缺少一些东西,但我无法弄清楚。任何有可以帮助您的中断经验的人?
很好。计时器超级简单。您刚刚使用Cube很难。
__TIM2_CLK_ENABLE();
TIM2->PSC = 96; // prescaler (note that 0 is /1)
TIM2->ARR = 0xFFFF-26; // reload on overflow
TIM2->DIER = TIM_DIER_UIE; // overflow isr
TIM2->CR1 |= TIM_CR1_CEN; // enable timer
HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM2_IRQn);
在ISR中:
if(TIM2->SR & TIM_SR_UIF){
TIM2->SR &= ~TIM_SR_UIF;
}
旁边。我喜欢在Init上保证重置条件。
__HAL_RCC_TIM2_FORCE_RESET();
__NOP();
__HAL_RCC_TIM2_RELEASE_RESET();
带有STM32F469I划分的不同项目,但我遵循Jeroen3的答案。我不确定您在哪里拥有__HAL_RCC
...和__NOP();
代码,但是它没有它。我计算了预定器和时期是某些因素。例如,要获得眨眼LED 1Hz,我将拥有Prescaler' * ofere'= timer_clock,我了解到的是core_clock/2。
因此,一个180MHz的Core_clock和1Hz的所需中断会给出
(Prescaler 1)*(周期 1)= 180MHz/2/1Hz = 90m
可以分为9000和10000。我不确定预定器,但是16位计时器上的周期可能不超过2⁶-1。这意味着这些因素不能为90000和1000,因为90000超过2⁶-1。也不能是900和100000。
extern "C"
{
#include "stm32f4xx_hal.h"
#include "stm32f4xx_hal_tim.h"
#include "stm32469i_discovery.h" //Needed for LED
/* User can use this section to tailor TIMx instance used and associated
resources */
/* Definition for TIMx clock resources */
#define TIMx TIM3
#define TIMx_CLK_ENABLE() __HAL_RCC_TIM3_CLK_ENABLE()
/* Definition for TIMx's NVIC */
#define TIMx_IRQn TIM3_IRQn
#define TIMx_IRQHandler TIM3_IRQHandler
void TIM3_IRQHandler()
{
if(TIMx->SR & TIM_SR_UIF){
TIMx->SR &= ~TIM_SR_UIF;
BSP_LED_Toggle(LED2);
}
}
void initTimer()
{
TIMx_CLK_ENABLE();
//SystemCoreClock = 180MHz
//PSC = 180/2/10000-1 = 9000-1
TIMx->PSC = (uint32_t)((SystemCoreClock / 2) / 10000) - 1;// prescaler (note that 0 is /1)
TIMx->ARR = 10000-1; // reload on overflow
TIMx->DIER = TIM_DIER_UIE; // overflow isr
TIMx->CR1 |= TIM_CR1_CEN; // enable timer
HAL_NVIC_SetPriority(TIMx_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIMx_IRQn);
}
}
#include "gui/model/Timer.hpp"
void Timer::init()
{
initTimer();
}
其他灵感:https://github.com/paxinstruments/stm32cubef4/blob/master/projects/stm32469i-discovery/examples/tim/tim/tim_timebase/src/src/main.c/main.c
相关文章:
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 在C++中一次将矢量值写入多个文件
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 为什么 zlib 放气初始化调用一次不起作用?
- 在一次迭代中从 txt 文件中读取多行
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- 高级选择排序 - 在一次迭代中搜索两个元素
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 如何仅使用一次固定<<设置精度(2)?或者至少恢复到默认行为?
- 什么是仅调用一次并调用参数的控制台应用
- 如何确保用户在一行上提示输入一次时输入名字和姓氏?
- (C++)虽然循环一次不起作用,但我引入了多个变量
- Atmel Studio 7:ASF 库提供的 USART 中断处理程序仅在 main() 中遇到无限循环时工作一次?
- 为什么我的STM32F7仅每43秒中断一次
- 我怎样才能进行倒计时,每秒检查一次是否输入了某些内容,而不会中断
- 一次执行后,嵌套for循环出现意外/未见的中断:高斯消去
- 每X秒执行一次代码,但在事件发生时立即中断