• 中英航母大战谁能赢歼151枚炸弹就能炸瘫女王 2019-03-22
  • 独特“光捕捉器”可控制分子生化性质 2019-03-22
  • 女性之声——全国妇联 2019-03-19
  • 【理上网来·辉煌十九大】德国北威州经济部长:十九大报告表明中国有能力为世界做出更多贡献 2019-03-11
  • 全国小麦收获进度过八成 2019-03-07
  • 【人事】中共临汾市委组织部公示3名拟任职干部 2019-03-07
  • 这泼猴,物理。古文,哲学,基础语文,那一项没出丑?看着就想笑 2019-02-20
  • 云南理发店老板涉嫌杀害女演员因办卡纠纷起杀心 2019-02-20
  • 1至5月我区为企业和社会减负4200余万元 2019-02-09
  • 【学习时刻】参会专家盛小云:坚定文化自信,用高尚的作品引领社会风尚 2019-01-28
  • 绘就生态文明新画卷—甘南州造林绿化工作纪实 2019-01-28
  • 某些人总是用“客观事实”来为自己壮胆,实际上根本不懂什么是“客观事实。 2019-01-12
  • 圣洁的雪山文章中国国家地理网 2018-11-22
  • 崇尚英雄 精忠报国——我们家的报国故事 2018-11-22
  • 618史上最壕“买家”现身 Google以 5.5亿美元投资京东 2018-11-21
  • 打印

    广东11选五推荐: [范例教程] 【M0】 MG32F02A 学习笔记? EXIC唤醒

    [复制链接]
    429|1
    跳转到指定楼层
    楼主
     楼主 | 2018-10-19 13:57 | 只看该作者 |退出气泡模式 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 noctor 于 2018-10-19 13:57 编辑
          上回我们说到了MG32F02A的SLEEP以及STOP的使用。帖子详情://www.h77b.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. }

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

    本版积分规则

    我要发帖 投诉建议 创建版块 申请版主

    快速回复

    您需要登录后才可以回帖
    登录 | 注册
    高级模式

    论坛热帖

    快速回复 广东快乐十分走势图 返回列表
  • 中英航母大战谁能赢歼151枚炸弹就能炸瘫女王 2019-03-22
  • 独特“光捕捉器”可控制分子生化性质 2019-03-22
  • 女性之声——全国妇联 2019-03-19
  • 【理上网来·辉煌十九大】德国北威州经济部长:十九大报告表明中国有能力为世界做出更多贡献 2019-03-11
  • 全国小麦收获进度过八成 2019-03-07
  • 【人事】中共临汾市委组织部公示3名拟任职干部 2019-03-07
  • 这泼猴,物理。古文,哲学,基础语文,那一项没出丑?看着就想笑 2019-02-20
  • 云南理发店老板涉嫌杀害女演员因办卡纠纷起杀心 2019-02-20
  • 1至5月我区为企业和社会减负4200余万元 2019-02-09
  • 【学习时刻】参会专家盛小云:坚定文化自信,用高尚的作品引领社会风尚 2019-01-28
  • 绘就生态文明新画卷—甘南州造林绿化工作纪实 2019-01-28
  • 某些人总是用“客观事实”来为自己壮胆,实际上根本不懂什么是“客观事实。 2019-01-12
  • 圣洁的雪山文章中国国家地理网 2018-11-22
  • 崇尚英雄 精忠报国——我们家的报国故事 2018-11-22
  • 618史上最壕“买家”现身 Google以 5.5亿美元投资京东 2018-11-21