STM32F的JTAG调试会不会引起EXTI13中断?
我用PC13作为外部中断输入,总是莫名其妙的中断,我看外部中断只能区分中断是来自哪个EXTI不能区分具体是哪个引脚,如果我允许EXTI13中断,是不是PC13(程序允许)和PA13(默认JTAG调试)都可以产生中断?
我的初始化程序
/*******************************************************************************
* 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);
}
我刚把PC13的
侵入检测功能关了,设成上拉输入,结果还是不正常
EXTI_Configuration如何设置的呢?
没看到你指派PA13中断源,EXTI_Configuration也没有设置
默认JTAG调试应该不会产生额外的中断.
如果调试时出现一些连接错误,或一些莫名其妙的问题,请先升级一下stm32f10x_update_for_IARarm4.42
然后重新配置你的工程中device选项
相关链接:
https://bbs.eeworld.com.cn/upfiles/img/200711/20071126101716555.zip
中断的配置我放在了中断程序中
我的目的是一个外部中断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;
}
要计算两个下降沿之间的时间,为什么不直接用输入捕获功
使用输入捕获功能又方便又准确。
使用中断方法的最大问题是测量出的时间不准确,首先从产生中断到读出定时器内容之间的程序执行时间被算进去了,其次如果有其他中断造成延误则误差将更大。
关于楼主1楼的问题,“如果我允许EXTI13中断,是不是PC13(程序允许)和PA13(默认JTAG调试)都可以产生中断?”,请看AFIO_EXTICR4寄存器中EXTI13[3:0],这几个寄存器位在PA13、PB13、PC13、PD13、PE13、PF13或PG13中选择一个作为EXTI13中断源;所以问题的答案很清楚,根据配置PC13或PA13只能有一个可以产生中断。
问题是输入捕获不是每个脚都能用的
而且我这两个下降沿不是一个管脚上来的
使用一个定时器4个通道中的任意2个通道,分别捕获2个下降
然后2个通道捕获的数值之差就是你要测量的时间。
输入捕获确实不是每个脚都能用的,但你希望因为中断方式的不准确而牺牲精度吗?而且使用中断方式的程序要复杂的多。
我的困难是硬件已经确定
只能使用外部中断触发计时,定时的精度可以比较低。现在的问题是用pc13作为外部中断触发不能正确触发。
可以先用一个最简单的程序验证你能够正确地使用PC13触发中
我怀疑你程序的逻辑比较复杂,而造成程序上的错误。
另外,相信你现在是产品设计的初级阶段,修改硬件应该不是很困难的事情。
同样的管脚我用了6个
分别是PA4 PA5 PA6 PA7 PA8 PC13,现在PA4 - PA5的时间测试正确,PA6 - PA7的时间测试正确,PA6 - PA8的时间测试正确,就差这个pa7-pc13的不对。
我正在研究https://bbs.eeworld.com.cn/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
希望能找到点提示
现在的现象是退出pa7的中断马上进入pc13的中断
无论我在PA7的中断中怎么清除pc13的标志位。正常应该是退出PA7 5毫秒以后进PC13中断。