高级定时器1 定时时间不对 求助!

2019-10-15 18:02发布

本帖最后由 zhaoyuaiweide 于 2017-1-5 10:35 编辑

定时器1和4相同的配置   相同的装载值和与预分频值   为什么这两个中断里面的LED闪烁频率不同   差距还挺大   求助求助@正点原子

定时器1配置和中断:
void TIM1_Int_Init(u16 arr,u16 psc)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //①时钟 TIM1 使能
        //定时器 TIM1 初始化
        TIM_DeInit(TIM1);
        TIM_TimeBaseStructure.TIM_Period = arr; //设置自动重装载寄存器周期的值
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置时钟频率除数的预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上计数
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //②初始化 TIM1
        TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE ); //③允许更新中断
        //中断优先级 NVIC 设置
        NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; //TIM1 中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级 1 级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级 3 级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能
        NVIC_Init(&NVIC_InitStructure); //④初始化 NVIC 寄存器
        TIM_Cmd(TIM1, ENABLE); //⑤使能 TIM1
}



void TIM1_UP_IRQHandler(void) //TIM1 中断
{
        if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) //检查 TIM1 更新中断发生与否
        {
                TIM_ClearFlag(TIM1, TIM_IT_Update ); //清除 TIM1 更新中断标志
                LED1=!LED1;                        
        }
}




定时器4中断和配置

void TIM4_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //时钟使能
        
        //定时器TIM4初始化
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位

        TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //使能指定的TIM4中断,允许更新中断

        //中断优先级NVIC设置
        NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;  //TIM3中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器


        TIM_Cmd(TIM4, ENABLE);  //使能TIMx                                         
}
//定时器4中断服务程序
void TIM4_IRQHandler(void)   //TIM3中断
{
        if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)  //检查TIM4更新中断发生与否
                {
                TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );  //清除TIMx更新中断标志
                LED1=!LED1;
                }
}



主函数:
int main(void)
{

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        LED_Init();
        TIM1_Int_Init(499,7200);      //定时器1中断5ms   10Khz(72000000/7200) 的计数频率,计数到 5000 为 500ms(50对应5ms)
        //TIM4_Int_Init(499,7199);  
        while(1)
        {
                printf("%f    %f ",Angle_Balance,Accel_Y);
        }
}




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
zhaoyuaiweide
1楼-- · 2019-10-17 13:25
 精彩回答 2  元偷偷看……
zhaoyuaiweide
2楼-- · 2019-10-17 19:23
东北小辉辉 发表于 2017-1-5 14:59
这个问题是可以进行验证的,我猜是因为,手册上这个寄存器的默认值应该是0,所以用寄存器的时候,就不需 ...

在库函数和寄存器版本的程序中都定义了      #define  TIM_RCR_REP            ((uint8_t)0xFF)
仿真的时候寄存器的值是0    库函数的值是3              
他们宏定义的不都是0xff吗   为什么我没有对这两个寄存器操作的时候会从0xff变为其他
东北小辉辉
3楼-- · 2019-10-18 00:33
zhaoyuaiweide 发表于 2017-1-6 11:25
在库函数和寄存器版本的程序中都定义了      #define  TIM_RCR_REP            ((uint8_t)0xFF)
仿真的 ...

大学毕业以后基本就没用过stm32了,手头没有IDE、工程文件和手册,也不是很清楚。

现在在上班,一会我抽时间看一下,怀疑这个宏定义多半是个地址什么的,你仿真一下看看这个宏用到哪了,这个问题应该不难解决。

看看其他网友如何回答。
东北小辉辉
4楼-- · 2019-10-18 04:37
zhaoyuaiweide 发表于 2017-1-6 11:25
在库函数和寄存器版本的程序中都定义了      #define  TIM_RCR_REP            ((uint8_t)0xFF)
仿真的 ...

我手头没有IDE,用UE看了一下,这个宏是定义在stm32f10x.h里面的,看注释确实是一个值,不是地址,你find in files一下,看看这个宏用在哪里了,可能根本就没有用到,用仿真一步一步跟一下。
zhaoyuaiweide
5楼-- · 2019-10-18 08:17
东北小辉辉 发表于 2017-1-6 11:38
我手头没有IDE,用UE看了一下,这个宏是定义在stm32f10x.h里面的,看注释确实是一个值,不是地址,你find ...

恩恩  今天刚上论坛   找了一下   那个只是一个定义   没有用它就   

一周热门 更多>