From 2d5a23268f3f228804a2db360ec8f242dc7e6290 Mon Sep 17 00:00:00 2001 From: sh-sergey Date: Fri, 27 Dec 2024 11:44:52 +0300 Subject: [PATCH] =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mik32_debug_hal/power_manager.py | 70 +++++++++++++++++--------------- 1 file changed, 38 insertions(+), 32 deletions(-) diff --git a/mik32_debug_hal/power_manager.py b/mik32_debug_hal/power_manager.py index 1a31c3f..15da639 100644 --- a/mik32_debug_hal/power_manager.py +++ b/mik32_debug_hal/power_manager.py @@ -3,15 +3,26 @@ import mik32_debug_hal.registers.memory_map as mem_map import mik32_debug_hal.registers.bitfields.power_manager as pm_fields import mik32_debug_hal.registers.bitfields.wakeup as wake_fields -def pm_init(openocd: OpenOcdTclRpc) -> int: - iter_count = 0 - max_iter_count = 2 +def pm_init(openocd: OpenOcdTclRpc) -> int: + """ Настройка тактирования + + Ключевые аргументы: + openocd - объект для доступа к интерфейсу Tcl OpenOCD + + Возвращаемое значение: + 0 - успех + 1 - ошибка + """ + + iter = 1 + max_iter = 2 # число попыток записи регистров while True: print('Clock init... ', end='') - WU_CLOCKS_default = 128 << wake_fields.CLOCKS_BU_ADJ_RC32K_S + # определение начальных значений регистров + APB_P_default = 0 AHB_default = ( pm_fields.CLOCK_AHB_CPU_M | @@ -21,40 +32,33 @@ def pm_init(openocd: OpenOcdTclRpc) -> int: pm_fields.CLOCK_AHB_TCB_M | pm_fields.CLOCK_AHB_DMA_M ) - # 0x1F + APB_M_default = ( pm_fields.CLOCK_APB_M_PM_M | pm_fields.CLOCK_APB_M_PAD_CONFIG_M | pm_fields.CLOCK_APB_M_WU_M ) - # 0x89 - # APB_P_default = pm_fields.CLOCK_APB_P_GPIO_2_M - APB_P_default = 0 - # 0x00 - # openocd.halt() - # openocd.write_word(mem_map.WU_CLOCKS_BU_OFFSET, WU_CLOCKS_default) - # openocd.write_word(mem_map.PM_Clk_APB_P_Set_OFFSET, APB_P_default) - # openocd.write_word(mem_map.PM_Clk_APB_M_Set_OFFSET, APB_M_default) - # openocd.write_word(mem_map.PM_Clk_AHB_Set_OFFSET, AHB_default) + WU_CLOCKS_default = 128 << wake_fields.CLOCKS_BU_ADJ_RC32K_S + # запись начальных значений в регистры openocd.halt() + openocd.write_word(mem_map.PM_Clk_APB_P_Clear_OFFSET, ~APB_P_default) openocd.write_word(mem_map.PM_Clk_APB_P_Set_OFFSET, APB_P_default) - # openocd.halt() + openocd.write_word(mem_map.PM_Clk_AHB_Clear_OFFSET, ~AHB_default) openocd.write_word(mem_map.PM_Clk_AHB_Set_OFFSET, AHB_default) - # openocd.halt() + openocd.write_word(mem_map.PM_Clk_APB_M_Clear_OFFSET, ~APB_M_default) openocd.write_word(mem_map.PM_Clk_APB_M_Set_OFFSET, APB_M_default) - # openocd.halt() + openocd.write_word(mem_map.WU_CLOCKS_BU_OFFSET, WU_CLOCKS_default) - # openocd.halt() - + # проверка записи на случай неожиданного ресета и перезаписи прошивкой + APB_P_real = openocd.read_word(mem_map.PM_Clk_APB_P_Set_OFFSET) AHB_real = openocd.read_word(mem_map.PM_Clk_AHB_Set_OFFSET) APB_M_real = openocd.read_word(mem_map.PM_Clk_APB_M_Set_OFFSET) - APB_P_real = openocd.read_word(mem_map.PM_Clk_APB_P_Set_OFFSET) WU_CLOCKS_real = openocd.read_word(mem_map.WU_CLOCKS_BU_OFFSET) if ( @@ -65,15 +69,17 @@ def pm_init(openocd: OpenOcdTclRpc) -> int: ): print('OK!') return 0 - else: - print('\nPM initialization results:') - print(f'wu план 0x{WU_CLOCKS_default:08x} факт 0x{WU_CLOCKS_real:08x}') - print(f'ahb план 0x{AHB_default:08x} факт 0x{AHB_real:08x}') - print(f'apb_m план 0x{APB_M_default:08x} факт 0x{APB_M_real:08x}') - print(f'apb_p план 0x{APB_P_default:08x} факт 0x{APB_P_real:08x}') - iter_count += 1 - if iter_count < max_iter_count: - print(f'ERROR: PM initialization failed, retry #{iter_count}...', flush=True) - else: - print('ERROR: PM initialization failed, aborting', flush=True) - return 1 + + print('\nPM initialization results:') + print( + f'wu def 0x{WU_CLOCKS_default:08x} real 0x{WU_CLOCKS_real:08x}') + print(f'ahb def 0x{AHB_default:08x} real 0x{AHB_real:08x}') + print(f'apb_m def 0x{APB_M_default:08x} real 0x{APB_M_real:08x}') + print(f'apb_p def 0x{APB_P_default:08x} real 0x{APB_P_real:08x}') + + iter += 1 + if iter > max_iter: + print('ERROR: PM initialization failed, aborting', flush=True) + return 1 + + print(f'ERROR: PM initialization failed, retry #{iter}...', flush=True)