找回密码
 立即注册
查看: 166|回复: 29

大神们求救,十万火急帮帮小弟,IO中断的问题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-05-01 09:48:02
已绑定手机

4

主题

20

回帖

90

积分

注册会员

积分
90
发表于 5 天前 | 显示全部楼层 |阅读模式
现在有个项目,要求通过占空比控制不同功能,分别是100HZ的频率,有20%和40%以及60%占空比,


我现在打算将这个信号给到两个IO分别检测上升沿和下降沿,在上升沿中断打开定时器,在下降沿中断关闭定时器,读取数值来确认占空比的时间从而执行相关操作,然而板子打回来,IO中断就把我卡死了,现在项目很紧急,求大神们帮忙指点哪里有问题

芯片是AI8H2K32U
这是我的原理图,PWM信号给到一个三极管从而拉低IO口,IO初始化准双向,例程我看也是
截图202504262255156657.jpg


主程序我还没写,目前就卡在中断了,中断不行什么都完犊子

截图202504262256058489.jpg
IO口初始化,P36和P37初始化了准双向
截图202504262259097706.jpg
接着配置中断
截图202504262301285526.jpg
然后写中断程序
截图202504262302033386.jpg
然后就没有然后了,我中断程序里面写了点亮一些LED,事实就是怎么手动上电,LED都不亮,求指点,到底啥情况,愁死了!!!



回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 5 天前 | 显示全部楼层
问题分析与解决方案

1. 问题描述
您在使用AI8H2K32U芯片进行PWM信号检测时,遇到了IO中断无法正常工作的问题。具体表现为:通过PWM信号控制两个IO口(P36和P37)分别检测上升沿和下降沿,在上升沿中断中打开定时器,在下降沿中断中关闭定时器,以读取占空比时间并执行相关操作。然而,实际测试中,中断程序未能正常触发,导致LED无法点亮。

2. 可能的原因分析
根据您提供的信息,以下是可能导致中断无法正常工作的几个原因:

1. IO口配置问题:虽然您已经将P36和P37配置为准双向模式,但可能存在配置不完整或错误的情况。
2. 中断配置问题:中断的使能、优先级、触发方式等配置可能存在错误。
3. 硬件连接问题:PWM信号通过三极管拉低IO口,可能存在硬件连接不稳定或信号干扰。
4. 中断服务程序(ISR)问题:中断服务程序可能存在逻辑错误或未正确清除中断标志。

3. 详细解决方案

3.1 IO口配置
确保P36和P37的配置正确。准双向模式通常需要设置相应的寄存器,确保IO口能够正确检测上升沿和下降沿。

```c
// 假设P36和P37的配置寄存器为P3M1和P3M0
P3M1 &= ~(1

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 5 天前 | 显示全部楼层
针对您提到的IO中断问题,以下是一些可能的原因和解决方案,供您参考:

1. IO口配置问题
准双向模式:您提到P36和P37配置为准双向模式,这种模式在大多数情况下是合适的,但需要确保IO口的上拉电阻和驱动能力能够满足信号的要求。如果信号通过三极管拉低IO口,需要确保三极管的开关速度和驱动能力不会导致信号失真。
IO口电平匹配:确保PWM信号的电平与IO口的输入电平匹配。如果PWM信号的电平过高或过低,可能导致IO口无法正确检测到上升沿或下降沿。

2. 中断配置问题
中断优先级:检查中断优先级配置,确保IO中断的优先级足够高,不会被其他中断抢占。
中断使能:确认中断使能位是否正确设置。例如,EX0和EX1是否已经使能,以及EA(全局中断使能)是否已经打开。
中断触发方式:确保中断触发方式(上升沿或下降沿)与您的需求一致。例如,IT0和IT1是否设置为边沿触发。

3. 中断服务程序(ISR)问题
中断标志清除:在中断服务程序中,确保清除中断标志位。如果中断标志位未清除,可能导致中断无法再次触发。
中断响应时间:检查中断服务程序的执行时间,确保不会因为中断处理时间过长而错过下一次中断。
LED点亮逻辑:在中断服务程序中点亮LED的逻辑是否正确。例如,是否正确地设置了LED的控制引脚,以及LED的驱动电路是否正常工作。

4. 硬件连接问题
三极管电路:检查三极管电路的设计,确保三极管能够正确地拉低IO口。如果三极管的基极电阻或集电极电阻选择不当,可能导致信号失真或无法正确拉低IO口。
电源和地线:确保电源和地线连接良好,避免因为电源噪声或地线干扰导致IO口无法正确检测信号。

5. 调试建议
示波器检查:使用示波器检查PWM信号和IO口的输入信号,确保信号波形符合预期。
逐步调试:从最简单的代码开始,逐步添加功能,确保每一步都能正常工作。例如,先确保IO口能够正确检测到信号,再添加中断和定时器功能。
日志输出:在中断服务程序中添加日志输出,通过串口或其他方式输出调试信息,帮助定位问题。

6. 代码示例
以下是一个简单的代码示例,供您参考:
  1. c
  2. include "AI8H2K32U.h"
  3. sbit LED = P1^0; // 假设LED连接到P1.0
  4. void IOInit() {
  5.     P3M0 = 0x00; // P3口配置为准双向模式
  6.     P3M1 = 0x00;
  7.     IT0 = 1;     // 外部中断0为边沿触发
  8.     IT1 = 1;     // 外部中断1为边沿触发
  9.     EX0 = 1;     // 使能外部中断0
  10.     EX1 = 1;     // 使能外部中断1
  11.     EA = 1;      // 使能全局中断
  12. }
  13. void TimerInit() {
  14.     // 初始化定时器,根据需求配置
  15. }
  16. void External0ISR() interrupt 0 {
  17.     LED = 1; // 点亮LED
  18.     // 启动定时器
  19. }
  20. void External1ISR() interrupt 2 {
  21.     LED = 0; // 熄灭LED
  22.     // 停止定时器并读取数值
  23. }
  24. void main() {
  25.     IOInit();
  26.     TimerInit();
  27.     while (1) {
  28.         // 主循环
  29.     }
  30. }
复制代码

7. 总结
通过以上步骤,您应该能够逐步定位并解决IO中断的问题。如果问题仍然存在,建议进一步检查硬件连接和信号完整性,或者联系芯片厂商的技术支持获取更多帮助。

希望这些建议对您有所帮助,祝您的项目顺利进行!

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 4 天前 | 显示全部楼层
看看芯片手册附录里面关于“中断号大于31在Keil中编译出错的处理”相关章节
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-05-01 09:48:02
已绑定手机

4

主题

20

回帖

90

积分

注册会员

积分
90
发表于 4 天前 | 显示全部楼层
晓*** 发表于 2025-4-27 01:53
看看芯片手册附录里面关于“中断号大于31在Keil中编译出错的处理”相关章节 ...

看过了,借用中断向量13但是没用,压根不进去
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:106
  • 最近打卡:2025-05-01 09:11:48
已绑定手机

5

主题

27

回帖

313

积分

中级会员

积分
313
发表于 4 天前 | 显示全部楼层
本身PWM就可以输出你需要的几个占空比。为啥要用中断?
                                  if(Zoom_speed==2)  {   if(2090<=Zoom_axis && Zoom_axis<2400) Zoomzoom_axis = Zoom_axis/2; if(Zoom_axis>=2400) Zoomzoom_axis = 1200;} //占空比最大60%
                                 if(Zoom_speed==3)  {   if(2090<Zoom_axis && Zoom_axis<2800) Zoomzoom_axis = Zoom_axis/2;if(Zoom_axis>=2800) Zoomzoom_axis = 1400;}//最大占空比70%
                                 if(Zoom_speed==4)  {   if(2090<Zoom_axis && Zoom_axis<3200) Zoomzoom_axis = Zoom_axis/2;if(Zoom_axis>=1600) Zoomzoom_axis = 1600;}//最大占空比80%
void pwm_init()
{

        
    PWMB_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
    PWMB_CCER2 = 0x00;

    PWMB_CCMR2 = 0x60;
    PWMB_CCMR3 = 0x60;

    PWMB_CCER1 = 0x33; //配置通道输出使能和极性
    PWMB_CCER2 = 0x33;

    PWMB_CCMR2 |= 0x08;
    PWMB_CCMR3 |= 0x08;

          PWMB_PSCRH = 0;//设置预分频系数
    PWMB_PSCRL = 0;

    PWMB_ARRH = (u8)(PWM_PERIOD >> 8); //设置周期时间
    PWMB_ARRL = (u8)PWM_PERIOD;

    PWMB_ENO = 0x00;
    PWMB_ENO |= ENO6P; //使能输出
    PWMB_ENO |= ENO7P; //使能输出

    PWMB_PS = 0x00;    //高级 PWM 通道输出脚选择位
    PWMB_PS |= PWM6_2; //选择 PWM6_2 通道
    PWMB_PS |= PWM7_2; //选择 PWM7_2 通道

    PWMB_BKR = 0x80;   //使能主输出
    PWMB_CR1 |= 0x01;  //开始计时

}




//========================================================================
// 函数: UpdatePwm(void)
// 描述: 更新PWM占空比.
// 参数: none.
// 返回: none.

//========================================================================
void UpdatePwm(void)
{


    PWMB_CCR7H = (u8)(Zoomzoom_axis >> 8); //设置占空比时间
    PWMB_CCR7L = (u8)Zoomzoom_axis;

}

我这个用的也是这个芯片 不同的速度占空比不相同 频率固定。
你可以参考一下
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 4 天前 | 显示全部楼层
上传完整工程看看,另外示波器打一下P36 P37看看实际波形
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-05-01 09:48:02
已绑定手机

4

主题

20

回帖

90

积分

注册会员

积分
90
发表于 4 天前 | 显示全部楼层
13259*** 发表于 2025-4-27 08:17
本身PWM就可以输出你需要的几个占空比。为啥要用中断?
                                  if(Zoom_speed= ...

不是我要输出,是外面给的信号是pwm,不同的占空比执行不同的动作
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-05-01 09:48:02
已绑定手机

4

主题

20

回帖

90

积分

注册会员

积分
90
发表于 4 天前 | 显示全部楼层
erci*** 发表于 2025-4-27 08:54
上传完整工程看看,另外示波器打一下P36 P37看看实际波形

我没用示波器,现在我就直接手动给高电平都不触发中断,怪异,截图基本就是我的工程全部了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-05-01 09:48:02
已绑定手机

4

主题

20

回帖

90

积分

注册会员

积分
90
发表于 4 天前 | 显示全部楼层
erci*** 发表于 2025-4-27 08:54
上传完整工程看看,另外示波器打一下P36 P37看看实际波形

但是p36和37我用万用表量了,没给电确实是高点平,给了点就接地了说明硬件应该没啥问题

点评

截图不全,中断跳转处理是否正确呢。  详情 回复 发表于 4 天前
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 22:08 , Processed in 0.141324 second(s), 116 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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