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

写了个STM32的程序,感觉没有进外部中断。

[复制链接]
any012 提问时间:2016-8-18 17:15 /
本来是PC6是外部来的一个脉冲信号,PC7想输出个相位相反的信号。
想着把PC6设为上升/下降沿中断,然后在中断里判断PC6的状态,以此决定PC7输出是高或低。
结果PC7引脚始终是低电平。已排除PC7引脚配置错误的可能,用定时器中断使PC7一秒反转一次,波形是正常的。

然后就改PC6为上升沿中断,中断里将PC7反转一次。结果PC7仍未低电平。
求坛友看看PC6的配置程序和中断程序,是否有问题?
PC6配置程序:
  1. void PC6_ExintConfig(void)
  2. {
  3.         EXTI_InitTypeDef EXTI_InitStructure;
  4.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource6);
  5.         EXTI_InitStructure.EXTI_Line = EXTI_Line6;
  6.         EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  7.         EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  8.         EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  9.         EXTI_Init(&EXTI_InitStructure);
  10. }
复制代码

NVIC配置:
  1. void NVIC_Configuration(void)
  2. {
  3.         NVIC_InitTypeDef NVIC_InitStructure;
  4.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  5.         
  6.         NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  7.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  8.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  9.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  10.         NVIC_Init(&NVIC_InitStructure);
  11.         
  12.         NVIC_InitStructure.NVIC_IRQChannel = SPI2_IRQn;
  13.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  14.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  15.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  16.         NVIC_Init(&NVIC_InitStructure);
  17.         
  18.         NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  19.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
  20.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  21.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  22.         NVIC_Init(&NVIC_InitStructure);
  23.         
  24.         NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  25.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
  26.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  27.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  28.         NVIC_Init(&NVIC_InitStructure);
  29.         
  30.         NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
  31.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
  32.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  33.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  34.         NVIC_Init(&NVIC_InitStructure);
  35.         
  36.         NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
  37.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
  38.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  39.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  40.         NVIC_Init(&NVIC_InitStructure);
  41. }
复制代码



中断程序:
  1. void EXTI9_5_IRQHandler(void)
  2. {
  3.         if(EXTI_GetITStatus(EXTI_Line6) != RESET)
  4.         {
  5. //                if(COMP_OK() != 0)
  6. //                        LVDS_EN(0);
  7. //                else
  8. //                {
  9. //                        SPI_I2S_SendData(SPI2, spi2SendBuff[0]);
  10. //                        LVDS_EN(1);
  11. //                }
  12. //                EXTI_ClearITPendingBit(EXTI_Line6);
  13.                 GPIOC->ODR ^= GPIO_Pin_7;
  14.         }
  15. }
复制代码



-----------------------------20160819-------------------------------------
补上GPIO配置:
  1. void GPIO_Config(void)
  2. {
  3.         GPIO_InitTypeDef GPIO_InitStructure;
  4.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);
  5.         
  6.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
  7.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  8.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        
  9.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  10.         
  11.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  12.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  13.         GPIO_Init(GPIOC, &GPIO_InitStructure);
  14.         
  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  17.         GPIO_Init(GPIOC, &GPIO_InitStructure);
  18.         
  19.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
  20.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  21.         GPIO_Init(GPIOD, &GPIO_InitStructure);
  22.         
  23.         AD7193_CS(ON);
  24.         ADT7310_CS(ON);
  25.         ADG738_CS(ON);
  26.         
  27.         PC6_ExintConfig();
  28. }
复制代码

----------------------20160819-----------------------------
还是没搞定,新建了个工程,只保留定时器和GPIO,测试定时器控制PA0反转,一秒闪一次,没问题。
然后用PC6外部中断控制PA0反转,其他电路给PC6每秒一个脉冲信号(用示波器捕捉到可,确定拉到PC6了),结果灯不亮...
附件为工程文件。
PB4测试.zip (321.83 KB, 下载次数: 10)
收藏 1 评论17 发布时间:2016-8-18 17:15

举报

17个回答
车厘子 最优答案 回答时间:2016-8-19 08:28:26
题主是否使能了AFIO时钟
any012 回答时间:2016-8-20 11:33:35
sunnydevil 发表于 2016-8-19 08:28
题主是否使能了AFIO时钟

拿出来单独测试PC6中断的程序没问题了,然后又回到原来写的程序。
发现还是不行,然后比较了下,在排至PC6时,没有开AFIO时钟。
我是先配置普通GPIO,包括PC6,然后再配置的SPI3,此时才打开AFIO。
估计是因为打开的晚了,没起作用。
之前也没注意过用外部中断需要打开AFIO时钟,我太疏忽了。
any012 回答时间:2016-8-19 16:31:21
安 发表于 2016-8-19 15:21
改成边沿,不管上升沿或者下降沿都会触发的,有没有ST送的开发板,掰下来就是一个仿真器。 ...

额,板子上没有引出调试接口,以后画板会考虑把SW接口引出来...
已上传工程文件,能否帮看下?
空白 回答时间:2016-8-19 09:01:04
感觉。。这东西还感觉,直接DEBUG不就知道了吗?
废鱼 回答时间:2016-8-19 09:09:19
楼主,IO有没有进行配置?
any012 回答时间:2016-8-19 10:40:04
sunnydevil 发表于 2016-8-19 08:28
题主是否使能了AFIO时钟

因为用到了SPI2,所以使能了AFIO时钟。
any012 回答时间:2016-8-19 10:40:21
jackeyt 发表于 2016-8-19 09:01
感觉。。这东西还感觉,直接DEBUG不就知道了吗?

没有仿真器...
any012 回答时间:2016-8-19 10:41:00
安 发表于 2016-8-19 09:09
楼主,IO有没有进行配置?

IO配置了,已补上IO配置函数。
废鱼 回答时间:2016-8-19 11:15:46
看代码没有什么问题,楼主最好是仿真一下。把触发方式改为边沿触发,看看能否进入中断。
any012 回答时间:2016-8-19 11:18:27
安 发表于 2016-8-19 11:15
看代码没有什么问题,楼主最好是仿真一下。把触发方式改为边沿触发,看看能否进入中断。 ...

奈何没有仿真器...
现在的触发方式就是上升沿触发吧?
废鱼 回答时间:2016-8-19 15:21:18
改成边沿,不管上升沿或者下降沿都会触发的,有没有ST送的开发板,掰下来就是一个仿真器。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2 赞一个!

查看全部评分

废鱼 回答时间:2016-8-19 17:10:52
测试没问题,楼主看一下硬件连接吧,是否有虚焊。
any012 回答时间:2016-8-19 17:22:42
安 发表于 2016-8-19 17:10
测试没问题,楼主看一下硬件连接吧,是否有虚焊。

感谢帮助测试.

示波器直接量PC6管脚,也有波形。
现在怀疑芯片坏了?
废鱼 回答时间:2016-8-20 08:42:51
我用的触发方式是EXTI_Trigger_Rising_Falling,你换这个试试。
any012 回答时间:2016-8-20 11:16:19
现在解决了,可以根据PC6的上升沿/下降沿,控制PC7产生相位相反的脉冲波。
最后是看到IO口配置时,没有配置输出速度这一项...我记得之前有的...
感谢各位回复。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2 很给力!

查看全部评分

12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版