• 中英航母大战谁能赢歼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 学习笔记? 看门狗 IWDT

    [复制链接]
    401|3
    跳转到指定楼层
    楼主
     楼主 | 2018-10-12 15:04 | 只看该作者 |退出气泡模式 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 noctor 于 2018-10-12 15:04 编辑
        上回我们说到了MG32F02A的ADC的使用。帖子详情://www.h77b.com/icview-2566174-1-1.html

          这次来说说看门狗吧,看门狗的使用还是比较简单的,但是我目前没有发现能够定时看门狗多久复位的功能,只能让他自由计数复位,不知道要怎么实现自定时复位,像stm和TI家的倒是可以。
          代码实现比较简单,代码放在楼下。
          这句IWDT_RefreshCounter();就是我们俗称的喂狗,不停的喂狗CPU就不会复位了。      另外在IWDT初始化的地方我注释掉了/*=== 3. Configure RST module ===*/ 那段代码,如果不注释掉,看门狗复位时系统也不会复位。


    沙发
     楼主 | 2018-10-12 15:04 | 只看该作者
    本帖最后由 noctor 于 2018-10-24 08:47 编辑


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

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

    8. #define URTX URT0

    9. void SysTick_Handler(void)
    10. {
    11.         IncTick();
    12. }

    13. void CSC_Init (void)
    14. {
    15.         CSC_PLL_TyprDef CSC_PLL_CFG;

    16.   UnProtectModuleReg(MEMprotect);             // Setting flash wait state
    17.   MEM_SetFlashWaitState(MEM_FWAIT_ONE);        // 50MHz> Sysclk >=25MHz
    18.   ProtectModuleReg(MEMprotect);

    19.   UnProtectModuleReg(CSCprotect);
    20.         CSC_CK_APB_Divider_Select(APB_DIV_1);        // Modify CK_APB divider        APB=CK_MAIN/1
    21.         CSC_CK_AHB_Divider_Select(AHB_DIV_1);        // Modify CK_AHB divider        AHB=APB/1

    22.         
    23.         /* CK_HS selection */
    24.         CSC_IHRCO_Select(IHRCO_12MHz);                        // IHRCO Sel 12MHz
    25.         CSC_IHRCO_Cmd(ENABLE);
    26.         while(CSC_GetSingleFlagStatus(CSC_IHRCOF) == DRV_Normal);
    27.         CSC_ClearFlag(CSC_IHRCOF);
    28.         CSC_CK_HS_Select(HS_CK_IHRCO);                        // CK_HS select IHRCO


    29.         /* PLL */
    30.         /**********************************************************/
    31.         CSC_PLL_CFG.InputDivider=PLLI_DIV_2;        // 12M/2=6M
    32.         CSC_PLL_CFG.Multiplication=PLLIx16;                // 6M*16=96M
    33.         CSC_PLL_CFG.OutputDivider=PLLO_DIV_2;        // PLLO=96M/2=48M
    34.         CSC_PLL_Config(&CSC_PLL_CFG);
    35.         CSC_PLL_Cmd(ENABLE);
    36.         while(CSC_GetSingleFlagStatus(CSC_PLLF) == DRV_Normal);
    37.         CSC_ClearFlag(CSC_PLLF);
    38.         /**********************************************************/

    39.         
    40.         /* CK_MAIN */
    41.         CSC_CK_MAIN_Select(MAIN_CK_HS);        


    42.         /* Configure ICKO function */
    43.                
    44.         /* Configure peripheral clock */
    45.         CSC_PeriphProcessClockSource_Config(CSC_UART0_CKS, CK_APB);
    46.         CSC_PeriphOnModeClock_Config(CSC_ON_UART0,ENABLE);
    47.         CSC_PeriphOnModeClock_Config(CSC_ON_IWDT,ENABLE);
    48.          CSC_PeriphOnModeClock_Config(CSC_ON_PortB,ENABLE);
    49.         CSC_PeriphOnModeClock_Config(CSC_ON_PortE,ENABLE);

    50.   ProtectModuleReg(CSCprotect);
    51.    
    52. }

    53. void Sample_URT0_Init(void)
    54. {
    55.     URT_BRG_TypeDef  URT_BRG;
    56.     URT_Data_TypeDef DataDef;
    57.             PIN_InitTypeDef PINX_InitStruct;
    58.     //==Set CSC init
    59.     //MG32x02z_CSC_Init.h(Configuration Wizard)
    60.     //Select CK_HS source = CK_IHRCO
    61.     //Select IHRCO = 11.0592M
    62.     //Select CK_MAIN Source = CK_HS
    63.     //Configure PLL->Select APB Prescaler = CK_MAIN/1
    64.     //Configure Peripheral On Mode Clock->Port B/URT0 = Enable
    65.     //Configure Peripheral On Mode Clock->URT0->Select URT0_PR Source = CK_APB(11.0592)
    66.    
    67.     //==Set GPIO init
    68.     //MG32x02z_GPIO_Init.h(Configuration Wizard)->Use GPIOB->Pin8/9
    69.     //GPIO port initial is 0xFFFF
    70.     //Pin8 mode is PPO/Pin9 mode is ODO
    71.     //Pin8/9 pull-up resister Enable
    72.     //Pin8/9 function URT0_TX/RX
    73.   PINX_InitStruct.PINX_Mode                                 = PINX_Mode_PushPull_O;                  // Pin select Push Pull mode
    74.         PINX_InitStruct.PINX_PUResistant                 = PINX_PUResistant_Enable;          // Enable pull up resistor
    75.         PINX_InitStruct.PINX_Speed                                   = PINX_Speed_Low;                        
    76.         PINX_InitStruct.PINX_OUTDrive                         = PINX_OUTDrive_Level0;                 // Pin output driver full strength.
    77.         PINX_InitStruct.PINX_FilterDivider                   = PINX_FilterDivider_Bypass;        // Pin input deglitch filter clock divider bypass
    78.         PINX_InitStruct.PINX_Inverse                         = PINX_Inverse_Disable;                 // Pin input data not inverse
    79.         PINX_InitStruct.PINX_Alternate_Function  = 3;                                // Pin AFS = URT0_TX
    80.         GPIO_PinMode_Config(PINB(8),&PINX_InitStruct);                                                          // TXD at PB8

    81.         PINX_InitStruct.PINX_Mode                                 = PINX_Mode_OpenDrain_O;                 // Pin select Open Drain mode
    82.         PINX_InitStruct.PINX_Alternate_Function  = 3;                                // Pin AFS = URT0_RX
    83.         GPIO_PinMode_Config(PINB(9),&PINX_InitStruct);                                                          // RXD at PB9  
    84.         
    85.         
    86.    
    87.     //=====Set Clock=====//
    88.     //---Set BaudRate---//
    89.     URT_BRG.URT_InteranlClockSource = URT_BDClock_PROC;
    90.     URT_BRG.URT_BaudRateMode = URT_BDMode_Separated;
    91.     URT_BRG.URT_PrescalerCounterReload = 0;                        //Set PSR
    92.     URT_BRG.URT_BaudRateCounterReload = 3;                        //Set RLR
    93.     URT_BaudRateGenerator_Config(URTX, &URT_BRG);                    //BR115200 = f(CK_URTx)/(PSR+1)/(RLR+1)/(OS_NUM+1)
    94.     URT_BaudRateGenerator_Cmd(URTX, ENABLE);                    //Enable BaudRateGenerator
    95.     //---TX/RX Clock---//
    96.     URT_TXClockSource_Select(URTX, URT_TXClock_Internal);        //URT_TX use BaudRateGenerator
    97.     URT_RXClockSource_Select(URTX, URT_RXClock_Internal);        //URT_RX use BaudRateGenerator
    98.     URT_TXOverSamplingSampleNumber_Select(URTX, 25);                //Set TX OS_NUM
    99.     URT_RXOverSamplingSampleNumber_Select(URTX, 25);                //Set RX OS_NUM
    100.     URT_RXOverSamplingMode_Select(URTX, URT_RXSMP_3TIME);
    101.     URT_TX_Cmd(URTX, ENABLE);                                    //Enable TX
    102.     URT_RX_Cmd(URTX, ENABLE);                                    //Enable RX
    103.    
    104.    

    105.     //=====Set Mode=====//
    106.     //---Set Data character config---//
    107.     DataDef.URT_TX_DataLength  = URT_DataLength_8;
    108.     DataDef.URT_RX_DataLength  = URT_DataLength_8;
    109.     DataDef.URT_TX_DataOrder   = URT_DataTyped_LSB;
    110.     DataDef.URT_RX_DataOrder   = URT_DataTyped_LSB;
    111.     DataDef.URT_TX_Parity      = URT_Parity_No;
    112.     DataDef.URT_RX_Parity      = URT_Parity_No;
    113.     DataDef.URT_TX_StopBits    = URT_StopBits_1_0;
    114.     DataDef.URT_RX_StopBits    = URT_StopBits_1_0;
    115.     DataDef.URT_RX_DataInverse = DISABLE;
    116.     DataDef.URT_RX_DataInverse = DISABLE;
    117.     URT_DataCharacter_Config(URTX, &DataDef);
    118.     //---Set Mode Select---//
    119.     URT_Mode_Select(URTX, URT_URT_mode);
    120.     //---Set DataLine Select---//
    121.     URT_DataLine_Select(URTX, URT_DataLine_2);
    122.    
    123.     //=====Set Error Control=====//
    124.     // to do...
    125.    
    126.     //=====Set Bus Status Detect Control=====//
    127.     // to do...
    128.    
    129.     //=====Set Data Control=====//
    130.     URT_RXShadowBufferThreshold_Select(URTX, URT_RXTH_1BYTE);
    131.     URT_IdlehandleMode_Select(URTX, URT_IDLEMode_No);
    132.     URT_TXGaudTime_Select(URTX, 0);
    133.    
    134.     //=====Enable URT Interrupt=====//
    135.     URT_IT_Cmd(URTX, URT_IT_RX, ENABLE);
    136.     URT_ITEA_Cmd(URTX, ENABLE);
    137.     NVIC_EnableIRQ(URT0_IRQn);
    138.                
    139.     //=====Enable URT=====//
    140.     URT_Cmd(URTX, ENABLE);
    141.                
    142.         //==See MG32x02z_URT0_IRQ.c when interrupt in
    143. }

    144. int fputc(int ch,FILE *f)
    145. {
    146.         
    147.         URT_SetTXData(URTX,1,ch);
    148.         while(URT_GetITSingleFlagStatus(URTX,URT_IT_TC)==DRV_UnHappened);
    149.         URT_ClearITFlag(URTX,URT_IT_TC);
    150.         
    151.         return ch;
    152. }

    153. void UartSendByte(int ch)
    154. {
    155.         
    156.         URT_SetTXData(URTX,1,ch);
    157.         while(URT_GetITSingleFlagStatus(URTX,URT_IT_TC)==DRV_UnHappened);
    158.         URT_ClearITFlag(URTX,URT_IT_TC);
    159.         
    160. }

    161. void IWDT_Init (void)
    162. {
    163.    
    164.    
    165.     //===Set CSC init====
    166.     //MG32x02z_CSC_Init.h(Configuration Wizard)
    167.     //Select CK_HS source = CK_IHRCO
    168.     //Select IHRCO = 12Mz
    169.     //Select CK_MAIN Source = CK_HS
    170.     //Configure PLL->Select APB Prescaler = CK_MAIN/1
    171.     //Configure Peripheral On Mode Clock->IWDT = Enable
    172.         
    173.                 //===Set RST init====
    174.     //MG32x02z_RST_Init.h(Configuration Wizard)
    175.                 //Select Cold/Warm Reset Source ->IWDT = Enable   //If you don't want a reset then disable it

    176. //    /*=== 1. Enable CSC to IWDT clock ===*/
    177. //    UnProtectModuleReg(CSCprotect);                                 // Unprotect CSC module
    178. //    CSC_PeriphOnModeClock_Config(CSC_ON_IWDT, ENABLE);              // Enable IWDT module clock
    179. //    ProtectModuleReg(CSCprotect);                                   // protect CSC module
    180.       
    181.     /*=== 2. Configure IWDT clock ===*/

    182.     UnProtectModuleReg(IWDTprotect);                                // Unprotect IWDT module
    183.     IWDT_Divider_Select(IWDT_DIV_256);                              // DIV output = CK_IWDT /256
    184.                
    185.                 /*=== 3. Configure RST module ===*/                              //if you don't want to reset when timeout
    186. //                UnProtectModuleReg(RSTprotect);
    187.           RST_WRstSource_Config(RST_IWDT_WE, ENABLE);                  
    188. //          ProtectModuleReg(RSTprotect);
    189.    

    190.     /*=== 3. Enable IWDT module ===*/
    191.     IWDT_Cmd(ENABLE);                                               // Enable IWDT module
    192.     ProtectModuleReg(IWDTprotect);                                // Protect IWDT module
    193.    
    194.     /*=== 4. Check flag action ===*/
    195.     while(IWDT_GetSingleFlagStatus(IWDT_EW1F) == DRV_UnHappened);   // Wait IWDT early wakeup-1 happened
    196.     IWDT_ClearFlag(IWDT_EW1F);                                      // Clear EW1F flag
    197.    
    198.     while(IWDT_GetSingleFlagStatus(IWDT_EW0F) == DRV_UnHappened);   // Wait IWDT early wakeup-0 happened
    199.     IWDT_ClearFlag(IWDT_EW0F);                                      // Clear EW0F flag
    200.                
    201.     IWDT_RefreshCounter();                                          // Clear IWDT timer
    202.    

    203. }

    204. int main()
    205. {
    206.         int i;
    207.         u16 x;
    208.         PIN_InitTypeDef PINX_InitStruct;
    209.         CSC_Init();

    210.         PINX_InitStruct.PINX_Mode                                 = PINX_Mode_PushPull_O;          // Pin select digital input mode
    211.         PINX_InitStruct.PINX_PUResistant                 = PINX_PUResistant_Enable;  // Enable pull up resistor
    212.         PINX_InitStruct.PINX_Speed                                   = PINX_Speed_Low;                        
    213.         PINX_InitStruct.PINX_OUTDrive                         = PINX_OUTDrive_Level0;         // Pin output driver full strength.
    214.         PINX_InitStruct.PINX_FilterDivider                   = PINX_FilterDivider_Bypass;// Pin input deglitch filter clock divider bypass
    215.         PINX_InitStruct.PINX_Inverse                         = PINX_Inverse_Disable;         // Pin input data not inverse
    216.         PINX_InitStruct.PINX_Alternate_Function = 0;                                                 // Pin AFS = 0
    217.   GPIO_PinMode_Config(PINE(15),&PINX_InitStruct);                                          // D6 setup at PE15
    218.         Sample_URT0_Init();
    219.         printf("hello\n");
    220.   InitTick(12000000,0);
    221.         NVIC_EnableIRQ(SYS_IRQn);
    222.   IWDT_Init();
    223.                  
    224.         while(1)
    225.         {               
    226.                                 Delay(10);
    227.                                 PE15=~PE15;
    228.                                 x=IWDT_GetCounter();
    229.                                 printf("%d\n",x);
    230.                 //                if(x==0)
    231.         //                        IWDT_RefreshCounter();              // Clear IWDT timer when count to zero to prevent system reset
    232.                
    233.                
    234.         }        
    235. }


    复制代码
    板凳
    | 2018-10-23 16:02 | 只看该作者
    这个代码 在主函数中屏蔽  IWDT_RefreshCounter();  停止喂狗了 主函数里面为什么还是在执行。系统好像没有复位。
    地板
     楼主 | 2018-10-24 08:46 | 只看该作者
    344864311 发表于 2018-10-23 16:02
    这个代码 在主函数中屏蔽  IWDT_RefreshCounter();  停止喂狗了 主函数里面为什么还是在执行。系统好像没有 ...

    是这样的,我测试非复位功能的时候好像忘记改回来了,你在初始化那边注释的:
    //          RST_WRstSource_Config(RST_IWDT_WE, DISABLE);   解除注释,并改成ENABLE就可以了
    扫描二维码,随时随地手机跟帖
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

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

    快速回复

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

    论坛热帖

    快速回复 广东快乐十分走势图 返回列表
  • 中英航母大战谁能赢歼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