⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 ARM_CORTEX-M3应用实例开发详解光盘
💻 C
字号:
/******************************************************************************
* 文件名             : main.c
* 功能描述           :	主程序
******************************************************************************/
/* 头文件*/
#include "stm32f10x.h"
#include "stm32f10x_MClib.h"
#include "MC_Globals.h"

void NVIC_Configuration(void);
void GPIO_Configuration(void);
void RCC_Configuration(void);

int main(void)
{

   u8 i = 0;

#ifdef DEBUG
  debug();
#endif
  NVIC_Configuration();   /*使用片内NOR FLSAH */
  GPIO_Configuration();	  /*1个LED */

  
#ifdef THREE_SHUNT  
  SVPWM_3ShuntInit();
#elif defined ICS_SENSORS
  SVPWM_IcsInit();
#elif defined SINGLE_SHUNT
/*设定使用单电阻模式,里面包含AD模块、TIM1模块、DMA模块的初始化*/ 
  SVPWM_1ShuntInit();	
#endif
  
#ifdef ENCODER
   ENC_Init();
   #ifdef OBSERVER_GAIN_TUNING
      STO_StateObserverInterface_Init();
      STO_Init();
   #endif
#elif defined HALL_SENSORS/*设定HALL传感器模式*/
   HALL_HallTimerInit();
   #ifdef OBSERVER_GAIN_TUNING
      STO_StateObserverInterface_Init();
      STO_Init();
   #endif
#elif defined NO_SPEED_SENSORS	/*设定使用无传感器模式*/ 
    STO_StateObserverInterface_Init();
    STO_Init();
   #ifdef VIEW_ENCODER_FEEDBACK
      ENC_Init();
   #elif defined VIEW_HALL_FEEDBACK
      HALL_HallTimerInit();
   #endif
#endif

#ifdef DAC_FUNCTIONALITY   
  MCDAC_Init();
#endif	  

  TB_Init();
  /*扭矩,磁通,速度PID初始化*/
  PID_Init(&PID_Torque_InitStructure, &PID_Flux_InitStructure, &PID_Speed_InitStructure);

#ifdef BRAKE_RESISTOR
    MCL_Brake_Init();/*刹车*/
#endif
  /*初始化风扇和蜂鸣器*/
    MCL_Fan_Init();
    MCL_Bell_Init();
//    MCL_Fault_Reset_Init();  
  /* 当内核停止工作时TIM1计数器时钟停止 */
  DBGMCU_Config(DBGMCU_TIM1_STOP, ENABLE);	  
  
  /*初始化母线电压及温度控制*/  
  MCL_Init_Arrays();
  
  /*TFT_LCD初始化以及测试*/ 
  LCD_Init();
  LCD_Clear(Blue2);
  LCD_SetTextColor(Blue);
  LCD_SetBackColor(White);
  Test_Color();

  TB_Wait(2000); /*延时2S*/

  AT45_INIT();  /*初始化AT45DB_FLASH汉字库接口*/

  KEYS_SEG_Init();	/*初始化键盘和数码管*/
  
  Display_Welcome_Message();   /*显示版权信息*/
    
  while(1)
  { 
    /*刷新LCD,刷新频率为0.5ms *400 = 200ms*/
    Display_LCD();	  
 	/*检测母线电压和温度*/
    MCL_ChkPowerStage();    
    /*键盘处理函数 */  
    KEYS_process();   
  
    switch (State)
    {
      case IDLE:    /*Idle state  ,按下SEL按钮,转到INIT状态*/
      break;
      
      case INIT:
	 /*初始化各个模块,最后打开AD转换中断,等待从中断里面完成系统启动*/
        MCL_Init();	
	 /*启动时间设为:500 * 2 * 0.5ms = 500ms*/
        TB_Set_StartUp_Timeout(5000);	
     /*转到START状态*/	 
        State = START; 	 
      break;
        
     /*等待系统稳定转到RUN状态,启动是由AD中断子程序完成的,*/
	 /*使用HALL时,直接转到RUN。*/
	  case START:  		 
      break;
       /*电机运行*/    
      case RUN:        
#ifdef ENCODER
        if(ENC_ErrorOnFeedback() == TRUE)
        {
          MCL_SetFault(SPEED_FEEDBACK);
        }
#elif defined HALL_SENSORS        
        if(HALL_IsTimedOut())
        {
          MCL_SetFault(SPEED_FEEDBACK);
        } 
        if (HALL_GetSpeed() == HALL_MAX_SPEED)	/*通过DPP速度计算转子速度(HZ)*/
        {
          MCL_SetFault(SPEED_FEEDBACK);
        } 
#elif defined NO_SPEED_SENSORS
      
#endif     
      break;  
      
      case STOP:    /*电机停止*/
                   
          /* PWM输出禁止 */
          TIM_CtrlPWMOutputs(TIM1, DISABLE);
          
          State = WAIT;
          
#ifdef THREE_SHUNT          
          SVPWM_3ShuntAdvCurrentReading(DISABLE);
#endif   
#ifdef SINGLE_SHUNT          
          SVPWM_1ShuntAdvCurrentReading(DISABLE);
#endif
          Stat_Volt_alfa_beta.qV_Component1 = Stat_Volt_alfa_beta.qV_Component2 = 0;
          
#ifdef ICS_SENSORS
          SVPWM_IcsCalcDutyCycles(Stat_Volt_alfa_beta);
#elif defined THREE_SHUNT
          SVPWM_3ShuntCalcDutyCycles(Stat_Volt_alfa_beta);
#endif                                                
          TB_Set_Delay_500us(1000); 
      break;
      
      case WAIT:    
          if (TB_Delay_IsElapsed() == TRUE) 
          {
#ifdef ENCODER            
            if(ENC_Get_Mechanical_Speed() ==0)             
            {              
              State = IDLE;              
            }
#elif defined HALL_SENSORS      
            if (HALL_IsTimedOut())
            {               
              State=IDLE;
            } 
#elif defined NO_SPEED_SENSORS
            STO_InitSpeedBuffer();
            State=IDLE; 
#endif            
          }
        break;
    
      case FAULT:                   
          /*如果能够复位FAULT标志,那么系统转到IDLE状态*/
		  if (MCL_ClearFault() == TRUE)	 
          {
            if(wGlobal_Flags & SPEED_CONTROL == SPEED_CONTROL)
            {
              bMenu_index = CONTROL_MODE_MENU_1;
            }
            else
            {
              bMenu_index = CONTROL_MODE_MENU_6;
            }       
#if defined NO_SPEED_SENSORS
            STO_InitSpeedBuffer();
#endif            
            State = IDLE;
            wGlobal_Flags |= FIRST_START;
          }
        break;
    
      default:        
        break;
    }
  }
}

/*******************************************************************************
* 函数名  : GPIO_Configuration
* 功能描述     : 配置GPIO引脚TIM1 Pins.
* 输入         : 无
* 输出         : 无
* 返回         : 无
*******************************************************************************/
void GPIO_Configuration(void)
{
  u8 temp = 0xff;
  GPIO_InitTypeDef GPIO_InitStructure;

  /* 使能GPIO时钟 */
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD, ENABLE);

 /*SPI1口重映射*/
  GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); 
 
  GPIO_DeInit(GPIOC);
 
  GPIO_StructInit(&GPIO_InitStructure);	  /*3个LED*/
               
  /* 配置PC10,PC11,PC12为推挽输出*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);    

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;  /*DIN4*/ 
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;/*浮空输入*/
  GPIO_Init(GPIOC, &GPIO_InitStructure);    


  GPIO_DeInit(GPIOA);
  GPIO_StructInit(&GPIO_InitStructure);	  /*1个LED*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;/*推挽输出*/
  GPIO_Init(GPIOA, &GPIO_InitStructure);    

  GPIO_DeInit(GPIOB);
  GPIO_StructInit(&GPIO_InitStructure);	  /*DIN3*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;/*浮空输入*/
  GPIO_Init(GPIOB, &GPIO_InitStructure);    

  GPIO_DeInit(GPIOD);
  GPIO_StructInit(&GPIO_InitStructure);	  /*DIN1,DIN2*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;/*浮空输入*/
  GPIO_Init(GPIOD, &GPIO_InitStructure);    

 /*关闭LCD背光 */
  GPIO_ResetBits(GPIOD, GPIO_Pin_14);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;/*推挽输出*/
  GPIO_Init(GPIOD, &GPIO_InitStructure);    


  /*输入检测第一位*/
  if((GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_8))==RESET)
        GPIO_ResetBits(GPIOA, GPIO_Pin_15);
  	else
        GPIO_SetBits(GPIOA, GPIO_Pin_15);
  /*输入检测第二位*/
  if((GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_9))==RESET)
          GPIO_ResetBits(GPIOC, GPIO_Pin_10);
	else
        GPIO_SetBits(GPIOC, GPIO_Pin_10);
  /*输入检测第三位*/
  if((GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9))==RESET)
        GPIO_ResetBits(GPIOC, GPIO_Pin_11);
	else
        GPIO_SetBits(GPIOC, GPIO_Pin_11);
  /*输入检测第四位*/
  if((GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13))==RESET)
        GPIO_ResetBits(GPIOC, GPIO_Pin_12);
	else
        GPIO_SetBits(GPIOC, GPIO_Pin_12);
 
}

/*******************************************************************************
* 函数名  : RCC_Configuration 
* 功能描述     : 配置系统和复位时钟.
* 输入         : 无
* 输出         : 无
* 返回         : 无
*******************************************************************************/
void RCC_Configuration(void)
{ 
  ErrorStatus HSEStartUpStatus;

  /* RCC system reset(for debug purpose) */
  RCC_DeInit();

  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);

  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();
  
  if(HSEStartUpStatus == SUCCESS)
  {
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1); 
  
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1); 

    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);

    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

    /* Enable PLL */ 
    RCC_PLLCmd(ENABLE);

    /* Wait till PLL is ready */
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }

    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /* Wait till PLL is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }
}

/*******************************************************************************
* 函数名  : NVIC_Configuration
* 功能描述    : 配置向量地址.
* 输入         : 无	 
* 输出         : 无
* 返回         : 无
*******************************************************************************/
void NVIC_Configuration(void)
{
#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
}

#ifdef  DEBUG
/*******************************************************************************
* 函数名  : assert_failed
* 功能描述    : Reports the name of the source file and the source line number
*                  where the assert_param error has occurred.
* 输入          : - file: pointer to the source file name
*                  - line: assert_param error line source number
* 输出         : 无	
* 返回         : 无
*******************************************************************************/
void assert_failed(u8* file, u32 line)
{ 
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
    //printf("Wrong parameters value: file %s on line %d\r\n", file, line);
  }
}
#endif

/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -