рефактор

This commit is contained in:
sh-sergey 2024-12-27 11:44:52 +03:00
parent c5950bfa4f
commit 2d5a23268f

View File

@ -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.power_manager as pm_fields
import mik32_debug_hal.registers.bitfields.wakeup as wake_fields import mik32_debug_hal.registers.bitfields.wakeup as wake_fields
def pm_init(openocd: OpenOcdTclRpc) -> int:
iter_count = 0 def pm_init(openocd: OpenOcdTclRpc) -> int:
max_iter_count = 2 """ Настройка тактирования
Ключевые аргументы:
openocd - объект для доступа к интерфейсу Tcl OpenOCD
Возвращаемое значение:
0 - успех
1 - ошибка
"""
iter = 1
max_iter = 2 # число попыток записи регистров
while True: while True:
print('Clock init... ', end='') print('Clock init... ', end='')
WU_CLOCKS_default = 128 << wake_fields.CLOCKS_BU_ADJ_RC32K_S # определение начальных значений регистров
APB_P_default = 0
AHB_default = ( AHB_default = (
pm_fields.CLOCK_AHB_CPU_M | 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_TCB_M |
pm_fields.CLOCK_AHB_DMA_M pm_fields.CLOCK_AHB_DMA_M
) )
# 0x1F
APB_M_default = ( APB_M_default = (
pm_fields.CLOCK_APB_M_PM_M | pm_fields.CLOCK_APB_M_PM_M |
pm_fields.CLOCK_APB_M_PAD_CONFIG_M | pm_fields.CLOCK_APB_M_PAD_CONFIG_M |
pm_fields.CLOCK_APB_M_WU_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() WU_CLOCKS_default = 128 << wake_fields.CLOCKS_BU_ADJ_RC32K_S
# 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)
# запись начальных значений в регистры
openocd.halt() 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_Clear_OFFSET, ~APB_P_default)
openocd.write_word(mem_map.PM_Clk_APB_P_Set_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_Clear_OFFSET, ~AHB_default)
openocd.write_word(mem_map.PM_Clk_AHB_Set_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_Clear_OFFSET, ~APB_M_default)
openocd.write_word(mem_map.PM_Clk_APB_M_Set_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.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) 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_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) WU_CLOCKS_real = openocd.read_word(mem_map.WU_CLOCKS_BU_OFFSET)
if ( if (
@ -65,15 +69,17 @@ def pm_init(openocd: OpenOcdTclRpc) -> int:
): ):
print('OK!') print('OK!')
return 0 return 0
else:
print('\nPM initialization results:') print('\nPM initialization results:')
print(f'wu план 0x{WU_CLOCKS_default:08x} факт 0x{WU_CLOCKS_real:08x}') print(
print(f'ahb план 0x{AHB_default:08x} факт 0x{AHB_real:08x}') f'wu def 0x{WU_CLOCKS_default:08x} real 0x{WU_CLOCKS_real:08x}')
print(f'apb_m план 0x{APB_M_default:08x} факт 0x{APB_M_real:08x}') print(f'ahb def 0x{AHB_default:08x} real 0x{AHB_real:08x}')
print(f'apb_p план 0x{APB_P_default:08x} факт 0x{APB_P_real:08x}') print(f'apb_m def 0x{APB_M_default:08x} real 0x{APB_M_real:08x}')
iter_count += 1 print(f'apb_p def 0x{APB_P_default:08x} real 0x{APB_P_real:08x}')
if iter_count < max_iter_count:
print(f'ERROR: PM initialization failed, retry #{iter_count}...', flush=True) iter += 1
else: if iter > max_iter:
print('ERROR: PM initialization failed, aborting', flush=True) print('ERROR: PM initialization failed, aborting', flush=True)
return 1 return 1
print(f'ERROR: PM initialization failed, retry #{iter}...', flush=True)