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

急!STM32F103RB高级定时器脉冲个数控制问题

[复制链接]
genny-96991 提问时间:2017-11-26 23:25 /
正在用STM32F103RB帮别人做个信号 发生器的毕业设计,用定时器1输出脉冲个数可控制的功能,但在用定时器的过程中,发现两个问题1)写1到UG时,输出CH1管脚电平会发生变化,测试了一天,实在百思不得其解,原来用通用定时器(2、3、4)都没问题;

2)写1到UG时,预载寄存器好像没有起作用,导致丢掉了第一个脉冲;如下代码应该是输出4个脉冲,实际只输出3个;
请各位大侠指点,附原码如下,管脚用作定时器输出已设置。

                             TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;              //选择定时器模式
                             TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   //比较输出使能
                             TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Disable;
                             TIM_OCInitStructure.TIM_Pulse = 9000;                                        //设置待装入捕获比较寄存器的脉冲值
                             TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;        //输出极性
                             TIM_OC1Init(TIM1, &TIM_OCInitStructure);                                   //初始化外设TIMx
                             TIM1->BDTR=0x8800;


                        TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);
                        TIM_ARRPreloadConfig(TIM1, ENABLE);                                //使能TIMx在ARR上的预装载寄存器

                        TIM1->CR2=0;
                        TIM1->RCR=0;


                        //第1个脉冲参数
                        TIM1->PSC = (u16)PlusMode0Psc[0];                                //预分步器
                        TIM_SetAutoreload(TIM1, (u16)PlusMode0Period[0]);         //周期
                        TIM_SetCompare1(TIM1,(u16)PlusMode0Width[0]);            //这里时间间隔做占空比

                        TIM_GenerateEvent(TIM1,TIM_EventSource_Update);       //初始化预装载

                        //第2个脉冲参数
                        TIM1->PSC = (u16)PlusMode0Psc[1];                                //预分步器
                        TIM_SetAutoreload(TIM1, (u16)PlusMode0Period[1]);         //周期
                        TIM_SetCompare1(TIM1,(u16)PlusMode0Width[1]);            //这里时间间隔做占空比


        TIM1->CR1 |= TIM_CR1_CEN;

        //第3个脉冲参数
        while(!(TIM_FLAG_Update&TIM1->SR))
        {; }
        TIM1->ARR  = PlusMode0Period[2];
        TIM1->CCR1 = PlusMode0Width[2];
        TIM1->SR   = 0;
        //TIM1->PSC  = PlusMode0Psc[2];

        //第4个脉冲参数
        while(!(TIM_FLAG_Update&TIM1->SR))
        {; }
        TIM1->ARR  = PlusMode0Period[3];
        TIM1->CCR1 = PlusMode0Width[3];
        TIM1->SR   = 0;
        TIM1->PSC  = PlusMode0Psc[3];

        //第3个脉冲完成
        while(!(TIM_FLAG_Update&TIM1->SR))
        {; }
        TIM1->SR   = 0;

        //第4个脉冲完成,翻转后禁止输出
        while(!(TIM_FLAG_CC1&TIM1->SR))
        {; }
        TIM1->CR1  =0x0080;
        TIM1->SR   = 0;

收藏 1 评论6 发布时间:2017-11-26 23:25

举报

6个回答
疯de_恒 回答时间:2018-3-14 09:18:35
应该是使能定时器慢了吧,你看这句:TIM1->CR1 |= TIM_CR1_CEN;
这句都已经放到第二个脉冲之后才打开,那第一个肯定就没了。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

feixiang20 回答时间:2018-3-14 09:49:32
TIM1->CR1 |= TIM_CR1_CEN;的位置在一二之后,非一后,初始化代码还是提前放吧,另外是否缺少一二完成代码。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

wenyangzeng 回答时间:2018-3-14 09:57:56
本帖最后由 wenyangzeng 于 2018-3-14 09:59 编辑

楼主在TIM配置中不断改变定时器参数,执行时貌似只有最后一个参数起作用。建议使用定时器溢出中断,每次中断根据计数值改变IO输出即可。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

冷眼1121 回答时间:2018-3-14 21:44:11
可能是执行语句的延时导致没有输出来啊

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

genny-96991 回答时间:2018-5-25 14:50:25
す疯Ⅱ恒す 发表于 2018-3-14 09:18
应该是使能定时器慢了吧,你看这句:TIM1->CR1 |= TIM_CR1_CEN;
这句都已经放到第二个脉冲之后才打开,那第 ...

按道理,我使用了预装载功能,应该可以放两个脉冲的数据,第一个计数完成后自动加装第二个脉冲数据到计数器,不知道这样理解对不对
genny-96991 回答时间:2018-5-25 14:51:58
feixiang20 发表于 2018-3-14 09:49
TIM1->CR1 |= TIM_CR1_CEN;的位置在一二之后,非一后,初始化代码还是提前放吧,另外是否缺少一二完成代码 ...

因为涉及到脉冲频率的问题,所以这里使用了预装载功能,应该可以一次放两个脉冲参数的吧

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版