你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103通用定时器中断服务函数

[复制链接]
Pure Tiger 提问时间:2022-11-30 22:12 / 未解决
在利用“通用定时器”捕获PWM信号的过程中,我们的中断服务函数是设置为如下的哪一种模式呢?模式1和模式2:
模式1:
        if ( TIM_GetITStatus ( GENERAL_TIM, TIM_IT_Update) != RESET )               
        {       
                TIM_ICUserValueStructure.Capture_Period ++;               
                TIM_ClearITPendingBit ( GENERAL_TIM, TIM_FLAG_Update );                
        }

        // 上升沿捕获中断
        if ( TIM_GetITStatus (GENERAL_TIM, GENERAL_TIM_IT_CCx ) != RESET)
        {
                // 第一次捕获
                if ( TIM_ICUserValueStructure.Capture_StartFlag == 0 )
                {
                        // 计数器清0
                        TIM_SetCounter ( GENERAL_TIM, 0 );
                        // 自动重装载寄存器更新标志清0
                        TIM_ICUserValueStructure.Capture_Period = 0;
      // 存捕获比较寄存器的值的变量的值清0                       
                        TIM_ICUserValueStructure.Capture_CcrValue = 0;

                        // 当第一次捕获到上升沿之后,就把捕获边沿配置为下降沿
                        GENERAL_TIM_OCxPolarityConfig_FUN(GENERAL_TIM, TIM_ICPolarity_Falling);
      // 开始捕获标准置1                       
                        TIM_ICUserValueStructure.Capture_StartFlag = 1;                       
                }
                // 下降沿捕获中断
                else // 第二次捕获
                {
                        // 获取捕获比较寄存器的值,这个值就是捕获到的高电平的时间的值
                        TIM_ICUserValueStructure.Capture_CcrValue =
                        GENERAL_TIM_GetCapturex_FUN (GENERAL_TIM);

                        // 当第二次捕获到下降沿之后,就把捕获边沿配置为上升沿,好开启新的一轮捕获
                        GENERAL_TIM_OCxPolarityConfig_FUN(GENERAL_TIM, TIM_ICPolarity_Rising);
      // 开始捕获标志清0               
                        TIM_ICUserValueStructure.Capture_StartFlag = 0;
      // 捕获完成标志置1                       
                        TIM_ICUserValueStructure.Capture_FinishFlag = 1;               
                }

                TIM_ClearITPendingBit (GENERAL_TIM,GENERAL_TIM_IT_CCx);            
        }       


模式2:
/* 清除中断标志位 */
TIM_ClearITPendingBit(GENERAL_TIM, TIM_IT_CC1);
/* 获取输入捕获值 */
IC1Value = TIM_GetCapture1(GENERAL_TIM);
IC2Value = TIM_GetCapture2(GENERAL_TIM);
// 注意:捕获寄存器CCR1和CCR2的值在计算占空比和频率的时候必须加1
if (IC1Value != 0)  {    /* 占空比计算 */    DutyCycle = (float)((IC2Value+1) * 100) / (IC1Value+1);
/* 频率计算 */
Frequency = (72000000/(ADVANCE_TIM_PSC+1))/(float)(IC1Value+1);
printf("占空比:%0.2f%%   频率:%0.2fHz\n",DutyCycle,Frequency);
}
else
{
DutyCycle = 0;
Frequency = 0;
}       

收藏 评论3 发布时间:2022-11-30 22:12

举报

3个回答
ghfhfgh 回答时间:2022-12-1 00:36:51
写中断就不要用判断函数,直接在中断回调函数写
xmshao 回答时间:2022-12-1 09:57:21
基于定时器捕获测量脉宽及占空比,你代码里涉及到的两种模式都可以,你根据情况来。具体就是资源及你对两种模式的理解。


第一种模式基于一个通道,中途要做捕获边沿的切换。特点是只需要1个捕获通道,但需做捕获边沿切换  。第二种模式是基于定时器复位从模式,要使用2个捕获通道,分别捕捉上沿和下沿,无须中途做捕获沿的切换。在捕获过程中没有发生计数器溢出的话,捕获值获得简单。


从你给出的代码来看,似乎待测信号宽度不会长于计数周期,即无须统计溢出次数,否则得考虑溢出次数。


另外,若使用模式2的话,在发生通道1捕获事件后就进行频率及占空比计算的话,应该保证通道2已经做过捕获并获得捕获值。
butterflyspring 回答时间:2022-12-1 10:55:14


关于PWM的测量,官方有现成的例程呀,可以参考。
另外中断里最好不要用printf 函数,占用时间有点长。

STM32F10x_StdPeriph_Lib_V3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\TIM\PWM_Input
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版