[STM32F1] 程序中NVIC初始化后程序就会卡死,请大神帮看什么回事,新手求救

[复制链接]
 楼主| karle 发表于 2014-8-1 19:56 | 显示全部楼层 |阅读模式
vi, ic, IO, pi, GPIO
用JLINK进行RAM调试时,程序中NVIC初始化后程序就会卡死,注释掉“NVIC_Init(&NVIC_InitStructure);”就可以正常运行,求大神帮看
这里附上main.c的程序
  1. /*Include---------------------------*/
  2. #include"stm32f10x_lib.h"                //包含所有的头文件
  3. #include<stdio.h>

  4. //----------------函数声明--------------------
  5. void Delay_MS(u16 dly);
  6. void RCC_Configuration(void);
  7. void GPIO_Configuration(void);

  8. //void EXTI_Configuration(void);
  9. void NVIC_Configuration(void);
  10. //void USART3_Configuration(void);


  11. /*******************************************************************************
  12. * Function Name  : main
  13. * Description    : Main program.
  14. * Input          : None
  15. * Output         : None
  16. * Return         : None
  17. *******************************************************************************/
  18. int main(void)
  19. {
  20.         #ifdef DEBUG
  21.         debug();
  22.         #endif

  23.         //------------初始化------------
  24.         RCC_Configuration();
  25.         GPIO_Configuration();
  26. //        EXTI_Configuration();
  27.         NVIC_Configuration();
  28. //        USART3_Configuration();

  29.         while(1)
  30.         {
  31.             GPIO_SetBits(GPIOA, GPIO_Pin_1);                 //置位LED
  32.             Delay_MS(2000);
  33.                 GPIO_ResetBits(GPIOA, GPIO_Pin_1);                 //复位LED
  34.             Delay_MS(2000);
  35.                 GPIO_SetBits(GPIOA, GPIO_Pin_4);
  36.             Delay_MS(2000);
  37.             GPIO_ResetBits(GPIOA, GPIO_Pin_4);
  38.             Delay_MS(2000);
  39.         }

  40.                
  41. }

  42. /*******************************************************************************
  43. * Function Name  : Delay_Ms
  44. * Description    : delay 1 ms.
  45. * Input          : dly (ms)
  46. * Output         : None
  47. * Return         : None
  48. *******************************************************************************/
  49. void Delay_MS(u16 dly)
  50. {
  51.         u16 i,j;
  52.         for(i=0;i<dly;i++)
  53.                 for(j=1000;j>0;j--);
  54. }

  55. /*******************************************************************************
  56. * Function Name  : RCC_Configuration
  57. * Description    : Configures the different system clocks.
  58. * Input          : None
  59. * Output         : None
  60. * Return         : None
  61. *******************************************************************************/
  62. void RCC_Configuration(void)
  63. {
  64.         //----------使用外部RC晶振-----------
  65.         RCC_DeInit();                        //初始化为缺省值
  66.         RCC_HSEConfig(RCC_HSE_ON);        //使能外部的高速时钟
  67.         while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);        //等待外部高速时钟使能就绪
  68.        
  69.         FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);        //Enable Prefetch Buffer
  70.         FLASH_SetLatency(FLASH_Latency_2);                //Flash 2 wait state
  71.        
  72.         RCC_HCLKConfig(RCC_SYSCLK_Div1);                //HCLK = SYSCLK
  73.         RCC_PCLK2Config(RCC_HCLK_Div1);                        //PCLK2 =  HCLK
  74.         RCC_PCLK1Config(RCC_HCLK_Div2);                        //PCLK1 = HCLK/2
  75.         RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);        //PLLCLK = 8MHZ * 9 =72MHZ
  76.         RCC_PLLCmd(ENABLE);                        //Enable PLLCLK

  77.         while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);        //Wait till PLLCLK is ready
  78.     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);        //Select PLL as system clock
  79.         while(RCC_GetSYSCLKSource()!=0x08);                //Wait till PLL is used as system clock source
  80.        
  81.         //---------打开相应外设时钟--------------------
  82.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);        //使能APB2外设的GPIOA的时钟                 
  83.         //RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
  84.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);        //使能APB2外设的GPIOA的时钟                 
  85. }

  86. /*******************************************************************************
  87. * Function Name  : GPIO_Configuration
  88. * Description    : 初始化GPIO外设
  89. * Input          : None
  90. * Output         : None
  91. * Return         : None
  92. *******************************************************************************/
  93. void GPIO_Configuration(void)
  94. {
  95.         GPIO_InitTypeDef        GPIO_InitStructure;                //声明一个结构体变量
  96.         EXTI_InitTypeDef EXTI_InitStructure;

  97.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_1;         //选择PC.10(TXD) 和 PC.11
  98.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         //管脚频率为50MHZ
  99.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //输出模式为复用推挽输出
  100.         GPIO_Init(GPIOA,&GPIO_InitStructure);                                 //初始化GPIOC寄存器

  101.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;         //选择PC.10(TXD) 和 PC.11
  102.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         //管脚频率为50MHZ
  103.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //输出模式为复用推挽输出
  104.         GPIO_Init(GPIOC,&GPIO_InitStructure);                                 //初始化GPIOC寄存器

  105.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;         //选择PC.10(TXD) 和 PC.11(RXD)
  106.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         //管脚频率为50MHZ
  107.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;         //输出模式为浮空输入
  108.         GPIO_Init(GPIOC,&GPIO_InitStructure);                                 //初始化GPIOA寄存器               
  109.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource13);

  110.         //EXTI_DeInit();     //将EXIT寄存器重设置为缺省值
  111.         EXTI_InitStructure.EXTI_Line = EXTI_Line13;
  112.         EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  113.         EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  114.         EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  115.         EXTI_Init(&EXTI_InitStructure);

  116.         //将USART3的TXD和RXD重映射到PC10和pc11
  117.         //GPIO_PinRemapConfig(GPIO_PartialRemap_USART3,ENABLE);               
  118. }

  119. //void EXTI_Configuration(void)
  120. //{
  121. //        EXTI_InitTypeDef EXTI_InitStructure;
  122. //        EXTI_DeInit();     //将EXIT寄存器重设置为缺省值
  123. //        EXTI_InitStructure.EXTI_Line = EXTI_Line13;
  124. //        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  125. //        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  126. //        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  127. //        EXTI_Init(&EXTI_InitStructure);
  128. //
  129. //        EXTI_ClearITPendingBit(EXTI_Line13);
  130. //}

  131. void NVIC_Configuration(void)
  132. {
  133.         NVIC_InitTypeDef NVIC_InitStructure;
  134.         #ifdef VECT_TAB_RAM
  135.         NVIC_SetVectorTable(NVIC_VectTab_RAM,0X0);//向量表位于RAM区
  136.     #else
  137.         NVIC_SetVectorTable(NVIC_VectTab_FLASH,0X0);//向量表位于FLASH区
  138.     #endif
  139.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  140. //       
  141.         NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQChannel;
  142.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  143.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  144.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  145.         NVIC_Init(&NVIC_InitStructure);
  146. }
  147. //void USART3_Configuration(void)
  148. //{
  149. //        USART_InitTypeDef  U3;
  150. //        U3.USART_BaudRate =9600;
  151. //        U3.USART_WordLength = USART_WordLength_8b;
  152. //        U3.USART_StopBits = USART_StopBits_1;
  153. //        U3.USART_Parity = USART_Parity_No;
  154. //        U3.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
  155. //        U3.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  156. //
  157. //        USART_Init(USART3, &U3);
  158. //
  159. //        USART_Cmd(USART3,ENABLE);
  160. //}

mmuuss586 发表于 2014-8-2 15:30 | 显示全部楼层
程序死后,停在什么地方啊?
截个图看看;
 楼主| karle 发表于 2014-8-4 10:28 | 显示全部楼层
mmuuss586 发表于 2014-8-2 15:30
程序死后,停在什么地方啊?
截个图看看;

卡在延时里的“for(j=1000;j>0;j--);”跳不出去
  1. void Delay_MS(u16 dly)
  2. {
  3.         u16 i,j;
  4.         for(i=0;i<dly;i++)
  5.                 for(j=1000;j>0;j--);
  6. }
 楼主| karle 发表于 2014-8-4 10:34 | 显示全部楼层
karle 发表于 2014-8-4 10:28
卡在延时里的“for(j=1000;j>0;j--);”跳不出去

我在“NVIC_Configuration();”上进行step over是跳不过去的,我觉得还是卡在了NVIC_Configuration();上,而且如果我把NVIC_Configuration();中的NVIC_Init(&NVIC_InitStructure);注掉是可以正常运行的,就是开启不了中断
 楼主| karle 发表于 2014-8-4 11:10 | 显示全部楼层
karle 发表于 2014-8-4 10:34
我在“NVIC_Configuration();”上进行step over是跳不过去的,我觉得还是卡在了NVIC_Configuration();上 ...

现在发现一步一步调试可以顺利运行,但是全速运行立刻跳转到中断,之后卡死
 楼主| karle 发表于 2014-8-4 14:38 | 显示全部楼层
找到了,没请中断
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

7

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部