打印

STM32F的JTAG调试会不会引起EXTI13中断?

[复制链接]
3784|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sunke9|  楼主 | 2008-10-11 08:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用PC13作为外部中断输入,总是莫名其妙的中断,我看外部中断只能区分中断是来自哪个EXTI不能区分具体是哪个引脚,如果我允许EXTI13中断,是不是PC13(程序允许)和PA13(默认JTAG调试)都可以产生中断?

沙发
sunke9|  楼主 | 2008-10-11 08:27 | 只看该作者

我的初始化程序


/*******************************************************************************
* Function Name  : RCC_Configuration
* Description    : Configures the different system clocks.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RCC_Configuration(void)
{
  /* RCC system reset(for debug purpose)[¸´Î»RCCÍâΧÉ豸¼Ä´æÆ÷µ½Ä¬Èϸ´Î»Öµ] */
        RCC_DeInit();
  /* Enable HSE [HSEÕñµ´Æ÷¿ªÆô]*/
        RCC_HSEConfig(RCC_HSE_ON);
  /* Wait till HSE is ready [µÈ´ýHSEÆô¶¯]*/
        HSEStartUpStatus = RCC_WaitForHSEStartUp();
        if(HSEStartUpStatus == SUCCESS)
        {
    /* Enable Prefetch Buffer [Ԥȡ»º³åÇøÔÊÐí]*/
                FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    /* Flash 2 wait state[´úÂë2¸öÑÓʱÖÜÆÚ] */
                FLASH_SetLatency(FLASH_Latency_2); 
    /* HCLK = SYSCLK [AHBʱÖÓµÈÓÚSYSCLK]*/
                RCC_HCLKConfig(RCC_SYSCLK_Div1);   
    /* PCLK2 = HCLK [APB2ʱÖÓµÈÓÚHCLK]*/
                RCC_PCLK2Config(RCC_HCLK_Div1); 
    /* PCLK1 = HCLK/2 [µÍËÙAPB1ʱÖÓµÈÓÚHCLK/2]*/
                RCC_PCLK1Config(RCC_HCLK_Div2);
    /* PLLCLK = 8MHz * 4 = 32 MHz [ÅäÖÃPLLʱÖÓÔ´ºÍ³Ë·¨Òò×Ó][PLLʱÖÓÊäÈëµÈÓÚHSEʱÖÓ][PLL³Ë·¨Òò×ÓÈ¡Öµ4]*/
                RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_4);
    /* Enable PLL [ÔÊÐíPLL]*/ 
                RCC_PLLCmd(ENABLE);
    /* Wait till PLL is ready [µÈ´ýPLLʱÖÓ¾ÍÐ÷]*/
                while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
                {
                }
    /* Select PLL as system clock source [Ñ¡ÔñPLL×÷ΪϵͳʱÖÓ]*/
                RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    /* Wait till PLL is used as system clock source[µÈ´ýPLL±»×÷ΪϵͳʱÖÓ] */
                while(RCC_GetSYSCLKSource() != 0x08)
                {
                }
        } 
    /* TIM3 clock enable [TIM3¶¨Ê±Æ÷ÔÊÐí]*/
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , ENABLE);                        
  /* Enable GPIOC clock [ʹÄÜGPIOCʱÖÓ]*/
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC , ENABLE); 
}
/*******************************************************************************
* Function Name  : GPIO_Configuration
* Description    : LEDÊä³öÅäÖÃ
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void GPIO_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
  
  /* °ÑPA4-8ÅäÖóÉÊäÈëģʽ */
        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 ;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//GPIO×î¸ßËÙ¶È50MHz
        GPIO_Init(GPIOA, &GPIO_InitStructure);
  /* °ÑPC13ÅäÖóÉÊäÈëģʽ */
        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_13 ;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
        /* Ñ¡ÔñGPA4-8¡¢GPC13×÷ΪÍⲿÖжÏÊäÈë */
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource4 | GPIO_PinSource5 | GPIO_PinSource6 | GPIO_PinSource7 | GPIO_PinSource8);        
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);                 
}

/*******************************************************************************
* Function Name  : NVIC_Configuration
* Description    : Configures the nested vectored interrupt controller.[ÅäÖÃÖжÏÏòÁ¿±íµÄÆðʼλÖÃ]
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void NVIC_Configuration(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;
#ifdef  VECT_TAB_RAM  
  /* Set the Vector Table base location at 0x20000000 [ÉèÖÃÖжÏÏòÁ¿±íµÄÆðʼλÖÃ0x20000000]*/ 
        NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 
#else  /* VECT_TAB_FLASH  */
  /* Set the Vector Table base location at 0x08000000[ÉèÖÃÖжÏÏòÁ¿±íµÄÆðʼλÖÃ0x0x08000000] */ 
        NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
#endif 

  /* Configure the NVIC Preemption Priority Bits[ÅäÖÃÓÅÏȼ¶×é] */  
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);  
  /* Enable the TIM4 gloabal Interrupt */
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQChannel;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);        
  /* Enable the EXTI4 Interrupt */
        NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQChannel;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
  /* Enable the EXTI9_5 Interrupt */
        NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
  /* Enable the EXTI15_10 Interrupt */
        NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQChannel;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);                        
}

使用特权

评论回复
板凳
sunke9|  楼主 | 2008-10-11 09:13 | 只看该作者

我刚把PC13的

侵入检测功能关了,设成上拉输入,结果还是不正常

使用特权

评论回复
地板
luomh98| | 2008-10-11 10:01 | 只看该作者

EXTI_Configuration如何设置的呢?

没看到你指派PA13中断源,EXTI_Configuration也没有设置
默认JTAG调试应该不会产生额外的中断.
如果调试时出现一些连接错误,或一些莫名其妙的问题,请先升级一下stm32f10x_update_for_IARarm4.42
然后重新配置你的工程中device选项
相关链接:https://bbs.21ic.com/upfiles/img/200711/20071126101716555.zip

使用特权

评论回复
5
sunke9|  楼主 | 2008-10-11 10:43 | 只看该作者

中断的配置我放在了中断程序中

我的目的是一个外部中断pa7到来,关闭PA7中断,启动定时器,开PC13中断。当pc13中断到来停定时器来计算两个下降沿之间的时间。
    else if(EXTI_GetITStatus(EXTI_Line7) != RESET) //UBCÖжÏ
    {
        /* ½ûÖ¹UBCÖжϠ*/  
        EXTI_InitStructure.EXTI_Line = GPIO_Pin_7;
        EXTI_InitStructure.EXTI_LineCmd = DISABLE;
        EXTI_Init(&EXTI_InitStructure);    
        switch(F_and_R)
        {
            case 4:
            {                     
                /* TIM3 configuration */
                TIM_TimeBaseStructure.TIM_Period = 0xffff; //×î´ó¼ÆÊýÖµ0xffff                  
                TIM_TimeBaseStructure.TIM_Prescaler = 15;//·ÖƵ0x1       
                TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // Ê±Öӷָ
                TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //¼ÆÊý·½ÏòÏòÉϼÆÊý
                TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);  
                     /* Clear TIM3 update pending flag[Çå³ýTIM3Òç³öÖжϱêÖ¾] */
                TIM_ClearFlag(TIM3, TIM_FLAG_Update); 
                /* Enable TIM3 Update interrupt [TIM3Òç³öÖжÏÔÊÐí]*/
                TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);  
                     /* TIM3 enable counter [ÔÊÐítim3¼ÆÊý]*/
                TIM_Cmd(TIM3, ENABLE);    
                /* ÔÊÐíIcϽµÑØÖжϠ*/  
                EXTI_InitStructure.EXTI_Line = GPIO_Pin_13;
                EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
                EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
                EXTI_InitStructure.EXTI_LineCmd = ENABLE;
                EXTI_Init(&EXTI_InitStructure);
            }break;
            case 0:
            {
                UAB_UBC[break_js] = tmp;    //±£´æ¶¨Ê±Æ÷ʱ¼ä
                TIM_Cmd(TIM3, DISABLE);
                TIM_DeInit( TIM3);//¸´Î»TIM3¶¨Ê±Æ÷
            }break;
        }

使用特权

评论回复
6
香水城| | 2008-10-11 10:59 | 只看该作者

要计算两个下降沿之间的时间,为什么不直接用输入捕获功

使用输入捕获功能又方便又准确。

使用中断方法的最大问题是测量出的时间不准确,首先从产生中断到读出定时器内容之间的程序执行时间被算进去了,其次如果有其他中断造成延误则误差将更大。


关于楼主1楼的问题,“如果我允许EXTI13中断,是不是PC13(程序允许)和PA13(默认JTAG调试)都可以产生中断?”,请看AFIO_EXTICR4寄存器中EXTI13[3:0],这几个寄存器位在PA13、PB13、PC13、PD13、PE13、PF13或PG13中选择一个作为EXTI13中断源;所以问题的答案很清楚,根据配置PC13或PA13只能有一个可以产生中断。

使用特权

评论回复
7
sunke9|  楼主 | 2008-10-11 11:12 | 只看该作者

问题是输入捕获不是每个脚都能用的

而且我这两个下降沿不是一个管脚上来的

使用特权

评论回复
8
香水城| | 2008-10-11 11:24 | 只看该作者

使用一个定时器4个通道中的任意2个通道,分别捕获2个下降

然后2个通道捕获的数值之差就是你要测量的时间。

输入捕获确实不是每个脚都能用的,但你希望因为中断方式的不准确而牺牲精度吗?而且使用中断方式的程序要复杂的多。

使用特权

评论回复
9
sunke9|  楼主 | 2008-10-11 11:30 | 只看该作者

我的困难是硬件已经确定

只能使用外部中断触发计时,定时的精度可以比较低。现在的问题是用pc13作为外部中断触发不能正确触发。

使用特权

评论回复
10
香水城| | 2008-10-11 11:41 | 只看该作者

可以先用一个最简单的程序验证你能够正确地使用PC13触发中

我怀疑你程序的逻辑比较复杂,而造成程序上的错误。


另外,相信你现在是产品设计的初级阶段,修改硬件应该不是很困难的事情。

使用特权

评论回复
11
sunke9|  楼主 | 2008-10-11 11:53 | 只看该作者

同样的管脚我用了6个

分别是PA4 PA5 PA6 PA7 PA8 PC13,现在PA4 - PA5的时间测试正确,PA6 - PA7的时间测试正确,PA6 - PA8的时间测试正确,就差这个pa7-pc13的不对。
我正在研究https://bbs.21ic.com/club/bbs/list.asp?boardid=49&t=2847096&tp=STM32101%u7684PC14%u548CPC15%u600E%u4E48%u8BBE%u7F6E%u4E3AI/O%u53E3%uFF0C%u53EF%u4EE5%u505A%u4E3AEXTI%u8F93%u5165%u811A%u4E48%3F
希望能找到点提示

使用特权

评论回复
12
sunke9|  楼主 | 2008-10-11 16:02 | 只看该作者

现在的现象是退出pa7的中断马上进入pc13的中断

无论我在PA7的中断中怎么清除pc13的标志位。正常应该是退出PA7 5毫秒以后进PC13中断。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

355

帖子

1

粉丝