STM32 2定时器主从模式内部互联,不同步!!有木有解

vari_von 2018-08-26 11:24:34
STM32 2定时器主从模式内部互联,不同步!!有木有解????
实现功能:利用定时器主从模式,通过定时器TIM3 内部输出TIM_TRGOSource_OC1Ref时钟触发TIM2计数,TIM2计数中断关闭TIM3 ,实现TIM3输出PWM脉冲数可控
遇到的问题:TIM3 与 TIM2 开启不同步,TIM3先开启工作一段时间后才输出脉冲触发TIM2计数,原因是什么?求解


/*变量定义*/
//extern ledKeyState led_key0 ;
uint16_t TIM3per = 500;
int main(void)
{

vRCC_Config(); //初始化系统,使得系统频率为72M
Init_Delay(72);

TIM_MasterSlaveModeInit(12,TIM3per,TIM3per>>1);
// TIM_Cmd(TIM2,ENABLE);
// TIM_Cmd(TIM3,ENABLE);


while(1)
{
// TIM3per = TIM3per - 2;
// if(TIM3per < 50)
// TIM3per = 100;
// TIM_SetAutoreload(TIM3, TIM3per);//设置TIM3的重装值
// TIM_SetCompare1(TIM3,TIM3per>>1);//设置占空比为50%
// TIM_Cmd(TIM3,ENABLE);//使能TIM3;
}
}

/********************************************************************************
* 函数名:TIM_MasterSlaveModeInit
* 功能 :设置定时器主从模式
* 输入 : TIM2per 定时器TIM2重载值
* TIM3per 定时器TIM3重载值
* TIM3Compare1 定时器TIM3比较预装载值
* 输出 :无
********************************************************************************/

void TIM_MasterSlaveModeInit(uint16_t TIM2per, uint16_t TIM3per, uint16_t TIM3Compare1)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
NVIC_InitTypeDef NVIC_InitStructure;

/*使能外设时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_6; //PA0
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);

/*TIM2工作在单脉冲下*/
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; //没有时钟分割
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInitStruct.TIM_Prescaler = 719; //预分频值,每100us计数一次
TIM_TimeBaseInitStruct.TIM_Period = TIM2per; //重装值
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);

// TIM_SelectOnePulseMode(TIM2,TIM_OPMode_Single); //设置TIM2在单脉冲模式
TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);


TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; //在向上计数时
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //OC1输出使能
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; //有效电平为高
TIM_OCInitStruct.TIM_Pulse = 7; //预装载值
TIM_OC1Init(TIM2,&TIM_OCInitStruct);

/*TIM2中断设置*/
TIM_ClearFlag(TIM2,TIM_FLAG_Update);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);


NVIC_SetPriorityGrouping(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/*********************/

// TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable);//使能TIM2的主从模式
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_External1); //TIM2为上升沿为触发时钟
TIM_SelectInputTrigger(TIM2,TIM_TS_ITR2); //内部触发,从TIM3触发


TIM_ARRPreloadConfig(TIM2, ENABLE);
TIM_CtrlPWMOutputs(TIM2, ENABLE);
TIM_Cmd(TIM2,ENABLE);//先不使能能TIM2


//TIM3工作在主模式,内部输出脉冲触发TIM2计数
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; //没有时钟分割
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInitStruct.TIM_Prescaler = 719; //预分频值,1MHz
TIM_TimeBaseInitStruct.TIM_Period = TIM3per; //重装值
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);

TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OCInitStruct.TIM_Pulse = TIM3Compare1;
TIM_OC1Init(TIM3,&TIM_OCInitStruct);

TIM_SelectMasterSlaveMode(TIM3,TIM_MasterSlaveMode_Enable); //使能TIM3的主从模式
TIM_SelectOutputTrigger(TIM3,TIM_TRGOSource_OC1Ref); //输出内部触发

// TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Disable);
TIM_ARRPreloadConfig(TIM3, ENABLE);
/*使能定时器TIM3主输出*/
TIM_CtrlPWMOutputs(TIM3, ENABLE);

TIM_Cmd(TIM2,ENABLE); //使能TIM2
TIM_Cmd(TIM3,ENABLE); //使能TIM3
}

void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET) //检查溢出信号
{
TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除溢出标志
TIM_Cmd(TIM3,DISABLE);
}
}

...全文
1226 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
worldy 2018-09-25
  • 打赏
  • 举报
回复
T1M2的下降沿中断函数处理中,打开T1M3;在T1M2上升沿中断函数关闭T1M3,
vari_von 2018-09-24
  • 打赏
  • 举报
回复
是的,非常给力,谢谢
Aluminum1045 2018-09-23
  • 打赏
  • 举报
回复
第57行,TIM2的预分频值应该为0。
代码中设置成了719,也就是说当TIM3输出720个脉冲之后TIM2才会计数一次。
修改后的波形如图,绿色是PA0(抱歉示波器通道2交流/直流耦合切换坏掉了- -),黄色是PA6,TIM2重载值是12,也就是会输出13个脉冲,应该是你想要的结果了吧。

风速监测报警作者:苏庆洪 概述风速监测报警系统基于 MCU芯片开发,支持采集多路从机分节点的风速数据,通过无线主从传输,主机收集数据,通过显示屏实时监视,在风速超过报警值时,通过GPIO输出接点信号,启动预警,降低自然风灾害对生命财产损失的风险。点对点无线传输距离可达 2000m ~ 3000m,具有传输距离远的特点,通过组网可以覆盖大面积预警区域,该系统适用于野外对风速敏感的设备,房屋进行监测,特别是各风景名胜区,地处名山大川,其载客索道缆车,当线路上风速过大时,可以和主控系统联动,进行减速和停机控制。 开发环境硬件:stm32f103-atk-mini RT-Thread版本:RT-Thread V 4.0.3 开发工具及版本:MDK 5.25 RT-Thread使用情况概述内核部分:调度器,信号量,消息队列。 调度器:创建多个线程来实现不同的工作。 信号量:用来同步线程。 设备框架:通过 RT-Thread提供的 I/O 设备管理接口来访问串口硬件。 硬件框架从机MCU 定时读取 风速传感器数据,然后通过 ATK-LORA 传输到主机,主机对数据进行比例运算处理,LCD显示和GPIO输出 软件框架说明MCU 上电之后首先完成板级外设的初始化,图形界面littleVGL初始化,定时请求数据,串口中断释放信号量,线程实时处理数据,并显示、控制。 软件模块说明主机创建了3个线程,1个信号量。 main:完成初始化,创建信号量,打开串口设备,设置中断响应函数,创建线程,定时请求从机数据。 lcd_thread_entry:开启littlevgl的事务处理lv_task_handler()。 usart_thread_entry:take信号量的方式,获取到信号量之后,开始数据接收,正确收到数据后,显示,并输出IO信号。 演示效果模拟仪表显示,绿色指针为当前风速值,红色指针为故障上限,黄色指针为报警上限 拖动滑块左右移动可以设定报警值 切换软件开关,对太阳能电池进行充电 B站地址 比赛感悟时代的发展,MCU的性能也越来越强,万物互联的需求也愈加强烈,使用RTOS来实现物与网的链接,是时代发展的潮流,当我接触到RT-Thread 这个国人自主RTOS后,经过对比其他的freertos,ucos等,RT-Thread代码很优雅,组件功能多,小而美,我开始了深入的学习。 通过 RT-Thread官网上的文档中心,我学习了多线程及其调度、信号量、邮箱、消息队列、内存管理、定时器等,但是感觉认识很肤浅,对于信号量是怎么实现的?rtos是怎么达到实时性?还是一头雾水。 于是又学习了火哥出版的《RT-Thread 内核实现与应用开发实战—基于STM32》,手把手,一步一步实现了RT-Thread,终于有了深刻认识,可以实际操作了。 通过这次比赛的项目实践,我对RT-Thread有了全新的认识,他不仅仅是一个嵌入式RTOS,当各种组件有序结合起来,必能够发挥出更大能量,体现无与伦比的扩展性和灵活性,无愧小而美物联网操作系统的称呼,现在RT-Thread smart已经上线了,无疑体现出来RT-Thread的蓬勃生命力和无限美好的发展前景,我相信选择RT-Thread绝对是正确的。 这个小作品,还有待完善,现在仅能通过触摸屏显示一些数据,并调整参数,还得增加一些功能,比如省电管理,远程开关机,还得解决开发硬件、软件的版权问题,在此仅作为演示,给下一步的开发提供一些思路,距离产品还有很长的路要走。 美中不足的地方,RT-Thread studio编译代码偏大,以至于我这个mini板flash和ram容量不够,下一步还得好好研究,怎样裁剪,用RT-Thread studio做产品的问题。 最后感谢主办方提供了这么好的一个平台,不仅能展示自我,也能学到很多知识,还要感谢论坛上那些解决我问题以及制作软件包的大佬,希望有朝一日我也能给开源社区贡献一份自己力量。

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧