[技术贴] 【M0】 MG32F02A 学习笔记⑭ EXIC唤醒

[复制链接]
154|1
 楼主 | 2018-10-19 13:57 | 显示全部楼层 |阅读模式
本帖最后由 noctor 于 2018-10-19 13:57 编辑
      上回我们说到了MG32F02A的SLEEP以及STOP的使用。帖子详情:http://bbs.21ic.com/icview-2570532-1-1.html

       但是上次没有讲怎么唤醒,哈哈,那这次来讲讲唤醒的方法吧,首先,我们要了解,我们进入的SLEEP以及STOP,支持什么方式唤醒呢?
      
      这图够直观了吧,SLEEP可以被所有的中断或者唤醒事件唤醒,而STOP模式只支持BOD/CMP/RTC/EXIC/IIC唤醒,那么,我就直接讲从STOP下唤醒吧,毕竟只要能从STOP唤醒,SLEEP自然不在话下。
      那么,这次先讲EXIC的方式唤醒吧。
      所谓EXIC,就是外部中断,简单来讲的话就像键盘中断,只要引脚来个低电平,EXIC就会被触发,而MG32F02A内置的终端控制器会在STOP模式下自动发送一个系统事件给CPU,从而唤醒CPU。
      代码放在二楼。      你们实验的时候可能会发现:明明STOP模式只支持检测LEVEL唤醒,为什么我EXIC_TRGS.EXIC_TRGS_Mode = Edge;  也能唤醒呢?是不是进的是SLEEP而根本不是STOP呢?

      硬件会强行修改为level模式进行检测,还挺人性化哈。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主 | 2018-10-19 13:57 | 显示全部楼层
附上代码,烧入代码后,PE15闪烁5次后进入STOP模式,然后只需要将PA2“或”PA3,或者PA0“和”PA1接地即可触发中断,并唤醒CPU:



  1. #include "MG32x02z_DRV.H"
  2. #include "MG32x02z_ADC_DRV.h"
  3. #include "MG32x02z_PW_DRV.h"
  4. #include <stdio.h>

  5. typedef uint8_t u8;
  6. typedef uint16_t u16;
  7. typedef uint32_t u32;
  8. typedef uint64_t u64;


  9. void PWR_Init()
  10. {
  11.         UnProtectModuleReg(PWprotect);
  12.         PW_IT_Config(PW_INT_WK , ENABLE);
  13.         PW_ITEA_Cmd(ENABLE);
  14.         ProtectModuleReg(PWprotect);
  15. }

  16. void CSC_Init (void)
  17. {
  18.         CSC_PLL_TyprDef CSC_PLL_CFG;
  19.    
  20.        
  21.     UnProtectModuleReg(MEMprotect);             // Setting flash wait state
  22.     MEM_SetFlashWaitState(MEM_FWAIT_ONE);        // 50MHz> Sysclk >=25MHz
  23.     ProtectModuleReg(MEMprotect);

  24.   UnProtectModuleReg(CSCprotect);
  25.         CSC_CK_APB_Divider_Select(APB_DIV_1);        // Modify CK_APB divider        APB=CK_MAIN/1
  26.         CSC_CK_AHB_Divider_Select(AHB_DIV_1);        // Modify CK_AHB divider        AHB=APB/1

  27.        
  28.         /* CK_HS selection */
  29.         CSC_IHRCO_Select(IHRCO_12MHz);                        // IHRCO Sel 12MHz
  30.         CSC_IHRCO_Cmd(ENABLE);
  31.         while(CSC_GetSingleFlagStatus(CSC_IHRCOF) == DRV_Normal);
  32.         CSC_ClearFlag(CSC_IHRCOF);
  33.         CSC_CK_HS_Select(HS_CK_IHRCO);                        // CK_HS select IHRCO


  34.         /* PLL */
  35.         /**********************************************************/
  36.         CSC_PLL_CFG.InputDivider=PLLI_DIV_2;        // 12M/2=6M
  37.         CSC_PLL_CFG.Multiplication=PLLIx16;                // 6M*16=96M
  38.         CSC_PLL_CFG.OutputDivider=PLLO_DIV_2;        // PLLO=96M/2=48M
  39.         CSC_PLL_Config(&CSC_PLL_CFG);
  40.         CSC_PLL_Cmd(ENABLE);
  41.         while(CSC_GetSingleFlagStatus(CSC_PLLF) == DRV_Normal);
  42.         CSC_ClearFlag(CSC_PLLF);
  43.         /**********************************************************/

  44.        
  45.         /* CK_MAIN */
  46.         CSC_CK_MAIN_Select(MAIN_CK_HS);       


  47.         /* Configure ICKO function */
  48.                
  49.         /* Configure peripheral clock */
  50.         CSC_PeriphOnModeClock_Config(CSC_ON_PortA,ENABLE);
  51.         CSC_PeriphOnModeClock_Config(CSC_ON_PortE,ENABLE);

  52.   ProtectModuleReg(CSCprotect);
  53.    
  54. }

  55. void EXIC_Init(void)
  56. {
  57.     PIN_InitTypeDef  PINX_InitStruct;
  58.     EXIC_TRGSTypeDef EXIC_TRGS;
  59.    
  60.     //===Set CSC init====
  61.     //MG32x02z_CSC_Init.h(Configuration Wizard)
  62.     //Select CK_HS source = CK_IHRCO
  63.     //Select IHRCO = 11.0592M
  64.     //Select CK_MAIN Source = CK_HS
  65.     //Configure PLL->Select APB Prescaler = CK_MAIN/1
  66.     //Configure Peripheral On Mode Clock->Port A = Enable if EXIC Port is PortA
  67.    
  68.    
  69.     //====GPIO Initial====
  70.     PINX_InitStruct.PINX_Pin                = PX_Pin_All;                     // Select Pin of the port to initial (PX_Pin_All is all pin of the port.)
  71.     PINX_InitStruct.PINX_Mode                                                                = PINX_Mode_OpenDrain_O;          // Select GPIO mode
  72.                                                                               //     1.QB: Quasi-Bidirection mode only for PC )
  73.     PINX_InitStruct.PINX_PUResistant        = PINX_PUResistant_Enable;        // Select wether enable internal pull-up R or not.
  74.     PINX_InitStruct.PINX_Speed              = PINX_Speed_Low;                 // Select wehter enable high speed mode
  75.                                                                               //     1.(PINX_Speed_High mode only for PC0~3 , PD0~3 )   
  76.     PINX_InitStruct.PINX_OUTDrive           = PINX_OUTDrive_Level0;           // Select output drive strength
  77.                                                                               //     1.(Level 0 & level 3 only for PE0~PE3)
  78.     PINX_InitStruct.PINX_FilterDivider      = PINX_FilterDivider_Bypass;      // Select input filter divider.
  79.     PINX_InitStruct.PINX_Inverse            = PINX_Inverse_Disable;           // Select input signal whether inverse or not.
  80.                                                                               //     1.PINX_Inverse_Disable = L level or falling edge.
  81.                                                                               //     2.PINX_Inverse_Enable  = H level or Rising edge.
  82.     PINX_InitStruct.PINX_Alternate_Function = 0;                              // Select GPIO mode
  83.     GPIO_PortMode_Config(IOMA,&PINX_InitStruct);                              // (Pin0 & Pin1) of PorA configuration
  84.                 GPIO_WritePort(GPIOA,0xFFFF);                                                                                                                                                                                 // Initial PortA
  85.    
  86.     //====EXIC Initial====
  87. //   EXIC_TRGS.EXIC_Pin = EXIC_TRGS_ALL;                                       // The pin trigger mode select.
  88.     EXIC_TRGS.EXIC_Pin =EXIC_TRGS_PIN0 | EXIC_TRGS_PIN1 | EXIC_TRGS_PIN2 | EXIC_TRGS_PIN3;  //     1. You can selec any pin of the port.
  89.     EXIC_TRGS.EXIC_TRGS_Mode = Level;                                          // External interrupt pin edge/level trigger event select.
  90.     EXIC_PxTriggerMode_Select(EXIC_PA,&EXIC_TRGS);                            // EXIC trigger mode configuration.
  91.    
  92.     EXIC_PxTriggerAndMask_Select(EXIC_PA , 0x0003);                           // EXIC_PA  AF trigger event select.
  93.                                                                               //     1. Select PA_AF trigger pin(PA0, PA1).
  94.                                                                               //     2. PA_AF is set if trigger event of select pin have to happen at same time(PA0 & PA1).  
  95.     EXIC_PxTriggerOrMask_Select(EXIC_PA  , 0x000C);                           // EXIC_PA  OF trigger event select.
  96.                                                                               //     1. Select PA_OF trigger pin(PA2, PA3).
  97.                                                                               //     2. PA_OF is set if anyone trigger event of select pin happen(PA2 | PA3).   
  98.     EXIC_ClearPxTriggerEventFlag(EXIC_PA, EXIC_PX_AllPIN );                   // Clear All pin of the port event flag.   
  99.    
  100.     EXIC_PxTriggerITEA_Cmd(EXIC_PA_IT , ENABLE);                              // Enable EXIC interrupt
  101.     NVIC_EnableIRQ(EXINT0_IRQn);                                              //
  102.    
  103.     //===Interrupt handle====
  104.     //Please refer to MG32x02z_EXIC_IRQ.c

  105. }

  106. void EXINT0_IRQHandler(void)
  107. {

  108.          PE14=~PE14;
  109.          EXIC_ClearPxTriggerEventFlag(EXIC_PA, EXIC_PX_AllPIN );
  110.    EXIC_ClearPxTriggerITFlag(EXIC_PA_ITF,EXIC_PX_OF);
  111. }

  112. int main()
  113. {
  114.         int i,j;
  115.         double x,y;
  116.         PIN_InitTypeDef PINX_InitStruct;
  117.         CSC_Init();
  118.         EXIC_Init();
  119.         PINX_InitStruct.PINX_Mode                                 = PINX_Mode_PushPull_O;          // Pin select digital input mode
  120.         PINX_InitStruct.PINX_PUResistant                 = PINX_PUResistant_Enable;  // Enable pull up resistor
  121.         PINX_InitStruct.PINX_Speed                                   = PINX_Speed_Low;                         
  122.         PINX_InitStruct.PINX_OUTDrive                         = PINX_OUTDrive_Level0;         // Pin output driver full strength.
  123.         PINX_InitStruct.PINX_FilterDivider                   = PINX_FilterDivider_Bypass;// Pin input deglitch filter clock divider bypass
  124.         PINX_InitStruct.PINX_Inverse                         = PINX_Inverse_Disable;         // Pin input data not inverse
  125.         PINX_InitStruct.PINX_Alternate_Function = 0;                                                 // Pin AFS = 0
  126.         GPIO_PinMode_Config(PINE(14),&PINX_InitStruct);                                          // D6 setup at PE15
  127.   GPIO_PinMode_Config(PINE(15),&PINX_InitStruct);                                          // D6 setup at PE15
  128.         i=0;
  129.         j=0;
  130.         while(1)
  131.         {
  132.                 i++;
  133.                 if(i>=500000){
  134.                         i=0;
  135.                         PE15=~PE15;
  136.                         j++;
  137.                         if(j>10)
  138.                         {
  139.                           PE15=1;                               
  140.                                 SCB->SCR  = (SCB_SCR_SLEEPDEEP_Msk);  //into stop
  141.                                 __WFI();             //This is the command of cmsis_arm.cc.  __WFI();is wait for interrupt while __WFE();is wait for event();
  142.                                 j=0;
  143.                         }         
  144.                 }
  145.         }
  146. }

复制代码
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

快速回复 返回顶部 返回列表