OpenEdv-开源电子网

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

中断嵌套的问题

[复制链接]

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-6-9
在线时间
24 小时
发表于 2016-7-3 16:16:56 | 显示全部楼层 |阅读模式
3金钱
在板子上的某一个固定端口(假设端口为GPIOA6)已经可以输出可变的PWM了(电压值大概在0.5-3.2V之间变化),当然这个也是通过中断不断的读取之前写入的数据而得到的可变占空比的(配置的定时器为TIM3),现在我想在这个的基础上在加入另外一个中断,目的是想让另外一个端口(假设是GPIOA7)的电平呈现高低电平的变化(具体就是当GPIOA6端口的电压高于a时,要让GPIOA7呈现高电平,GPIOA6的电平低于b时,要让GPIOA7呈现低电平),那么我的问题是:1.我需要重新为我的第二个中断配置额外的定时器TIMx(x不为3)吗?(第一个中断是通过定时实现的,第二个中断是嵌入在前一个中断中的,与定时器没有多大关系,不是很确定)                                     2.我第二个中断的中断服务函数是直接嵌套在第一个中断服务函数里面吗?
                                     3.当GPIOA6端口的电压值处于b,a之间时,此时A7端口的电平会是什么状态?(我的理解:当A6的电压值低于b时,此时中断二执行,将A7端口reset,然后调出中断2,接着中断1继续执行程序,A6端的电压值继续变大,(电压是离散渐增的过程,到最大后,在离散渐减,如此循环),当电压值达到a时,在此前的过程中(电压值高于b而低于a 的过程),端口A7一直处于低电平状态,而电压值高于a时,此事中断2开始介入,将A7端口set,如此往复的执行这个过程)
            也许问题没有描述清楚,也许理解也有一些问题,但目前就想到这些,各位高手各抒己见吧………………

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-6-9
在线时间
24 小时
 楼主| 发表于 2016-7-3 16:48:28 | 显示全部楼层
本帖最后由 列兵一号 于 2016-7-3 16:49 编辑

添加的中断2为红色标记处,如下图所示,实测的效果是这一段没有起到任何作用
111.jpg
回复

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-6-9
在线时间
24 小时
 楼主| 发表于 2016-7-3 19:32:45 | 显示全部楼层
不要沉了啊,高手给看看……
回复

使用道具 举报

2

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2016-6-2
在线时间
43 小时
发表于 2016-7-4 08:57:17 | 显示全部楼层
STM 32的中断嵌套是通过优先级来做的,不是像你这样写的
-----抵制A莫这个烂货!-----
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-7-4 09:53:18 | 显示全部楼层
本帖最后由 憨厚诚实大叔 于 2016-7-4 09:55 编辑

读取输出电平的BIT只有1.0这2种情况,对应高低电平。
别想着芯片太牛逼,可以直接读取他的电压
回复

使用道具 举报

7

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-2-2
在线时间
5 小时
发表于 2016-7-4 10:34:55 | 显示全部楼层
纠正几个错误:
1.中断嵌套是通过配置NVIC的中断优先级次序来实现的,把一个中断函数写进另一个中断里面CPU是不能响应的;
2.GPIO_ReadOutpuDatatBit()函数只能读取IO脚的电平状态‘0’和‘1’(默认高于2v为高电平‘1’,低于0.8v为低电平‘0’),不能直接读取电压;
针对你上述的问题,我提个建议:
1.你的PWM是在0.5v-3.2v变化?恕我没见过,PWM可看做是占空比可变的方波,只有两种电平状态0和1,具体测出它的电压值是没有意义的;
2.你要用另外一个端口(假设是GPIOA7)的电平呈现高低电平的变化,当GPIOA6端口的电压高于a时,要让GPIOA7呈现高电平,GPIOA6的电平低于b时,要让GPIOA7呈现低电平,推荐用ADC去做,设置中断,每采集一次GPIOA6的电压进入一次中断,中断里面进行判断,当电压高于a则GPIOA7输出高电平,当电压低于b则GPIOA7输出低电平;
3.楼主应该多去补补基础知识顺便多看看stm32的中文手册和原子哥的不弯曲手册哈哈。
回复

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-6-9
在线时间
24 小时
 楼主| 发表于 2016-7-4 16:50:32 | 显示全部楼层
憨厚诚实大叔 发表于 2016-7-4 09:53
读取输出电平的BIT只有1.0这2种情况,对应高低电平。
别想着芯片太牛逼,可以直接读取他的电压

请问我有什么办法获取GPIOB5的电压值,然后将其作为中断2的判断条件??固件库里面有没有这样的函数?
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-7-4 17:06:02 | 显示全部楼层
列兵一号 发表于 2016-7-4 16:50
请问我有什么办法获取GPIOB5的电压值,然后将其作为中断2的判断条件??固件库里面有没有这样的函数?

你应该问有没有这个功能,而不是这个函数。。。。。。。
如果你非要这样的话,就得把这个引脚的PWM输出经过处理接到某个ADC的口上,通过这个ADC读到的值来弄了,ADC弄个看门狗中断了
回复

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-6-9
在线时间
24 小时
 楼主| 发表于 2016-7-4 17:10:31 | 显示全部楼层
风中的狙击手 发表于 2016-7-4 10:34
纠正几个错误:
1.中断嵌套是通过配置NVIC的中断优先级次序来实现的,把一个中断函数写进另一个中断里面CP ...

感谢你的建议和指正,目前确实还是小白状态……
还有几个小疑问:1. 你提到的纠错2和建议1是不是说无法用函数获取某个端口的具体的模拟量(电压值),只能通过函数获取数字量(0或者1)?
2.如果正如上个问题那样的话,你提到的第二个建议中,采集A6的电压,也就只能获取0或者1了;


回复

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3566
金钱
3566
注册时间
2016-1-8
在线时间
544 小时
发表于 2016-7-4 17:16:24 | 显示全部楼层
看了你的半天,才知道你要表达什么意思。你这个不需要中断嵌套,直接在第一中断加个标志位,置1,在另一个中断里面判断是否这个标志位是1,如果是,那么你就拉高或低
回复

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3566
金钱
3566
注册时间
2016-1-8
在线时间
544 小时
发表于 2016-7-4 17:17:05 | 显示全部楼层
我看是好多人不明白楼主的意思。这个非常简单的逻辑问题。
回复

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-6-9
在线时间
24 小时
 楼主| 发表于 2016-7-4 19:36:59 | 显示全部楼层
本帖最后由 列兵一号 于 2016-7-4 19:38 编辑
Sun_Fly 发表于 2016-7-4 17:16
看了你的半天,才知道你要表达什么意思。你这个不需要中断嵌套,直接在第一中断加个标志位,置1,在另一个 ...

没明白你表达的意思啊?在另一个中断里面判断是否这个标志位是1?这个不是嵌套的一个中断吗?  
回复

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3566
金钱
3566
注册时间
2016-1-8
在线时间
544 小时
发表于 2016-7-4 19:47:36 | 显示全部楼层
你的意思不就是要这个是高电平,另一个也要是高电平吗?
exit_1(){

    set_pa7 = 1;//pa7是高
    flag = 1;
}
exit_2( ){
   if(flag = 1){
      set_pa6 = 1;//pa6高电平
      flat = 0;
   }
}
这是两个中断,看懂了吧?
回复

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3566
金钱
3566
注册时间
2016-1-8
在线时间
544 小时
发表于 2016-7-4 19:47:52 | 显示全部楼层
简写的
回复

使用道具 举报

7

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-2-2
在线时间
5 小时
发表于 2016-7-4 22:04:28 | 显示全部楼层
列兵一号 发表于 2016-7-4 17:10
感谢你的建议和指正,目前确实还是小白状态……
还有几个小疑问:1. 你提到的纠错2和建议1是不 ...

我指的是GPIO_ReadOutpuDatatBit()函数没办法获取电压,但是ADC模块是可以获取电压的,具体去查stm32的中文手册
回复

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-6-9
在线时间
24 小时
 楼主| 发表于 2016-7-5 12:35:53 | 显示全部楼层
本帖最后由 列兵一号 于 2016-7-5 19:48 编辑
Sun_Fly 发表于 2016-7-4 19:47
你的意思不就是要这个是高电平,另一个也要是高电平吗?
exit_1(){

恩恩,多谢了,似乎明白了一些,用你的这个方法先试试,看可不可以?今天试了一下, 你说的方法,具体的程序如下:(还有部分程序是配置中断2的没有贴出了,要控制的引脚为GPIOA2)
红色的是照你说的添加的程序
void TIM3_IRQHandler(void)
uint8_t ReadValue2;                        //用作中断2的标志位
{       
        static uint8_t pwm_index = 0;                        //用于PWM查表
        static uint8_t period_cnt = 0;                //用于计算周期数
        static uint8_t ReadValue1;         //用于监测GPIO5的状态
                
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)        //TIM_IT_Update
        //if (TIM_GetITStatus(EXTI_Line1) != RESET)
        {                       
                        period_cnt++;
                        if(period_cnt >= 10)        //若输出的周期数大于10,输出下一种脉冲宽的PWM波
                        {
                                 TIM3->CCR2 = indexWave[pwm_index];        //根据PWM表修改定时器的比较寄存器的值       
                                pwm_index++;                //标志PWM表的下一个元素
                       
                                if( pwm_index >=  40)        //若PWM脉冲表已经输出完成一遍,重置PWM查表标志
                                 {
                                        pwm_index=0;                                                               
                                 }
                                period_cnt=0;                //重置周期计数标志
                    /*******添加的程序**************/
                        if(ReadValue1==GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5))
                         {
                      ReadValue2==SET;//中断2的标志位,感觉这个写法应该有问题,但不知道怎么改
                         }
                        /*********添加的程序************/
                        }
                TIM_ClearITPendingBit (TIM3, TIM_IT_Update);        //清除中断标志位
        }
}
/********************添加的程序*************************/
void EXTI2_IRQHandler(void)
{
if(ReadValue2!=RESET)        
{
GPIO_SetBits(GPIOA,GPIO_Pin_2);      //PA2高电平
}
}
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/

以上,然而GPIOA2并没有出现高低电平的跳变,我想肯定是程序写得有问题,你给看看,感激不尽啊……

中断2的相关配置

中断2的相关配置
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-7-6 22:08:51 | 显示全部楼层
楼主去看一下我们教程先吧
回复

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-6-9
在线时间
24 小时
 楼主| 发表于 2016-7-18 12:37:22 | 显示全部楼层

改了之后程序后来又写成这样的了,在这个链接中
http://www.openedv.com/thread-79112-1-1.html   出现的新问题是   1.嵌套的程序只在烧进程序的那一刻执行过一次,然后端口A2的电平状态再也没有变化了    2.若手动复位的话,端口A2的电平就会发生跳变,但问题是我设置的是软件触发的方式,为什么要手动去操纵??百思不得其解
回复

使用道具 举报

6

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-6-9
在线时间
24 小时
 楼主| 发表于 2016-7-18 12:38:23 | 显示全部楼层
正点原子 发表于 2016-7-6 22:08
楼主去看一下我们教程先吧

前几天一直在忙考试的事,终于考完了,开始重新学习了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-12 15:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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