[技术贴] 【M0】 MG32F02A 学习笔记⑫ 看门狗 IWDT

[复制链接]
216|3
 楼主 | 2018-10-12 15:04 | 显示全部楼层 |阅读模式
本帖最后由 noctor 于 2018-10-12 15:04 编辑
    上回我们说到了MG32F02A的ADC的使用。帖子详情:http://bbs.21ic.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就可以了
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

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

论坛热帖

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