定时器1遇到的诡异问题
本帖最后由 ywfw30 于 2024-11-4 16:33 编辑stmf103c8t6定时器1遇到的诡异问题:
1.想通过定时器1产生1s的中断用作计时,
具体参数配置 TIM1_Int_Init(9999,7199);
void TIM1_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //时钟使能
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上计数模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_ITConfig(//使能或者失能指定的TIM中断
TIM1, //TIM2
TIM_IT_Update ,
ENABLE//使能
);
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;//TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;//从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure);//根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
TIM_Cmd(TIM1, ENABLE);//使能TIMx外设
}
2.遇到的诡异问题是和PA0、PA1管脚有关
如果程序中不用PA0、PA1管脚,那么定时器可以稳定的产生1s中断
可是一旦要用到PA0、PA1管脚,定时器的中断时间突然变成了3s??????????
用到PA0和PA1时的代码如下,仅仅初始化一下就会影响定时器1
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA时钟
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_0;//PA0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //PA0设置成输入,默认上拉
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_1;//PA0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //PA0设置成输入,默认上拉
GPIO_Init(GPIOA, &GPIO_InitStructure);
3.想不通PA0、PA1怎么影响到定时器1呢,感觉有点无厘头??
难道买到假的芯片了?不可能这种假法吧??
针对STM32F103C8T6定时器1遇到的问题,确保PA0和PA1没有被配置为定时器1的复用功能(如输入捕获/输出比较),除非你的应用确实需要这些功能。 用cubeMX生成代码试一下,有可能你的程序别的地方对定时器配置了 尝试将PA0和PA1配置为其他模式(如浮空输入或下拉输入),以查看问题是否仍然存在。
如果问题仍然存在,考虑将这两个引脚用于其他目的或完全禁用它们。 学习一下 重新检查定时器1的配置,确保所有参数都正确无误。
确保没有其他中断或任务干扰定时器1的正常工作。 初始化的问题。
void TIM1_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure = {0};
NVIC_InitTypeDef NVIC_InitStructure ={0};
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //时钟使能
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上计数模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
检查STM32F103C8T6芯片和周围电路的连接是否正确。 QuakeGod 发表于 2024-11-5 15:46
初始化的问题。
void TIM1_Int_Init(u16 arr,u16 psc)
厉害了,确实如此,改完后就好了。
搞不懂还要初始化0呀,不是默认的都是0吗 查阅STM32F103C8T6的参考手册和定时器相关的文档
页:
[1]