概述
STM32定时器从模式———复位模式
在网上找相关的STM32复位模式的配置几乎没有,于是看官方提供的例程,官方的提供的例程没有针对性,眉毛胡子袜子一把抓,而且都是定时器级联,不是很好阅读,于是简单写了个关于定时器复位模式的简单配置例程,仅供大家参考。
应用:这里的定时器复位模式,我把它应用在串口通信判断接收一帧的结束上,也就是说,接受 一帧数据结束的进入中断,否则,只要还有数据在传,就一直复位定时器,不会进入中断。相比于依赖于串口中断再用定时器去计时,这种硬件的判断一帧结束的方式会更可靠。
采用复位模式,所需资源:一个基本/高级定时器,定时器的一个通道,串口。
芯片:stm32f302CBT6
定时器: TIM3 CH1
CH1对应引脚 : PB4
配置完成后 PB4 拿杜邦线 接在 PA10(RX)上
为什么是PB4 :因为我在CubeMX上,勾选了一下,SlaveMode:Reset_Mode, Trigger Sourse:TI1_ED
他就自动帮我选择了 PB4这个引脚,不知道其他CHx是否可以,大家可以试一下,在下面评论告诉我。
这里我是先在CubeMx上选了一下之后再用库函数进行编辑。
下面配置过程:
/***********************使用TIM3_TIM_TS_TI1F_ED边沿触发***************************/
/*TIM3 CH1 PB4 init */
void gpio_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE); /*enable gpioB*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE); /*复用时钟*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_PinAFConfig(GPIOB,GPIO_PinSourse4,GPIO_AF_2);
}
/*TIM3 config*/
void tim3_init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_TIM3,ENABLE);
TIM_DeInit(TIM3);
/*时基单元部分根据自己需要赋值*/
TIM_TimeBaseStructure.TIM_Period = 9999;
TIM_TimeBaseStructure.TIM_Prescaler = 7199;
TIM_TimeBaseStructure.TIM_ClockDivsion = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_UP;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
TIM_ARRPreloadConfig(TIM3,DISABLE);
TIM_ClearFlag(TIM3,TIM_FLAG_Updata);
TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);
TIM_SelectInputTrigger(TIM3,TIM_TS_TI1F_ED);
TIM_SelectMasterSlaveMode(TIM3,TIM_MasterSlaveMode_Disable);
TIM_SelectOutputTrigger(TIM3, TIM_TRGOSourse_Enable);
TIM_UpdateRequestConfig(TIM3, TIM_UpdateSource_Regular); /*enable URS*/
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
TIM_CMD(TIM3,ENABLE);
}
/***********************END--使用TIM3_TIM_TS_TI1F_ED边沿触发--END***********************/
/***********************使用TIM3_TIM_TS_ETRF外部触发********************************/
/*TIM3 ETR PB3 init */
void gpio_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE); /*enable gpioB*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE); /*复用时钟*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_PinAFConfig(GPIOB,GPIO_PinSourse3,GPIO_AF_10);
}
/*TIM3 config*/
void tim3_init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_TIM3,ENABLE);
TIM_DeInit(TIM3);
/*时基单元部分根据自己需要赋值*/
TIM_TimeBaseStructure.TIM_Period = 9999;
TIM_TimeBaseStructure.TIM_Prescaler = 7199;
TIM_TimeBaseStructure.TIM_ClockDivsion = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_UP;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
TIM_ARRPreloadConfig(TIM3,DISABLE);
TIM_ClearFlag(TIM3,TIM_FLAG_Updata);
TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);
TIM_SelectInputTrigger(TIM3,TIM_TS_ETRF);
TIM_SelectMasterSlaveMode(TIM3,TIM_MasterSlaveMode_Disable);
TIM_SelectOutputTrigger(TIM3, TIM_TRGOSourse_Enable);
TIM_UpdateRequestConfig(TIM3, TIM_UpdateSource_Regular); /*enable URS*/
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
TIM_CMD(TIM3,ENABLE);
}
/***********************END--使用TIM3_TIM_TS_ETRF边沿触发--END***********************/
void TIM3_IRQHAndle(void)
{
if (TIM_GetFlagStatus(TIM3,TIM_FLAG_Update) == SET)
{
TIM_ClearFlag(TIM3,TIM_FLAG_Update);
... ... /*do something*/
/*PB4 与 PA10 (RX)相连*/
/*RX有数据不会进中断*/
/*当RX没有数据传输且到达定时器更新中断 则标记一帧接收结束 可以处理数据*/
}
}
/------------------------------------------------------------END------------------------------------------------------------------/
最后
以上就是危机茉莉为你收集整理的STM32 定时器和外部触发的同步(从模式: 复位模式)的全部内容,希望文章能够帮你解决STM32 定时器和外部触发的同步(从模式: 复位模式)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复