野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 18284|回复: 2

关于TIM3中的TIM_OCMode_Toggle模式

[复制链接]
发表于 2019-6-2 16:31:43 | 显示全部楼层 |阅读模式
这是我的初始化,我看资料都是写的当CNT》CCR时就会翻转,这样子的话TIM_OCMode_Toggle的频率是怎么设定的?
我这样初始化的话 频率刚好是:36M/72/72 = 69.944K
但是这个和CCR没有关系了,很奇怪
void init_tim3()
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStruct;
        TIM_OCInitTypeDef                          TIM_OCInitStruct;
        GPIO_InitTypeDef         GPIO_InitStructure;
        NVIC_InitTypeDef                                  NVIC_InitStructure;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//TIM3是挂接在APB1时钟上的
       
       
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用开漏输出
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;//PA6
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//翻转速度=10MHZ
        GPIO_Init(GPIOA, &GPIO_InitStructure);//TIM3通道1IO口
       
        TIM_DeInit(TIM3);

        TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;//目前TIM3的时钟是36m
        TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//向下计数
        TIM_TimeBaseInitStruct.TIM_Period=72-1; //这个是预装载值arr ,也就是定时时间,一个时钟0.5us,向下计数值200就是定时0.1ms=10k
        TIM_TimeBaseInitStruct.TIM_Prescaler=72-1;//36m的时钟72分频=0.5mhz,这个就是psc
        //TIM_TimeBaseInitStruct.TIM_RepetitionCounter=//这个选项是高级定时器才会用到
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);//输出频率=定时器溢出周期的倒数
       
        //TIM_OCInitStruct.TIM_OCIdleState=//高级定时器才需要配置这个选项
        //TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;//pwm模式1输出
        TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_Toggle;//TIM_OCMode_Toggle输出
        //TIM_OCInitStruct.TIM_OCNIdleState=//高级定时器才需要配置这个选项
        //TIM_OCInitStruct.TIM_OCNPolarity=//高级定时器才需要配置这个选项
        TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;//高电平有效
        //TIM_OCInitStruct.TIM_OutputNState=//高级定时器才需要配置这个选项
        TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;//使能比较输出
        TIM_OCInitStruct.TIM_Pulse=30;//这个是ccr,占空比=ccr/arr,不过理论值和实际结果好像对不上
        TIM_OC1Init(TIM3,&TIM_OCInitStruct);//TIM3的通道1-PA6
/*
        TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;//pwm模式1输出
        TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;//高电平有效
        TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;//使能比较输出
        TIM_OCInitStruct.TIM_Pulse=50;//初始化占空比,高电平有效情况下,低电平的占空比
        TIM_OC2Init(TIM3,&TIM_OCInitStruct);//TIM3的通道2-PA7
       
        TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;//pwm模式1输出
        TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;//高电平有效
        TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;//使能比较输出
        TIM_OCInitStruct.TIM_Pulse=25;//初始化占空比,高电平有效情况下,低电平的占空比
        TIM_OC3Init(TIM3,&TIM_OCInitStruct);//TIM3的通道3-PB0

        TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;//pwm模式1输出
        TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;//高电平有效
        TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;//使能比较输出
        TIM_OCInitStruct.TIM_Pulse=10;//初始化占空比,高电平有效情况下,低电平的占空比
        TIM_OC4Init(TIM3,&TIM_OCInitStruct);//TIM3的通道4-PB1
        */
          /* 定时器比较输出通道1预装载配置:使能预装载 */
  TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable);
        //clear the TIM3 overflow interrupt flag
        TIM_ClearFlag(TIM3,TIM_FLAG_Update);
        //TIM3 overflow interrupt enable
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
        //enable TIM3
        TIM_Cmd(TIM3,ENABLE);
        //TIM_CtrlPWMOutputs(TIM1, ENABLE); //如果是使用高级定时器一定要使能pwm功能,这里使用的是通用定时器所以不需要这条语句
       
}



回复

使用道具 举报

发表于 2019-6-3 09:07:37 | 显示全部楼层
你用示波器量的频率是69.944K吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-7 21:37:37 | 显示全部楼层
WishWish 发表于 2019-6-3 09:07
你用示波器量的频率是69.944K吗

我是逻辑分析仪量的 是69.944k
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-12-6 15:38 , Processed in 0.038801 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表