打印

STM32中断程序进不去!求高手指点!

[复制链接]
7846|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
vfp8341|  楼主 | 2012-8-13 12:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 vfp8341 于 2012-8-13 12:05 编辑

卡在这儿好几天了。怎么也找不出原因,直接快疯了!:'(
按键、摇杆joystick都正常,用while检测能运行,用中断就是无反应,USART的中断
也进不去,看门狗的中断也进不去!:'(
高手帮忙查查代码吧?
main.c:
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include <stdio.h>
#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/* Private function prototypes -----------------------------------------------*/
void GPIO_Configuration(void);
void USART_Configuration(void);
void NVIC_Configuration(void);
void EXTI_Configuration(void);
/*******************************************************************************
* Function Name  : Delay
* Description    : Delay Time
* Input          : - nCount: Delay Time
* Output         : None
* Return         : None
* Attention   : None
*******************************************************************************/
void  Delay (uint32_t nCount)
{
  for(; nCount != 0; nCount--);
}

/*******************************************************************************
* Function Name  : main
* Description    : Main program
* Input          : None
* Output         : None
* Return         : None
* Attention   : None
*******************************************************************************/
int main(void)
{
GPIO_Configuration();
USART_Configuration();
NVIC_Configuration();
EXTI_Configuration();
printf("******************************************************************\r\n");
    printf("*                                                                *\r\n");
printf("*  Thank you for using HY-FireBull V1.0 Development Board ! ^_^  *\r\n");
printf("*                                                                *\r\n");
printf("******************************************************************\r\n");
    /* Infinite loop */
    while (1){
   if( !GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8) )
   {
     Delay(0xffff);                             /* 按键防抖动 */
  if( !GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8) )
  printf("User Button is Press\r\n");
   }
      /*====LED-ON=======*/
   GPIO_SetBits(GPIOD , GPIO_Pin_8);
   GPIO_SetBits(GPIOD , GPIO_Pin_9);
   GPIO_SetBits(GPIOD , GPIO_Pin_10);
   GPIO_SetBits(GPIOD , GPIO_Pin_11);
   Delay(0xfffff);
   Delay(0xfffff);
   /*====LED-OFF=======*/
   GPIO_ResetBits(GPIOD , GPIO_Pin_8);
   GPIO_ResetBits(GPIOD , GPIO_Pin_9);
   GPIO_ResetBits(GPIOD , GPIO_Pin_10);
   GPIO_ResetBits(GPIOD , GPIO_Pin_11);
   Delay(0xfffff);
   Delay(0xfffff);
    }
}

/*******************************************************************************
* Function Name  : GPIO_Configuration
* Description    : Configures the different GPIO ports.
* Input          : None
* Output         : None
* Return         : None
* Attention   : None
*******************************************************************************/
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOD , ENABLE);        
  /**
  *  JOY_UP -> PD4 , JOY_DOWN -> PD1 , JOY_LEFT -> PD2 , JOY_RIGHT -> PD3 , JOY_SEL -> PD0
  *  User Button -> PA8
  */   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
  /**
  *  LED1 -> PD8 , LED2 -> PD9 , LED3 -> PD10 , LED4 -> PD11
  */   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; ;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
}
/*******************************************************************************
* Function Name  : USART_Configuration
* Description    : Configure USART1
* Input          : None
* Output         : None
* Return         : None
* Attention   : None
*******************************************************************************/
void USART_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE);
  /*
  *  USART1_TX -> PA9 , USART1_RX -> PA10
  */   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;         
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);     
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;         
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  USART_InitStructure.USART_BaudRate = 115200;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  USART_Init(USART1, &USART_InitStructure);
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
  USART_Cmd(USART1, ENABLE);
}

/*******************************************************************************
* Function Name  : EXTI_Configuration
* Description    : Configures the different EXTI lines.
* Input          : None
* Output         : None
* Return         : None
* Attention   : None
*******************************************************************************/
void EXTI_Configuration(void)
{
  EXTI_InitTypeDef EXTI_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource0);
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource1);
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource2);
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource3);
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource4);
  EXTI_ClearITPendingBit(EXTI_Line0);
  EXTI_ClearITPendingBit(EXTI_Line1);
  EXTI_ClearITPendingBit(EXTI_Line2);
  EXTI_ClearITPendingBit(EXTI_Line3);
  EXTI_ClearITPendingBit(EXTI_Line4);
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1 | EXTI_Line2 | EXTI_Line3 | EXTI_Line4;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
}

/*******************************************************************************
* Function Name  : NVIC_Configuration
* Description    : Configures the nested vectored interrupt controller.
* Input          : None
* Output         : None
* Return         : None
* Attention   : None
*******************************************************************************/
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);               
  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;   
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;      
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;   
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;   
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;      
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);  
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);               
  NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;   
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;      
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);        
  NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;  
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;   
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;  
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;   
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}


/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART */
  USART_SendData(USART1, (uint8_t) ch);
  /* Loop until the end of transmission */
  while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
  {}
  return ch;
}
沙发
vfp8341|  楼主 | 2012-8-13 12:04 | 只看该作者
这是it.c的代码:
#include "stm32f10x_it.h"
#include<stdio.h>
/** @addtogroup STM32F10x_StdPeriph_Template
  * @{
  */

/*******************************************************************************
* Function Name  : EXTI0_IRQHandler
* Description    : This function handles External lines 0 interrupt request.
* Input          : None
* Output         : None
* Return         : None
* Attention                 : None
*******************************************************************************/
void EXTI0_IRQHandler(void)
{
        if ( EXTI_GetITStatus(EXTI_Line0) != RESET ) {
                EXTI_ClearITPendingBit(EXTI_Line0);
                printf("Joystick Sel is Press\r\n");
        }                               
}


/*******************************************************************************
* Function Name  : EXTI1_IRQHandler
* Description    : This function handles External lines 1 interrupt request.
* Input          : None
* Output         : None
* Return         : None
* Attention                 : None
*******************************************************************************/
void EXTI1_IRQHandler(void)
{
        if ( EXTI_GetITStatus(EXTI_Line1) != RESET ) {
                EXTI_ClearITPendingBit(EXTI_Line1);
            printf("Joystick Down is Press\r\n");
        }       
}

/*******************************************************************************
* Function Name  : EXTI2_IRQHandler
* Description    : This function handles External lines 2 interrupt request.
* Input          : None
* Output         : None
* Return         : None
* Attention                 : None
*******************************************************************************/
void EXTI2_IRQHandler(void)
{
        if ( EXTI_GetITStatus(EXTI_Line2) != RESET ) {
                EXTI_ClearITPendingBit(EXTI_Line2);
            printf("Joystick Left is Press\r\n");
        }       
}


/*******************************************************************************
* Function Name  : EXTI3_IRQHandler
* Description    : This function handles External lines 3 interrupt request.
* Input          : None
* Output         : None
* Return         : None
* Attention                 : None
*******************************************************************************/
void EXTI3_IRQHandler(void)
{
        if ( EXTI_GetITStatus(EXTI_Line3) != RESET ) {
                EXTI_ClearITPendingBit(EXTI_Line3);
            printf("Joystick Right is Press\r\n");
        }       
}

/*******************************************************************************
* Function Name  : EXTI4_IRQHandler
* Description    : This function handles External lines 4 interrupt request.
* Input          : None
* Output         : None
* Return         : None
* Attention                 : None
*******************************************************************************/
void EXTI4_IRQHandler(void)
{
        if ( EXTI_GetITStatus(EXTI_Line4) != RESET ) {
                EXTI_ClearITPendingBit(EXTI_Line4);
                printf("Joystick Up is Press\r\n");
        }       
}

使用特权

评论回复
板凳
5509| | 2012-8-13 12:09 | 只看该作者
貌似只配置了,没有开中断

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
vfp8341 + 1
地板
vfp8341|  楼主 | 2012-8-13 12:16 | 只看该作者
貌似配置了就可以的样子。。。还有开关函数? 3# 5509

使用特权

评论回复
5
IJK| | 2012-8-13 12:39 | 只看该作者
印象里,复位后,STM32是开中断的。
另外,建议先从STM32的例子开始,这样上手快。

使用特权

评论回复
6
vfp8341|  楼主 | 2012-8-13 13:07 | 只看该作者
这位大大。。。这是开发板带的例程。。。好坑人啊 5# IJK

使用特权

评论回复
7
ling13147| | 2012-8-13 14:30 | 只看该作者
是不是硬件问题啊,比如虚焊什么的,引脚要检测到下降沿才有效。用调试器时看看NVIC和EXTI中断寄存器的状态。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
vfp8341 + 1
8
vfp8341|  楼主 | 2012-8-13 15:11 | 只看该作者
说得对!我试试去。:) 7# ling13147

使用特权

评论回复
9
vfp8341|  楼主 | 2012-8-13 16:05 | 只看该作者
用调试器操作了一下,终于通了!!!:lol 狂喜啊!!! 7# ling13147

使用特权

评论回复
10
vfp8341|  楼主 | 2012-8-13 16:11 | 只看该作者
这位亲,偶论坛上的不多,貌似评分搞错了,才给了一分。。。你再胡乱回一个,我好给分。:lol 7# ling13147

使用特权

评论回复
11
将臣归邪| | 2012-8-13 16:45 | 只看该作者
9# vfp8341

到底是啥问题啊

使用特权

评论回复
12
ling13147| | 2012-8-13 22:15 | 只看该作者
学习愉快!

使用特权

评论回复
13
伐多2011| | 2012-8-14 13:54 | 只看该作者
没看到中断使能的?

使用特权

评论回复
14
flyleaf91| | 2012-8-14 14:03 | 只看该作者
能说明一下如何解决的嘛?帮助一下后来人呀~

使用特权

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

本版积分规则

0

主题

44

帖子

1

粉丝