ywfw30 发表于 2024-11-4 15:38

定时器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呢,感觉有点无厘头??

难道买到假的芯片了?不可能这种假法吧??










海滨消消 发表于 2024-11-5 10:32

针对STM32F103C8T6定时器1遇到的问题,确保PA0和PA1没有被配置为定时器1的复用功能(如输入捕获/输出比较),除非你的应用确实需要这些功能。

qinlu123 发表于 2024-11-5 11:19

用cubeMX生成代码试一下,有可能你的程序别的地方对定时器配置了

laocuo1142 发表于 2024-11-5 13:00

尝试将PA0和PA1配置为其他模式(如浮空输入或下拉输入),以查看问题是否仍然存在。
如果问题仍然存在,考虑将这两个引脚用于其他目的或完全禁用它们。

xionghaoyun 发表于 2024-11-5 13:37

学习一下

flycamelaaa 发表于 2024-11-5 14:00

重新检查定时器1的配置,确保所有参数都正确无误。
确保没有其他中断或任务干扰定时器1的正常工作。

QuakeGod 发表于 2024-11-5 15:46

初始化的问题。

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的时间基数单位

powerantone 发表于 2024-11-5 18:00

检查STM32F103C8T6芯片和周围电路的连接是否正确。

ywfw30 发表于 2024-11-6 09:06

QuakeGod 发表于 2024-11-5 15:46
初始化的问题。

void TIM1_Int_Init(u16 arr,u16 psc)


厉害了,确实如此,改完后就好了。
搞不懂还要初始化0呀,不是默认的都是0吗

stormwind123 发表于 2024-11-6 10:00

查阅STM32F103C8T6的参考手册和定时器相关的文档
页: [1]
查看完整版本: 定时器1遇到的诡异问题