微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > stm32为什么就是进不到中断 配置都设置好了 求大神解答

stm32为什么就是进不到中断 配置都设置好了 求大神解答

时间:10-02 整理:3721RD 点击:
#include "delay.h"
volatile u8 u8_app_flag =0;
void main(void)
{
  u16 flag;
  RCC_Configuration();
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG | RCC_APB2Periph_GPIOC | RCC_APB2Periph_ADC1,ENABLE);
  GPIO_Configuration();
  NVIC_Configuration();
  TIM_Configuration();
  //SysTick_Config();
  while(1)
  {
    flag++;
   if(u8_app_flag)
   {
    GPIO_ResetBits(GPIOE,GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);
    GPIO_SetBits(GPIOE,GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10);
    GPIO_ResetBits(GPIOE,GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10);
   }
   else
   {
    GPIO_SetBits(GPIOE,GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);
    GPIO_SetBits(GPIOE,GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10);
    GPIO_ResetBits(GPIOE,GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10);
  }
}
}
下面为配置问价
#include "delay.h"
void Delay_ms(u16 time)
{
    u16 i;
    while(time--)
  {
    i=1200;
    while(i--);
  }
}
void RCC_Configuration(void)
{
  ErrorStatus HSEStartUpStatus;
    //将外设 RCC寄存器重设为缺省值
    RCC_DeInit();
    //设置外部高速晶振(HSE)
    RCC_HSEConfig(RCC_HSE_ON);
    //等待 HSE 起振
    HSEStartUpStatus = RCC_WaitForHSEStartUp();
    if(HSEStartUpStatus == SUCCESS)
    {
        //预取指缓存使能
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
        //设置代码延时值
        //FLASH_Latency_2  2 延时周期
        FLASH_SetLatency(FLASH_Latency_2);
        //设置 AHB 时钟(HCLK)
        //RCC_SYSCLK_Div1  AHB 时钟 =  系统时钟
        RCC_HCLKConfig(RCC_SYSCLK_Div1);
        //设置高速 AHB 时钟(PCLK2)
        //RCC_HCLK_Div2  APB1 时钟  = HCLK / 2
        RCC_PCLK2Config(RCC_HCLK_Div2);
        //设置低速 AHB 时钟(PCLK1)
        //RCC_HCLK_Div2  APB1 时钟  = HCLK / 2
        RCC_PCLK1Config(RCC_HCLK_Div2);
        //设置ADC时钟频率
        RCC_ADCCLKConfig(RCC_PCLK2_Div2);
        // PLLCLK = 8MHz * 9 = 72 MHz
        //设置 PLL 时钟源及倍频系数
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
        //使能或者失能 PLL
        RCC_PLLCmd(ENABLE);
        //等待指定的 RCC 标志位设置成功 等待PLL初始化成功
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
        {
        }

        //设置系统时钟(SYSCLK) 设置PLL为系统时钟源
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
        //等待PLL成功用作于系统时钟的时钟源
        //  0x00:HSI 作为系统时钟
        //  0x04:HSE作为系统时钟
        //  0x08:PLL作为系统时钟  
        while(RCC_GetSYSCLKSource() != 0x08)
        {
        }
    }

  //  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE);
//   RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

   // RCC_ADCCLKConfig(RCC_PCLK2_Div6); //72M/6=12,ADC最大时间不能超过14M
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE ); //使能ADC1通道时钟,各个管脚时钟
   // RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);// Enable USART1 clocks
  //  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);// Enable USART1 clocks
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); // Enable TIM clocks

    //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3, ENABLE); // Enable TIM clocks
  }

void NVIC_Configuration(void)
{
  /* Enable the USART1 Interrupt */
  NVIC_InitTypeDef NVIC_InitStructure;
  #ifdef  VECT_TAB_RAM
  /* Set the Vector Table base location at 0x20000000 */
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */
  /* Set the Vector Table base location at 0x08000000 */
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);        //选择中断分组2
  //NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;//选择串口1中断
  //NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占式中断优先级设置为0
  //NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应式中断优先级设置为0
  //NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中断
  //NVIC_Init(&NVIC_InitStructure);
  //NVIC_InitStructure.NVIC_IRQChannel =TIM1_UP_IRQChannel;   //40us定时器
  //NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  
  //NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  //NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;
  //NVIC_Init(&NVIC_InitStructure);
  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQChannel;    //使能TIM3总中断 比较输出 具有最高的优先级
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  //NVIC_InitStructure.NVIC_IRQChannel =EXTI3_IRQChannel;
  //NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  //NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  //NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;
  //NVIC_Init(&NVIC_InitStructure);
}
//////////////////////////////////////////////////////////////////////////////中断的初始化
//////////////////////////////////////////////////////////////////////////////定时器的初始化
void TIM_Configuration(void)
{
  /**************************************
  定时器3,1ms基本时间单位,系统时间
  ***************************************/
  TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
/**************************************
  定时器3,10us基本时间单位,系统时间
  ***************************************/
   // TIM_BaseInitStructure.TIM_Period = 56000-1; //设置自动重装载值
//  TIM_BaseInitStructure.TIM_Prescaler = 2;  //暂不分频,下面再分频
  TIM_BaseInitStructure.TIM_Period = 999; //设置自动重装载值
  TIM_BaseInitStructure.TIM_Prescaler = 55;  //暂不分频,下面再分频
  TIM_BaseInitStructure.TIM_ClockDivision = 0; //时钟分割,无视之
  TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
  TIM_TimeBaseInit(TIM3, &TIM_BaseInitStructure);
  TIM_ITConfig(TIM3,TIM_IT_Update, ENABLE);
  TIM_Cmd(TIM3, ENABLE);
}
void GPIO_Configuration(void)
  {
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  GPIO_Init(GPIOE,&GPIO_InitStructure);  //初始化输出口
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOF,&GPIO_InitStructure);  //初始化输入口F0--F15
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  GPIO_Init(GPIOG,&GPIO_InitStructure); //初始化输入口G8--G15
  //GPIO_SetBits(GPIOE,GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);
  //GPIO_SetBits(GPIOE,GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10);
  //GPIO_ResetBits(GPIOE,GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10);
  }
void SysTick_Configuration(void)             //systick初始化函数
{   
     /* Disable SysTick Counter */
  SysTick_CounterCmd(SysTick_Counter_Disable);
  /* Disable the SysTick Interrupt */
  SysTick_ITConfig(DISABLE);
  /* Configure HCLK clock as SysTick clock source */
  SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);   //AHP时钟除以8,7M
  /* SysTick interrupt each 1000 Hz with HCLK equal to 72MHz */
  SysTick_SetReload(7000);       //设置 SysTick重装载值
  /* Enable the SysTick Interrupt */
  SysTick_ITConfig(ENABLE);   //中断使能
  SysTick_CounterCmd(SysTick_Counter_Enable);   //使能计数器
}
/*******************************************************************************
* Function Name  : SysTick_Config
* Description    : Configures SysTick
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
//SysTick设置
void SysTick_Config(void)
{
    /* Disable SysTick Counter */
    SysTick_CounterCmd(SysTick_Counter_Disable);
    /* Disable the SysTick Interrupt */
    SysTick_ITConfig(DISABLE);
    /* Configure HCLK clock as SysTick clock source */
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
    /* SysTick interrupt each 1000 Hz with HCLK equal to 72MHz */
    SysTick_SetReload(9000);
    /* Enable the SysTick Interrupt */
    SysTick_ITConfig(ENABLE);
    SysTick_CounterCmd(SysTick_Counter_Enable);
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top