OpenEdv-开源电子网

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

请教原子哥一个问题:关于外部中断触发的问题

[复制链接]

5

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2013-8-18
在线时间
8 小时
发表于 2013-8-26 21:09:29 | 显示全部楼层 |阅读模式

原子哥:
       现在我程序里有个问题:程序里只开下降或上升外部中断,在测试50Hz的交流过零点时(10ms一个周期,8ms高,2MS低),正确的中断间隔时间应该是10ms一次,实际测试在变高变低时都发生中断(进中断的间隔时间8ms/2ms交替出现,还有部分是10MS进一次),

如果设置成下降上升都中断,那么就不丢失中断(进中断的间隔时间8ms/2ms交替出现)

在输入信号是没有干扰的,是很好的方波信号。

程序如下:

 //初始PA15为中断输入.
void EXTIX_Init(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;
  EXTI_InitTypeDef EXTI_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);

  //初始化 KEY1-->GPIOA.15  上拉输入
   GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_15;
   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                                     
   GPIO_Init(GPIOA, &GPIO_InitStructure);

 //GPIOA.15   中断线以及中断初始化配置
   GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource15);

   EXTI_InitStructure.EXTI_Line=EXTI_Line15;
   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; 
   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; //EXTI_Trigger_Falling; Rising; //_
   EXTI_InitStructure.EXTI_LineCmd = ENABLE;
   EXTI_Init(&EXTI_InitStructure);    //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

   NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;   //使能按键所在的外部中断通道
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; //抢占优先级2,
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;   //子优先级1
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;     //使能外部中断通道
   NVIC_Init(&NVIC_InitStructure);
}

 

volatile u8 tim4_flag;
 
void EXTI15_10_IRQHandler(void)
{
 if (EXTI_GetITStatus(EXTI_Line15) == SET)
 {
   if(tim4_flag==0x0)
    {
     GPIO_ResetBits(GPIOB,GPIO_Pin_11);
     tim4_flag=0x0ff;
    }
    else
    {
     GPIO_SetBits(GPIOB,GPIO_Pin_11);
     tim4_flag=0x00;
    }
 }
  EXTI_ClearITPendingBit(EXTI_Line15);  //清除EXTI15线路挂起位 
}

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-26 21:57:39 | 显示全部楼层
回复【楼主位】xxiangj:
---------------------------------
代码看上去无问题哦
用JTAG仿真看看吧,用杜邦线接高接地模拟高低电平,来测试下,看看是不是如你设置的一样?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2013-8-18
在线时间
8 小时
 楼主| 发表于 2013-8-27 19:26:39 | 显示全部楼层
原子哥:

上面的问题,晚上再换块板验证下,

还向你请教个问题:在用顶时器输出两路反相PWM时,如果我每一个PWM都改变周期(用定时中断改变定时器初值),测试发现在中断里需要2US左右的时间(如果加上小许处理,总共3us左右),我现在是用一个定时器的2个通道采用比较的方式来做,一个PWM周期需要中断2次,最大输出100kHz的频率,也就是中断频率是200KHz,5US中断一次,这样程序有没有问题?会不会影响其他的非实时的程序的处理.

或者原子哥有没有其他的方法来解决这个问题.

我用是的stm32f103,72MHz的主频.
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-27 22:04:17 | 显示全部楼层
回复【3楼】xxiangj:
---------------------------------
最好搞2个定时器吧。这样频繁中断,很影响其他代码的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-14 06:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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