打印

关于STM32F100xTIM1从模式下复位模式的问题

[复制链接]
3068|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
w_u123|  楼主 | 2011-4-13 16:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我根据官方资料上的说明去配置这个定时器,发现在外部触发上升沿到来时,定时器并不会复位。但是 如果设置CR1_URS位,可以发现的确是产生了更新事件。这是怎么回事?
void TIM_Configuration( void )
{
TIM_ICInitTypeDef TIM_ICInitStructure;
//TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_SelectInputTrigger( TIM1, TIM_TIxExternalCLK1Source_TI1 );
TIM_SelectSlaveMode( TIM1, TIM_SlaveMode_Reset );


//TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
//TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Down;
//TIM_TimeBaseInitStructure.TIM_Period = 40;
//TIM_TimeBaseInitStructure.TIM_Prescaler = 0;
//TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
//TIM_TimeBaseInit( TIM1, &TIM_TimeBaseInitStructure );
TIM_CounterModeConfig( TIM1, TIM_CounterMode_Down );
//TIM_SetCounter( TIM1, 100 );      
TIM_SetAutoreload( TIM1, 100 );      //当计数值为240时,计数溢出时间为 ( 1 / 24 ) * 240 = 10 us
TIM_ARRPreloadConfig( TIM1, DISABLE );     //禁止重装载
TIM_UpdateRequestConfig( TIM1, TIM_UpdateSource_Global );

TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICFilter = 0;    //不使用滤波器
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInit( TIM1, &TIM_ICInitStructure );

TIM_ITConfig( TIM1, TIM_IT_Update, ENABLE );
//TIM_ITConfig( TIM1, TIM_IT_Break, ENABLE );
TIM_ITConfig( TIM1, TIM_IT_Trigger, ENABLE );

}
沙发
w_u123|  楼主 | 2011-4-14 09:19 | 只看该作者
/*******************************************************************************
* Function Name  : TIM_Configuration
* Description    : Configures the TIM1 as Reset mode.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void TIM_Configuration( void )
{
//配置TI1FP1作为外部触发输入
        TIM_SelectInputTrigger( TIM1, TIM_TIxExternalCLK1Source_TI1 );
//配置定时器为复位模式
        TIM_SelectSlaveMode( TIM1, TIM_SlaveMode_Reset );
//选择计数模式为向下计数               
        TIM_CounterModeConfig( TIM1, TIM_CounterMode_Down );
//设置计数周期为480
        TIM_SetAutoreload( TIM1, 480 );                                                        //当计数值为480时,计数溢出时间为 ( 1 / 24 ) * 480 = 20 us
//禁止重装载(目前无效)
        TIM_ARRPreloadConfig( TIM1, DISABLE );                                       
//选择只有溢出才能产生更新中断请求       
        TIM_UpdateRequestConfig( TIM1, TIM_UpdateSource_Regular );       
//允许更新中断
        TIM_ITConfig( TIM1, TIM_IT_Update, ENABLE );
}
今天早晨经过无数次的试验终于找到了正确的配置的方法。另外该定时器的使能我是在usart的接收中断内完成的。这样做的目的在于用该定时器实现对不定长数据帧接收完成的检测。数据帧最后一个字节的最后一个上升沿触发定时器最后一次复位,由于后面没有数据了,所以定时器会在预先设定的时间发生溢出中断,从而告诉系统一帧数据接收完毕。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

23

帖子

1

粉丝