From 2f9178215dd0aedd85719915c40b8f58fd6bf2b3 Mon Sep 17 00:00:00 2001 From: stark1898y <1658608470@qq.com> Date: Fri, 16 May 2025 11:39:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- APP/peripheral_main.c | 7 +- BSP/inc/bsp_iwdg.h | 5 +- BSP/src/bsp_iwdg.c | 21 ++-- HAL/MCU.c | 13 +++ StdPeriphDriver/CH58x_sys.c | 211 ++++++++++++++++++------------------ 5 files changed, 134 insertions(+), 123 deletions(-) diff --git a/APP/peripheral_main.c b/APP/peripheral_main.c index 5fa850a..ce1f903 100644 --- a/APP/peripheral_main.c +++ b/APP/peripheral_main.c @@ -223,7 +223,7 @@ __attribute__((noinline)) void Main_Circulation() TMOS_SystemProcess(); KEY_ProcessLoop(); BSP_UART1_TxLoop(); - FEED_IWDG(); + // FEED_IWDG(); } } @@ -417,13 +417,10 @@ int main(void) LED_ALL_OFF_DEINIT; BEEP_OFF_DEINIT; - // logDebug("IWDG_Init 0"); - // IWDG_Init(1500); - BSP_NoNeedBoost(); BSP_RequestSleep(); - IWDG_Init(IWDG_MS); + IWDG_Init(IWDG_TIMEOUT_MS); // 在连接间隔和广播间隔到来时,会进入回调中喂狗 // LL_AdvertiseEventRegister(BLE_AdvertiseEventCB); diff --git a/BSP/inc/bsp_iwdg.h b/BSP/inc/bsp_iwdg.h index 89fca96..9a692ec 100644 --- a/BSP/inc/bsp_iwdg.h +++ b/BSP/inc/bsp_iwdg.h @@ -2,7 +2,7 @@ * @Author : stark1898y 1658608470@qq.com * @Date : 2024-12-15 16:13:37 * @LastEditors : stark1898y 1658608470@qq.com - * @LastEditTime : 2025-04-13 22:48:38 + * @LastEditTime : 2025-05-16 11:17:22 * @FilePath : \BLE_TYQ_CH584M\BSP\inc\bsp_iwdg.h * @Description : * @@ -31,7 +31,8 @@ #define RB_WR_PROTECT 0x40000000 // RO, write protect #define RB_IWDG_EN 0x80000000 // RO, watch-dog enable -#define IWDG_MS (6000) +#define IWDG_TIMEOUT_MS (7000U) +#define IWDG_FEED_MS (3000U) #define IWIG_FEED_EVENT (0x01 << 0) diff --git a/BSP/src/bsp_iwdg.c b/BSP/src/bsp_iwdg.c index fc464da..79cdcaa 100644 --- a/BSP/src/bsp_iwdg.c +++ b/BSP/src/bsp_iwdg.c @@ -2,7 +2,7 @@ * @Author : stark1898y 1658608470@qq.com * @Date : 2024-12-15 16:13:41 * @LastEditors : stark1898y 1658608470@qq.com - * @LastEditTime : 2025-05-15 18:34:10 + * @LastEditTime : 2025-05-16 10:55:30 * @FilePath : \BLE_TYQ_CH584M\BSP\src\bsp_iwdg.c * @Description : * @@ -30,7 +30,7 @@ uint16_t IWDG_ProcessEvent(uint8_t task_id, uint16_t events) { FEED_IWDG(); logDebug("IWDG feed"); - tmos_start_task(task_id, IWIG_FEED_EVENT, 5000); + tmos_start_task(task_id, IWIG_FEED_EVENT, MS1_TO_SYSTEM_TIME(IWDG_FEED_MS)); return (events ^ IWIG_FEED_EVENT); } return 0; @@ -46,25 +46,28 @@ uint16_t IWDG_ProcessEvent(uint8_t task_id, uint16_t events) void IWDG_Init(uint16_t ms) { uint16_t div = 512; - float tick_ms = 1000 / (32000 / 512); + // float tick_ms = 1000 / (32000 / 512); + uint8_t tick_ms = 16; uint16_t reload = (ms / tick_ms) + 1; // 解除IWDG保护 R32_IWDG_KR = 0x5555; - // R32_IWDG_CFG = (RB_PR & (div << 12)) | (RB_STOP_EN) | (reload & RB_RLR); - R32_IWDG_CFG |= (7 << 12); // 32K分频512,时钟62.5Hz - R32_IWDG_CFG &= 0xFFFFF000; - R32_IWDG_CFG |= 0x7D * 3; // 看门狗时间约256ms(0x10/(32K/512)) + R32_IWDG_CFG = (RB_PR & (div << 12)) | (RB_STOP_EN) | (reload & RB_RLR); + // R32_IWDG_CFG |= (7 << 12); // 32K分频512,时钟62.5Hz + // R32_IWDG_CFG &= 0xFFFFF000; + // // R32_IWDG_CFG |= 0x7D * 3; // 看门狗时间约6 s(0x10/(32K/512)) + // R32_IWDG_CFG |= reload; // 开启IWDG保护 R32_IWDG_KR = 0xCCCC; - logDebug("R32_IWDG_CFG = %X", R32_IWDG_CFG); + logDebug("IWDG = %d, %.1f ms", reload, (reload * 1000) / 62.5); IWDGTaskId = TMOS_ProcessEventRegister(IWDG_ProcessEvent); - tmos_set_event(IWDGTaskId, IWIG_FEED_EVENT); + // tmos_set_event(IWDGTaskId, IWIG_FEED_EVENT); + tmos_start_task(IWDGTaskId, IWIG_FEED_EVENT, MS1_TO_SYSTEM_TIME(IWDG_FEED_MS)); } // #define RB_RESET_FLAG 0x07 // RO: recent reset flag diff --git a/HAL/MCU.c b/HAL/MCU.c index 0f575a4..202f8b6 100644 --- a/HAL/MCU.c +++ b/HAL/MCU.c @@ -230,6 +230,19 @@ void HAL_Init() { halTaskID = TMOS_ProcessEventRegister(HAL_ProcessEvent); HAL_TimeInit(); + +#if 0 + // Źǿƿڲ32Kǿ״̬ûиڲRC32KĴͬ + // λʱǸڲRC32KĴ״̬ǷRC32K + // رch584ڲ32KRC + sys_safe_access_enable(); + R8_CK32K_CONFIG |= RB_CLK_INT32K_PON; + sys_safe_access_disable(); +#endif + sys_safe_access_enable(); + R8_SAFE_LRST_CTRL |= RB_IWDG_RST_EN; + sys_safe_access_disable(); + #if(defined HAL_SLEEP) && (HAL_SLEEP == TRUE) HAL_SleepInit(); #endif diff --git a/StdPeriphDriver/CH58x_sys.c b/StdPeriphDriver/CH58x_sys.c index c188141..8f382ee 100644 --- a/StdPeriphDriver/CH58x_sys.c +++ b/StdPeriphDriver/CH58x_sys.c @@ -34,28 +34,28 @@ void SetSysClock(SYS_CLKTypeDef sc) R32_SAFE_MODE_CTRL |= RB_XROM_312M_SEL; R8_SAFE_MODE_CTRL &= ~RB_SAFE_AUTO_EN; sys_safe_access_enable(); - if(sc == RB_CLK_SYS_MOD) // 32KHz + if (sc == RB_CLK_SYS_MOD) // 32KHz { R16_CLK_SYS_CFG |= RB_CLK_SYS_MOD; } else { - if(sc & RB_OSC32M_SEL) + if (sc & RB_OSC32M_SEL) { - if(!(R8_HFCK_PWR_CTRL & RB_CLK_XT32M_PON)) + if (!(R8_HFCK_PWR_CTRL & RB_CLK_XT32M_PON)) { x32M_c = R8_XT32M_TUNE; R8_XT32M_TUNE |= 0x03; R8_HFCK_PWR_CTRL |= RB_CLK_XT32M_PON; clk_sys_cfg = R16_CLK_SYS_CFG; R16_CLK_SYS_CFG |= 0xC0; - for(i=0; i<9; i++) + for (i = 0; i < 9; i++) { __nop(); } R16_CLK_SYS_CFG = clk_sys_cfg; - R8_XT32M_TUNE = x32M_c; + R8_XT32M_TUNE = x32M_c; } } else @@ -63,50 +63,50 @@ void SetSysClock(SYS_CLKTypeDef sc) R8_HFCK_PWR_CTRL |= RB_CLK_RC16M_PON; } - if(sc & RB_XROM_SCLK_SEL) // PLL div + if (sc & RB_XROM_SCLK_SEL) // PLL div { R8_HFCK_PWR_CTRL |= RB_CLK_PLL_PON; - if((sc&0x1F) == 0 ) + if ((sc & 0x1F) == 0) { - R8_FLASH_SCK = R8_FLASH_SCK|(1<<4); + R8_FLASH_SCK = R8_FLASH_SCK | (1 << 4); R8_FLASH_CFG = 0X07; } - else if((sc&0x1F) < 10) + else if ((sc & 0x1F) < 10) { - R8_FLASH_SCK = R8_FLASH_SCK & (~(1<<4)); + R8_FLASH_SCK = R8_FLASH_SCK & (~(1 << 4)); R8_FLASH_CFG = 0X01; } - else if((sc&0x1F) < 16) + else if ((sc & 0x1F) < 16) { - R8_FLASH_SCK = R8_FLASH_SCK & (~(1<<4)); + R8_FLASH_SCK = R8_FLASH_SCK & (~(1 << 4)); R8_FLASH_CFG = 0X02; } else { - R8_FLASH_SCK = R8_FLASH_SCK & (~(1<<4)); + R8_FLASH_SCK = R8_FLASH_SCK & (~(1 << 4)); R8_FLASH_CFG = 0X07; } } else { - if((sc&0x1F) < 8 ) + if ((sc & 0x1F) < 8) { - R8_FLASH_SCK = R8_FLASH_SCK & (~(1<<4)); + R8_FLASH_SCK = R8_FLASH_SCK & (~(1 << 4)); R8_FLASH_CFG = 0X51; } else { - R8_FLASH_SCK = R8_FLASH_SCK & (~(1<<4)); + R8_FLASH_SCK = R8_FLASH_SCK & (~(1 << 4)); R8_FLASH_CFG = 0X57; } } - R16_CLK_SYS_CFG = sc|0xC0; + R16_CLK_SYS_CFG = sc | 0xC0; R16_CLK_SYS_CFG = sc; - if(sc & RB_OSC32M_SEL) + if (sc & RB_OSC32M_SEL) { - if((!((R8_GLOB_CFG_INFO & RB_CFG_DEBUG_EN)|(R8_GLOB_CFG_INFO & RB_CFG_ROM_READ ))) && (R8_SAFE_DEBUG_CTRL & RB_DEBUG_DIS)) + if ((!((R8_GLOB_CFG_INFO & RB_CFG_DEBUG_EN) | (R8_GLOB_CFG_INFO & RB_CFG_ROM_READ))) && (R8_SAFE_DEBUG_CTRL & RB_DEBUG_DIS)) { R8_HFCK_PWR_CTRL &= ~RB_CLK_RC16M_PON; } @@ -115,7 +115,6 @@ void SetSysClock(SYS_CLKTypeDef sc) { R8_HFCK_PWR_CTRL &= ~RB_CLK_XT32M_PON; } - } R8_SAFE_MODE_CTRL |= RB_SAFE_AUTO_EN; sys_safe_access_disable(); @@ -130,19 +129,18 @@ void SetSysClock(SYS_CLKTypeDef sc) * * @return none */ -__attribute__((section(".highcode_init"))) -void highcode_init(void) +__attribute__((section(".highcode_init"))) void highcode_init(void) { R32_SAFE_MODE_CTRL |= RB_XROM_312M_SEL; R8_SAFE_MODE_CTRL &= ~RB_SAFE_AUTO_EN; sys_safe_access_enable(); - R32_MISC_CTRL |= 5|(3<<25); // - R8_PLL_CONFIG &= ~(1 << 5); // + R32_MISC_CTRL |= 5 | (3 << 25); // + R8_PLL_CONFIG &= ~(1 << 5); // R8_HFCK_PWR_CTRL |= RB_CLK_RC16M_PON | RB_CLK_PLL_PON; R16_CLK_SYS_CFG = CLK_SOURCE_HSI_PLL_62_4MHz; - R8_FLASH_SCK = R8_FLASH_SCK & (~(1<<4)); - R8_FLASH_CFG = 0X02; - R8_XT32M_TUNE = (R8_XT32M_TUNE&(~0x03))|0x01; + R8_FLASH_SCK = R8_FLASH_SCK & (~(1 << 4)); + R8_FLASH_CFG = 0X02; + R8_XT32M_TUNE = (R8_XT32M_TUNE & (~0x03)) | 0x01; R8_CK32K_CONFIG |= RB_CLK_INT32K_PON; R8_SAFE_MODE_CTRL |= RB_SAFE_AUTO_EN; sys_safe_access_disable(); @@ -161,7 +159,7 @@ __HIGH_CODE __INTERRUPT void MachineMode_Call_IRQ(void) { - if(gs_machine_mode_func != NULL) + if (gs_machine_mode_func != NULL) { gs_machine_mode_func(); gs_machine_mode_func = NULL; @@ -185,25 +183,25 @@ void MachineMode_Call(MachineMode_Call_func func) uint32_t irqv; /* رж */ - irqv = (PFIC->ISR[0] >> 8) | (PFIC->ISR[1] << 24); + irqv = (PFIC->ISR[0] >> 8) | (PFIC->ISR[1] << 24); PFIC->IRER[0] = 0xffffffff; PFIC->IRER[1] = 0xffffffff; /* ûʹSWжϵжϣҪȡ˺ע */ -// for(i = 0; i < 4; i++) -// { -// if(PFIC->VTFIDR[i] == SWI_IRQn) -// { -// /* ҵûԼʹõSWжϣر */ -// sw_vtf = PFIC->VTFADDR[i]; -// PFIC->VTFADDR[i] = (sw_vtf & 0xFFFFFFFE); -// break; -// } -// } + // for(i = 0; i < 4; i++) + // { + // if(PFIC->VTFIDR[i] == SWI_IRQn) + // { + // /* ҵûԼʹõSWжϣر */ + // sw_vtf = PFIC->VTFADDR[i]; + // PFIC->VTFADDR[i] = (sw_vtf & 0xFFFFFFFE); + // break; + // } + // } - sw_irqtable = _vector_base[SWI_IRQn]; + sw_irqtable = _vector_base[SWI_IRQn]; _vector_base[SWI_IRQn] = (uint32_t)MachineMode_Call_IRQ; - gs_machine_mode_func = func; + gs_machine_mode_func = func; /* ֻSWI_IRQn */ PFIC_EnableIRQ(SWI_IRQn); @@ -211,17 +209,17 @@ void MachineMode_Call(MachineMode_Call_func func) PFIC_SetPendingIRQ(SWI_IRQn); /* ȴ */ - while(gs_machine_mode_func != NULL); + while (gs_machine_mode_func != NULL); PFIC_DisableIRQ(SWI_IRQn); _vector_base[SWI_IRQn] = sw_irqtable; -// if(i != 4) -// { -// /* ָԭSWж */ -// PFIC->VTFADDR[i] = sw_vtf; -// } + // if(i != 4) + // { + // /* ָԭSWж */ + // PFIC->VTFADDR[i] = sw_vtf; + // } /* ָԭжʹ */ PFIC->IENR[0] = (irqv << 8); @@ -236,7 +234,8 @@ void MachineMode_Call(MachineMode_Call_func func) * @param none * * @return none - */void SetPI_func() + */ +void SetPI_func() { write_csr(0xbc0, 0x25); } @@ -266,22 +265,22 @@ void SYS_EnablePI() */ uint32_t GetSysClock(void) { - if((R16_CLK_SYS_CFG & RB_CLK_SYS_MOD) == RB_CLK_SYS_MOD) + if ((R16_CLK_SYS_CFG & RB_CLK_SYS_MOD) == RB_CLK_SYS_MOD) { // 32KƵ return (CAB_LSIFQ); } - else if(R16_CLK_SYS_CFG & RB_XROM_SCLK_SEL) + else if (R16_CLK_SYS_CFG & RB_XROM_SCLK_SEL) { - if(!(R16_CLK_SYS_CFG & 0x1f)) + if (!(R16_CLK_SYS_CFG & 0x1f)) { - return ((R16_CLK_SYS_CFG & RB_OSC32M_SEL)?32000000:16000000); + return ((R16_CLK_SYS_CFG & RB_OSC32M_SEL) ? 32000000 : 16000000); } else - { // PLLзƵ + { // PLLзƵ return (312000000 / (R16_CLK_SYS_CFG & 0x1f)); } } - else if(R16_CLK_SYS_CFG & RB_OSC32M_SEL) + else if (R16_CLK_SYS_CFG & RB_OSC32M_SEL) { // 32MзƵ return (32000000 / (R16_CLK_SYS_CFG & 0x1f)); } @@ -302,7 +301,7 @@ uint32_t GetSysClock(void) */ uint8_t SYS_GetInfoSta(SYS_InfoStaTypeDef i) { - if(i == STA_SAFEACC_ACT) + if (i == STA_SAFEACC_ACT) { return (R8_SAFE_ACCESS_SIG & RB_SAFE_ACC_ACT); } @@ -342,7 +341,7 @@ void SYS_ResetExecute(void) __HIGH_CODE void SYS_DisableAllIrq(uint32_t *pirqv) { - *pirqv = (PFIC->ISR[0] >> 8) | (PFIC->ISR[1] << 24); + *pirqv = (PFIC->ISR[0] >> 8) | (PFIC->ISR[1] << 24); PFIC->IRER[0] = 0xffffffff; PFIC->IRER[1] = 0xffffffff; asm volatile("fence.i"); @@ -391,7 +390,7 @@ void WWDG_ITCfg(FunctionalState s) { uint8_t ctrl = R8_RST_WDOG_CTRL; - if(s == DISABLE) + if (s == DISABLE) { ctrl &= ~RB_WDOG_INT_EN; } @@ -418,7 +417,7 @@ void WWDG_ResetCfg(FunctionalState s) { uint8_t ctrl = R8_RST_WDOG_CTRL; - if(s == DISABLE) + if (s == DISABLE) { ctrl &= ~RB_WDOG_RST_EN; } @@ -459,19 +458,18 @@ void WWDG_ClearFlag(void) */ __INTERRUPT __HIGH_CODE -__attribute__((weak)) -void HardFault_Handler(void) +__attribute__((weak)) void HardFault_Handler(void) { - uint32_t v_mepc,v_mcause,v_mtval; + uint32_t v_mepc, v_mcause, v_mtval; printf("hardfault\n"); - v_mepc=__get_MEPC(); - v_mcause=__get_MCAUSE(); - v_mtval=__get_MTVAL(); + v_mepc = __get_MEPC(); + v_mcause = __get_MCAUSE(); + v_mtval = __get_MTVAL(); - printf("mepc:%08x\n",v_mepc); - printf("mcause:%08x\n",v_mcause); - printf("mtval:%08x\n",v_mtval); + printf("mepc:%08x\n", v_mepc); + printf("mcause:%08x\n", v_mcause); + printf("mtval:%08x\n", v_mtval); FLASH_ROM_SW_RESET(); sys_safe_access_enable(); @@ -480,7 +478,7 @@ void HardFault_Handler(void) sys_safe_access_enable(); R8_RST_WDOG_CTRL |= RB_SOFTWARE_RESET; sys_safe_access_disable(); - while(1); + while (1); } /********************************************************************* @@ -496,42 +494,42 @@ __HIGH_CODE void mDelayuS(uint16_t t) { uint32_t i; -#if(FREQ_SYS == 78000000) +#if (FREQ_SYS == 78000000) i = t * 13; -#elif(FREQ_SYS == 62400000) +#elif (FREQ_SYS == 62400000) i = ((uint32_t)t * 78) / 5; -#elif(FREQ_SYS == 52000000) +#elif (FREQ_SYS == 52000000) i = t * 13; -#elif(FREQ_SYS == 39000000) - i = (t * 13)>>1; -#elif(FREQ_SYS == 26000000) - i = (t * 13)>>1; -#elif(FREQ_SYS == 24000000) +#elif (FREQ_SYS == 39000000) + i = (t * 13) >> 1; +#elif (FREQ_SYS == 26000000) + i = (t * 13) >> 1; +#elif (FREQ_SYS == 24000000) i = t * 6; -#elif(FREQ_SYS == 19500000) - i = (t * 13)>>2; -#elif(FREQ_SYS == 32000000) +#elif (FREQ_SYS == 19500000) + i = (t * 13) >> 2; +#elif (FREQ_SYS == 32000000) i = t << 3; -#elif(FREQ_SYS == 16000000) +#elif (FREQ_SYS == 16000000) i = t << 2; -#elif(FREQ_SYS == 13000000) - i = (t * 13)>>2; -#elif(FREQ_SYS == 8000000) +#elif (FREQ_SYS == 13000000) + i = (t * 13) >> 2; +#elif (FREQ_SYS == 8000000) i = t << 1; -#elif(FREQ_SYS == 4000000) +#elif (FREQ_SYS == 4000000) i = t; -#elif(FREQ_SYS == 2000000) +#elif (FREQ_SYS == 2000000) i = t >> 1; -#elif(FREQ_SYS == 1000000) +#elif (FREQ_SYS == 1000000) i = t >> 2; #else i = t; #endif -#if((FREQ_SYS == 78000000)||\ - (FREQ_SYS == 39000000)||\ - (FREQ_SYS == 19500000)) - while(--i) +#if ((FREQ_SYS == 78000000) || \ + (FREQ_SYS == 39000000) || \ + (FREQ_SYS == 19500000)) + while (--i) { __nop(); }; @@ -539,7 +537,7 @@ void mDelayuS(uint16_t t) do { __nop(); - }while(--i); + } while (--i); #endif } @@ -558,27 +556,27 @@ void mDelaymS(uint16_t t) do { mDelayuS(1000); - }while(--t); + } while (--t); } #ifdef DEBUG int _write(int fd, char *buf, int size) { int i; - for(i = 0; i < size; i++) + for (i = 0; i < size; i++) { #if DEBUG == Debug_UART0 - while(R8_UART0_TFC == UART_FIFO_SIZE); /* ȴݷ */ - R8_UART0_THR = *buf++; /* */ + while (R8_UART0_TFC == UART_FIFO_SIZE); /* ȴݷ */ + R8_UART0_THR = *buf++; /* */ #elif DEBUG == Debug_UART1 - while(R8_UART1_TFC == UART_FIFO_SIZE); /* ȴݷ */ - R8_UART1_THR = *buf++; /* */ + while (R8_UART1_TFC == UART_FIFO_SIZE); /* ȴݷ */ + R8_UART1_THR = *buf++; /* */ #elif DEBUG == Debug_UART2 - while(R8_UART2_TFC == UART_FIFO_SIZE); /* ȴݷ */ - R8_UART2_THR = *buf++; /* */ + while (R8_UART2_TFC == UART_FIFO_SIZE); /* ȴݷ */ + R8_UART2_THR = *buf++; /* */ #elif DEBUG == Debug_UART3 - while(R8_UART3_TFC == UART_FIFO_SIZE); /* ȴݷ */ - R8_UART3_THR = *buf++; /* */ + while (R8_UART3_TFC == UART_FIFO_SIZE); /* ȴݷ */ + R8_UART3_THR = *buf++; /* */ #endif } return size; @@ -593,14 +591,13 @@ int _write(int fd, char *buf, int size) * * @return size: Data length */ -__attribute__((used)) -void *_sbrk(ptrdiff_t incr) +__attribute__((used)) void *_sbrk(ptrdiff_t incr) { extern char _end[]; static char *curbrk = _end; if ((curbrk + incr < _end) || ((uint32_t)curbrk + incr > (__get_SP() - 64))) - return NULL - 1; + return NULL - 1; curbrk += incr; return curbrk - incr; @@ -616,7 +613,7 @@ void *_sbrk(ptrdiff_t incr) __HIGH_CODE void *__wrap_memcpy(void *dst, void *src, size_t size) { - __MCPY(dst, src, (void *)((uint32_t)src+size)); + __MCPY(dst, src, (void *)((uint32_t)src + size)); return dst; } @@ -661,7 +658,7 @@ void IWDG_RLR_Set(uint16_t rlr) { uint32_t cfg; - cfg = R32_IWDG_CFG; - cfg = (R32_IWDG_CFG & ~0xFFF) | (rlr & 0xFFF); + cfg = R32_IWDG_CFG; + cfg = (R32_IWDG_CFG & ~0xFFF) | (rlr & 0xFFF); R32_IWDG_CFG = cfg; }