555定时器器中自动重装载寄存器里面的自动重装载值到底是怎么回事

查看: 1439|回复: 15
在定时器中断里修改定时值问题
主题帖子精华
初级会员, 积分 166, 距离下一级还需 34 积分
在线时间36 小时
我修改定时器中断的例子程序,然后在中断程序中,先关掉定时器,再修改arr和psc值,然后重新启动定时器,但是输出的波形还是高低电平时间一样,求解。
[C] 纯文本查看 复制代码void TIM3_IRQHandler(void)
//TIM3中断
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
TIM_Cmd(TIM3, DISABLE);
TIM_ClearITPendingBit(TIM3, TIM_IT_Update
//清除TIMx的中断待处理位:TIM 中断源
if(flag)//用flag做标志,判断是否转换新的计时值
TIM3_Change();
TIM3_Change();
void TIM3_Change(u16 arr,u16 psc)
TIM_TimeBaseStructure.TIM_Period = //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler = //设置用来作为TIMx时钟频率除数的预分频值
10Khz的计数频率
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_Cmd(TIM3, ENABLE);
//使能TIMx外设
52bf1f63c6fb7eff372aa139c3d3f481_974.jpg (0 Bytes, 下载次数: 0)
22:54 上传
恩,比如设置定时器1us中断一次,i从0开始计数,=5时引脚复位(i清零),=3时引脚置位(i清零)
主题帖子精华
在线时间78 小时
恩,比如设置定时器1us中断一次,i从0开始计数,=5时引脚复位(i清零),=3时引脚置位(i清零)
博观而约取,厚积而薄发。
主题帖子精华
在线时间78 小时
TIM3同时开更新中断和PWM输出?&&&我觉得还是不要在定时中断中修改这个,改的时候设置一次就行
博观而约取,厚积而薄发。
主题帖子精华
初级会员, 积分 166, 距离下一级还需 34 积分
在线时间36 小时
回复【2楼】:
---------------------------------
我想用一个定时器输出很多相同的方波,而且高低电平时间不同,也算是占空比不是50%的PWM吧,但是是同样的很多路。在定时器中断里不断切换两个定时值,输出高低电平。
主题帖子精华
在线时间78 小时
回复【3楼】llqzx:
---------------------------------
如果只是占空比不同的话用TIM_SetComparex,一个定时器开4个通道就可以
如果要改频率的话就得设置ARR&和&nbspSC了
博观而约取,厚积而薄发。
主题帖子精华
初级会员, 积分 166, 距离下一级还需 34 积分
在线时间36 小时
回复【4楼】:
---------------------------------
我想输出26路相同的方波,用一个定时器。我在中断里修改的arr和&psc,但是还是输出%50的方波&,所以来这里找大神问一下
主题帖子精华
在线时间78 小时
用一个定时器输出26路?&频率相同还是完全同步?用硬件输出PWM的话还得用好点的32,不然资源不够用。&占空比设置用的是TIM_SetCompare这个函数
博观而约取,厚积而薄发。
主题帖子精华
初级会员, 积分 166, 距离下一级还需 34 积分
在线时间36 小时
回复【6楼】:
---------------------------------
我想用一个定时器做,先设定高电平的溢出时间,溢出中断后反转26个IO口的电平,然后设置低电平的溢出时间,溢出中断后再反转,设置高电平溢出,一直循环,实现26路完全相同的方波输出
主题帖子精华
在线时间78 小时
回复【7楼】llqzx:
---------------------------------
如果你要这样的话,还不如开个定时器中断,在里面i++,通过判断i的大小决定26个引脚的高低电平。这样计算速度应该比你那么设置要快
博观而约取,厚积而薄发。
主题帖子精华
初级会员, 积分 166, 距离下一级还需 34 积分
在线时间36 小时
回复【8楼】:
---------------------------------
要求是高低电平的时间不一样,而且可以用变量修改,这样就需要在两个定时值之间切换,比如高电平5us,低电平3us。我先定时5us溢出,反转IO电平为0,设置3us溢出,溢出后设置IO电平为1,再设置5us定时。这样循环。
主题帖子精华
金钱104335
在线时间645 小时
楼主这个很简单,输出1路Pwm,然后,26根线都接在这个IO上面就是了.
如果驱动能力不够,加缓冲即可&.
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
初级会员, 积分 166, 距离下一级还需 34 积分
在线时间36 小时
原子哥&我这26路是依次进行的,先输出第一路&再输出第二路&依次输出,而且同时只有一路输出。所以我就是想在定时中断中修改定时的时间,这样就可以判断变量然后转换IO。&&&&&&&&&&&&&&&要求是高低电平的时间不一样,而且可以用变量修改,这样就需要在两个定时值之间切换,比如高电平5us,低电平3us。我先定时5us溢出,反转IO电平为0,设置3us溢出,溢出后设置IO电平为1,再设置5us定时。这样循环。&这个方案难道不行?
主题帖子精华
初级会员, 积分 166, 距离下一级还需 34 积分
在线时间36 小时
回复【10楼】:
---------------------------------
嗯&有道理,这也是个方法,那个方案难道不可以?不能在中断中修改定时时间?
主题帖子精华
在线时间78 小时
回复【13楼】llqzx:
---------------------------------
不知道,没试过。但可以肯定的是这个肯定更快,因为不操作寄存器,只是一个变量计算
博观而约取,厚积而薄发。
主题帖子精华
初级会员, 积分 166, 距离下一级还需 34 积分
在线时间36 小时
回复【14楼】:
---------------------------------
嗯&我试试先&谢谢大神耐心解答
主题帖子精华
初级会员, 积分 166, 距离下一级还需 34 积分
在线时间36 小时
回复【14楼】:
---------------------------------
我试了,这个方案是可以的,谢谢啦&:)
Powered by查看: 2411|回复: 2
TIM_TimeBaseStructure.TIM_Period = //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.T
主题帖子精华
初级会员, 积分 132, 距离下一级还需 68 积分
在线时间0 小时
TIM_TimeBaseStructure.TIM_Period = //设置在下一个更新事件装入活动的自动重装载寄存器周期的值&
TIM_TimeBaseStructure.TIM_Prescaler = //设置用来作为TIMx时钟频率除数的预分频值 &不分频
这两句话的意思
第一个就是装到寄存器里计数的一个值,你装多少他就数到几
第二个是对时钟进行分频,就是这个频率时钟你不需要这么快,给他除一下&
其实不用太管那2个,记住公式直接套用就行
主题帖子精华
高级会员, 积分 725, 距离下一级还需 275 积分
在线时间4 小时
第一个就是装到寄存器里计数的一个值,你装多少他就数到几
第二个是对时钟进行分频,就是这个频率时钟你不需要这么快,给他除一下&
其实不用太管那2个,记住公式直接套用就行
主题帖子精华
初级会员, 积分 132, 距离下一级还需 68 积分
在线时间0 小时
回复【2楼】傻子:
---------------------------------
好的
谢谢了
Powered by21ic官方微信-->
后使用快捷导航没有帐号?
查看: 3115|回复: 13
求助!STM32定时器中的周期计数寄存器的用法
&&已结帖(20)
主题帖子积分
中级技术员, 积分 225, 距离下一级还需 75 积分
中级技术员, 积分 225, 距离下一级还需 75 积分
主题帖子积分
专家等级:结帖率:87%
主题帖子积分
中级技术员, 积分 225, 距离下一级还需 75 积分
中级技术员, 积分 225, 距离下一级还需 75 积分
我想让定时器在PWM的n个周期后才中断一次,该怎么设置?
所以我想到用周期计数器寄存器来实现,不知道可不可以?
满意回复+20
用法很简单,只要初始化时,配置分量TIM_TimeBaseStructure.TIM_RepetitionCounter即可。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
中级技术员, 积分 225, 距离下一级还需 75 积分
中级技术员, 积分 225, 距离下一级还需 75 积分
主题帖子积分
专家等级:结帖率:87%
主题帖子积分
中级技术员, 积分 225, 距离下一级还需 75 积分
中级技术员, 积分 225, 距离下一级还需 75 积分
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
主题帖子积分
专家等级:结帖率:30%打赏:0.00受赏:11.00
主题帖子积分
用法很简单,只要初始化时,配置分量TIM_TimeBaseStructure.TIM_RepetitionCounter即可。
I do not teach, but I coach. I do not feed, but I seed.
欢迎访问我的博客:/BLOG_OWNER_199055.HTM
主题帖子积分
中级技术员, 积分 225, 距离下一级还需 75 积分
中级技术员, 积分 225, 距离下一级还需 75 积分
主题帖子积分
专家等级:结帖率:87%
主题帖子积分
中级技术员, 积分 225, 距离下一级还需 75 积分
中级技术员, 积分 225, 距离下一级还需 75 积分
我也是这样,但还是每次定时器上溢就中断,
设置时有什么要注意的地方吗?
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
主题帖子积分
专家等级:结帖率:30%打赏:0.00受赏:11.00
主题帖子积分
我没有具体做过,提不出具体意见。
你可以参考固件库中,定时器部分的那个DMA例子里就是使用了Repetition计数器。
I do not teach, but I coach. I do not feed, but I seed.
欢迎访问我的博客:/BLOG_OWNER_199055.HTM
主题帖子积分
资深工程师, 积分 10265, 距离下一级还需 9735 积分
资深工程师, 积分 10265, 距离下一级还需 9735 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
资深工程师, 积分 10265, 距离下一级还需 9735 积分
资深工程师, 积分 10265, 距离下一级还需 9735 积分
肯定可以,参考一下固件库中的例子
主题帖子积分
中级技术员, 积分 225, 距离下一级还需 75 积分
中级技术员, 积分 225, 距离下一级还需 75 积分
主题帖子积分
专家等级:结帖率:87%
主题帖子积分
中级技术员, 积分 225, 距离下一级还需 75 积分
中级技术员, 积分 225, 距离下一级还需 75 积分
嗯,我好好看看
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
中级技术员, 积分 225, 距离下一级还需 75 积分
中级技术员, 积分 225, 距离下一级还需 75 积分
主题帖子积分
专家等级:结帖率:87%
主题帖子积分
中级技术员, 积分 225, 距离下一级还需 75 积分
中级技术员, 积分 225, 距离下一级还需 75 积分
嗯,可以中断了,和香主说的一样,但是还有个问题,
我把周期计数器设为5,按理应该是6个周期中断一次,但实际是12个周期中断一次;反正是我设置的两倍的周期中断一次,不知道是怎么回事?
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
主题帖子积分
专家等级:结帖率:30%打赏:0.00受赏:11.00
主题帖子积分
嗯,可以中断了,和香主说的一样,但是还有个问题,
我把周期计数器设为5,按理应该是6个周期中断一次,但实际是12个周期中断一次;反正是我设置的两倍的周期中断一次,不知道是怎么回事? ...
YUCHUN0607 发表于
你怎么知道是12个周期中断一次?
I do not teach, but I coach. I do not feed, but I seed.
欢迎访问我的博客:/BLOG_OWNER_199055.HTM
主题帖子积分
中级技术员, 积分 225, 距离下一级还需 75 积分
中级技术员, 积分 225, 距离下一级还需 75 积分
主题帖子积分
专家等级:结帖率:87%
主题帖子积分
中级技术员, 积分 225, 距离下一级还需 75 积分
中级技术员, 积分 225, 距离下一级还需 75 积分
我用LED指示的啊,
刚才说的这个情况是初始化后第一次中断是两倍,以后的都正常了,非常奇怪
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
中级技术员, 积分 225, 距离下一级还需 75 积分
中级技术员, 积分 225, 距离下一级还需 75 积分
主题帖子积分
专家等级:结帖率:87%
主题帖子积分
中级技术员, 积分 225, 距离下一级还需 75 积分
中级技术员, 积分 225, 距离下一级还需 75 积分
我的代码:
void TIM1_init(u16 period, u8 rcnt)//PWM输出
& & & & GPIO_InitTypeDef GPIO_InitS
& & & & TIM_TimeBaseInitTypeDef TIM_TimeBaseInitS
& & & & TIM_OCInitTypeDef TIM_OCInitS
& & & & GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
& & & & GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
& & & & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
& & & & GPIO_Init(GPIOB, &GPIO_InitStructure);
& & & & TIM_TimeBaseInitStructure.TIM_Prescaler = 8000;
& & & & TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
& & & & TIM_TimeBaseInitStructure.TIM_Period = period - 1;//150KHz
& & & & TIM_TimeBaseInitStructure.TIM_ClockDivision = 0x00;
& & & & TIM_TimeBaseInitStructure.TIM_RepetitionCounter = rcnt - 1;
& & & & TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStructure);
& & & & TIM_ARRPreloadConfig(TIM1, ENABLE);
& & & & TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
& & & & TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_D
& & & & TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_E
& & & & TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_H
& & & & TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_R
& & & & TIM_OCInitStructure.TIM_Pulse = period && 1;
& & & & TIM_OC1Init(TIM1, &TIM_OCInitStructure);
& & & & TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
//& & & & TIM_GenerateEvent(TIM1, TIM_EventSource_Update);
& & & & TIM_UpdateRequestConfig(TIM1, TIM_UpdateSource_Regular);
& & & & TIM_ClearFlag(TIM1, TIM_IT_Update);
& & & & TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
& & & & TIM_Cmd(TIM1, ENABLE);& & & &
& & & & TIM_CtrlPWMOutputs(TIM1, ENABLE);
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
中级技术员, 积分 225, 距离下一级还需 75 积分
中级技术员, 积分 225, 距离下一级还需 75 积分
主题帖子积分
专家等级:结帖率:87%
主题帖子积分
中级技术员, 积分 225, 距离下一级还需 75 积分
中级技术员, 积分 225, 距离下一级还需 75 积分
找到原因了,把这句屏蔽掉就对了TIM_ClearFlag(TIM1, TIM_IT_Update);
可是为什么呢?香主解释下
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
主题帖子积分
专家等级:结帖率:30%打赏:0.00受赏:11.00
主题帖子积分
找到原因了,把这句屏蔽掉就对了TIM_ClearFlag(TIM1, TIM_IT_Update);
可是为什么呢?香主解释下
YUCHUN0607 发表于
我不知道为什么。
你可以在中断中看看是什么引起的中断,然后再顺藤摸瓜。
I do not teach, but I coach. I do not feed, but I seed.
欢迎访问我的博客:/BLOG_OWNER_199055.HTM
主题帖子积分
初级技术员, 积分 90, 距离下一级还需 10 积分
初级技术员, 积分 90, 距离下一级还需 10 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
初级技术员, 积分 90, 距离下一级还需 10 积分
初级技术员, 积分 90, 距离下一级还需 10 积分
求助一个问题,我想知道有观测自动重装载寄存器周期的值的变化的寄存器吗?也就是想知道某一时刻我想知道设置的向下计数的递减的值是多少?能帮忙解答一下吗?还有就是我在固件库手册中没找到这个函数TIM_TimeBaseStructure.TIM_RepetitionCounter
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
荣誉元老奖章
等级类勋章
坚毅之洋流
发帖类勋章
时间类勋章
技术领袖奖章
人才类勋章

我要回帖

更多关于 自动重装载寄存器周期 的文章

 

随机推荐