OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4609|回复: 8

中断服务函数看不懂,求高手分析一下?

[复制链接]

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-6-9
在线时间
24 小时
发表于 2016-6-30 14:53:17 | 显示全部楼层 |阅读模式
1金钱
直接上图,程序如图所示,这个是相对应的数据uint8_t indexWave[] = {0,1,2,2,3,4,6,8,10,14,19,25,33,44,59,80,        107,143,191,255,255,191,143,107,80,59,44,33,25,19,14,10,8,6,4,3,2,2,1,0};该数组的成员一共有40个
中断.png

最佳答案

查看完整内容[请看2#楼]

额,第一行是判断定时器是否发生更新中断!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-6-30 14:53:18 | 显示全部楼层
列兵一号 发表于 2016-6-30 15:15
尤其是第一个if判断语句(TIM_GetITStates(TIM3,TIM_IT_Update)!=RESET),这个是什么意思啊?为什么不写成TIM ...

额,第一行是判断定时器是否发生更新中断!
开往春天的手扶拖拉机
回复

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-6-9
在线时间
24 小时
 楼主| 发表于 2016-6-30 15:15:16 | 显示全部楼层
尤其是第一个if判断语句(TIM_GetITStates(TIM3,TIM_IT_Update)!=RESET),这个是什么意思啊?为什么不写成TIM_GetITStates(EXTI_Linex),    x为配置的某一个中断通道
回复

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-6-9
在线时间
24 小时
 楼主| 发表于 2016-6-30 17:07:11 | 显示全部楼层
zuozhongkai 发表于 2016-6-30 16:26
额,第一行是判断定时器是否发生更新中断!

恩恩,这一句已经弄明白了,多谢了,在第二个if循环里面为什么要写三个
TIM3->CCR2 = indexWave[pwm_index];       
TIM3->CCR3 = indexWave[pwm_index];       
TIM3->CCR4 = indexWave[pwm_index];这样的表达式,指针不是指向内存的首地址吗?写一个不就可以了吗?这个地方也很蒙啊?注释里面说是根据PWM表修改定时器的比较寄存器值。
回复

使用道具 举报

13

主题

186

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
441
金钱
441
注册时间
2016-6-30
在线时间
97 小时
发表于 2016-6-30 17:13:19 | 显示全部楼层
TIM3->CCR2是指向 TIM3中CCR2影子寄存器  给寄存器赋值就修改了pwm啦
回复

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-6-9
在线时间
24 小时
 楼主| 发表于 2016-6-30 17:13:54 | 显示全部楼层
列兵一号 发表于 2016-6-30 17:07
恩恩,这一句已经弄明白了,多谢了,在第二个if循环里面为什么要写三个
TIM3->CCR2 = indexWave;       
TIM3 ...

而且我实测了一下,注释掉第一句和第三句,试验结果没有任何影响,如果注释掉第二句,其他的留下,或者注释掉其中一句,试验结果就出问题了
回复

使用道具 举报

3

主题

794

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
1502
金钱
1502
注册时间
2015-3-3
在线时间
460 小时
发表于 2016-6-30 17:24:39 | 显示全部楼层
列兵一号 发表于 2016-6-30 17:07
恩恩,这一句已经弄明白了,多谢了,在第二个if循环里面为什么要写三个
TIM3->CCR2 = indexWave;       
TIM3 ...

CCR2\CCR3\CCR4   这是三个通道的寄存器。肯定不能只写一个
回复

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-6-9
在线时间
24 小时
 楼主| 发表于 2016-7-2 21:48:03 | 显示全部楼层
hpeng1874 发表于 2016-6-30 17:24
CCR2\CCR3\CCR4   这是三个通道的寄存器。肯定不能只写一个

搞明白了,(实际上写这三个很容易把人搞蒙)当然也可以只写一个,(经过实测确定的)主要是要保证TIM3的使能通道和配置的GPIO口与中断函数中的CCRx一 一对应起来
回复

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-6-9
在线时间
24 小时
 楼主| 发表于 2016-7-4 22:01:43 | 显示全部楼层
zuozhongkai 发表于 2016-6-30 14:53
额,第一行是判断定时器是否发生更新中断!

还有一个问题要请教一下你,当period_cnt的值从0到9的过程,一直运行了10个周期,而在这10次运行中,每次都会运行一次TIM_ClearPendingBit(TIM3,TIM_IT_Update);这个函数,注释写的是清除中断标志位,这个不是很理解?可以理解为跳出中断的标志位吗?然后经过一个信号周期后又回来执行中断(可能理解完全错了),当period_cnt的值为10的时候(最大只能为10,因为后面被period_cnt=0语句置0了),开始进入第二个if语句后,定时器开始访问CCR2中的第一个数据,也就是说CCR2的第一个数据要要持续10个信号周期…………
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-11 08:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表