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

急!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个回答
す疯Ⅱ恒す 回答时间: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管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
st-img 微信公众号
st-img 手机版