init:全链路闭环控制调通

This commit is contained in:
SkyLi
2026-06-06 21:26:08 +08:00
parent b5be64b642
commit f28d129e11
32 changed files with 5120 additions and 181 deletions
+54 -122
View File
@@ -40,6 +40,8 @@
#include "ti_msp_dl_config.h"
DL_TimerG_backupConfig gQEI_0Backup;
/*
* ======== SYSCFG_DL_init ========
* Perform any initialization needed before using any board APIs
@@ -50,19 +52,47 @@ SYSCONFIG_WEAK void SYSCFG_DL_init(void)
SYSCFG_DL_GPIO_init();
/* Module-Specific Initializations*/
SYSCFG_DL_SYSCTL_init();
SYSCFG_DL_QEI_0_init();
SYSCFG_DL_VREF_init();
SYSCFG_DL_SYSTICK_init();
/* Ensure backup structures have no valid state */
gQEI_0Backup.backupRdy = false;
}
/*
* User should take care to save and restore register configuration in application.
* See Retention Configuration section for more details.
*/
SYSCONFIG_WEAK bool SYSCFG_DL_saveConfiguration(void)
{
bool retStatus = true;
retStatus &= DL_TimerG_saveConfiguration(QEI_0_INST, &gQEI_0Backup);
return retStatus;
}
SYSCONFIG_WEAK bool SYSCFG_DL_restoreConfiguration(void)
{
bool retStatus = true;
retStatus &= DL_TimerG_restoreConfiguration(QEI_0_INST, &gQEI_0Backup, false);
return retStatus;
}
SYSCONFIG_WEAK void SYSCFG_DL_initPower(void)
{
DL_GPIO_reset(GPIOA);
DL_GPIO_reset(GPIOB);
DL_TimerG_reset(QEI_0_INST);
DL_VREF_reset(VREF);
DL_GPIO_enablePower(GPIOA);
DL_GPIO_enablePower(GPIOB);
DL_TimerG_enablePower(QEI_0_INST);
DL_VREF_enablePower(VREF);
delay_cycles(POWER_STARTUP_DELAY);
@@ -76,6 +106,9 @@ SYSCONFIG_WEAK void SYSCFG_DL_GPIO_init(void)
DL_GPIO_initPeripheralAnalogFunction(GPIO_LFXIN_IOMUX);
DL_GPIO_initPeripheralAnalogFunction(GPIO_LFXOUT_IOMUX);
DL_GPIO_initPeripheralInputFunction(GPIO_QEI_0_PHA_IOMUX,GPIO_QEI_0_PHA_IOMUX_FUNC);
DL_GPIO_initPeripheralInputFunction(GPIO_QEI_0_PHB_IOMUX,GPIO_QEI_0_PHB_IOMUX_FUNC);
DL_GPIO_initDigitalOutputFeatures(LED_A14_PIN_14_IOMUX,
DL_GPIO_INVERSION_DISABLE, DL_GPIO_RESISTOR_PULL_DOWN,
DL_GPIO_DRIVE_STRENGTH_LOW, DL_GPIO_HIZ_DISABLE);
@@ -111,128 +144,6 @@ static const DL_SYSCTL_LFCLKConfig gLFCLKConfig = {
.monitor = false,
.xt1Drive = DL_SYSCTL_LFXT_DRIVE_STRENGTH_HIGHEST,
};
///////////////////////////////////////////////////////////////
void DL_SYSCTL_setHFCLKSourceHFXTParams (DL_SYSCTL_HFXT_RANGE range, uint32_t startupTime, bool monitorEnable)
{
uint32_t register_temp = SYSCTL->SOCLOCK.HFCLKCLKCFG;
register_temp &= ~(SYSCTL_HFCLKCLKCFG_HFXTRSEL_MASK | SYSCTL_HFCLKCLKCFG_HFCLKFLTCHK_MASK);
switch(range)
{
case DL_SYSCTL_HFXT_RANGE_4_8_MHZ : register_temp |= (SYSCTL_HFCLKCLKCFG_HFXTRSEL_RANGE4TO8); break;
case DL_SYSCTL_HFXT_RANGE_8_16_MHZ : register_temp |= (SYSCTL_HFCLKCLKCFG_HFXTRSEL_RANGE8TO16); break;
case DL_SYSCTL_HFXT_RANGE_16_32_MHZ: register_temp |= (SYSCTL_HFCLKCLKCFG_HFXTRSEL_RANGE16TO32); break;
case DL_SYSCTL_HFXT_RANGE_32_48_MHZ: register_temp |= (SYSCTL_HFCLKCLKCFG_HFXTRSEL_RANGE32TO48); break;
}
register_temp |= (monitorEnable) ? (SYSCTL_HFCLKCLKCFG_HFCLKFLTCHK_ENABLE) : (SYSCTL_HFCLKCLKCFG_HFCLKFLTCHK_DISABLE);
SYSCTL->SOCLOCK.HFCLKCLKCFG = register_temp;
SYSCTL->SOCLOCK.HSCLKEN |= SYSCTL_HSCLKEN_HFXTEN_ENABLE; // 必须启动 否则频率不准
SYSCTL->SOCLOCK.HSCLKEN = SYSCTL_HSCLKEN_SYSPLLEN_ENABLE | SYSCTL_HSCLKEN_USEEXTHFCLK_ENABLE;
SYSCTL->SOCLOCK.HSCLKEN |= SYSCTL_HSCLKCFG_HSCLKSEL_HFCLKCLK;
}
void DL_SYSCTL_configSYSPLL (const DL_SYSCTL_SYSPLLConfig *config)
{
uint32_t register_temp = 0;
SYSCTL->SOCLOCK.HSCLKEN &= ~(SYSCTL_HSCLKEN_SYSPLLEN_MASK);
{
register_temp = SYSCTL->SOCLOCK.SYSPLLCFG0;
register_temp &= ~(SYSCTL_SYSPLLCFG0_SYSPLLREF_MASK | SYSCTL_SYSPLLCFG0_MCLK2XVCO_MASK
| SYSCTL_SYSPLLCFG0_ENABLECLK0_MASK | SYSCTL_SYSPLLCFG0_ENABLECLK1_MASK | SYSCTL_SYSPLLCFG0_ENABLECLK2X_MASK
| SYSCTL_SYSPLLCFG0_RDIVCLK0_MASK | SYSCTL_SYSPLLCFG0_RDIVCLK1_MASK | SYSCTL_SYSPLLCFG0_RDIVCLK2X_MASK );
register_temp |= config->rDivClk2x ;
register_temp |= config->rDivClk1 ;
register_temp |= config->rDivClk0 ;
register_temp |= config->enableCLK2x ;
register_temp |= config->enableCLK1 ;
register_temp |= config->enableCLK0 ;
register_temp |= config->sysPLLMCLK ;
register_temp |= config->sysPLLRef ;
SYSCTL->SOCLOCK.SYSPLLCFG0 = register_temp;
}
{
register_temp = SYSCTL->SOCLOCK.SYSPLLCFG1;
register_temp &= ~(SYSCTL_SYSPLLCFG1_PDIV_MASK | SYSCTL_SYSPLLCFG1_QDIV_MASK);
register_temp |= (config->qDiv << SYSCTL_SYSPLLCFG1_QDIV_OFS );
register_temp |= (config->pDiv);
SYSCTL->SOCLOCK.SYSPLLCFG1 = register_temp;
}
{
SYSCTL->SOCLOCK.SYSPLLPARAM0 =
*(volatile uint32_t *) ((uint32_t) config->inputFreq);
SYSCTL->SOCLOCK.SYSPLLPARAM1 =
*(volatile uint32_t *) ((uint32_t) config->inputFreq + (uint32_t) 0x4);
}
SYSCTL->SOCLOCK.HSCLKEN |= SYSCTL_HSCLKEN_SYSPLLEN_ENABLE;
while ((DL_SYSCTL_getClockStatus() & SYSCTL_CLKSTATUS_SYSPLLGOOD_MASK) !=
DL_SYSCTL_CLK_STATUS_SYSPLL_GOOD) {
;
}
}
void DL_SYSCTL_setLFCLKSourceLFXT (const DL_SYSCTL_LFCLKConfig *config)
{
uint32_t register_temp = SYSCTL->SOCLOCK.LFCLKCFG;
register_temp &= ~(SYSCTL_LFCLKCFG_XT1DRIVE_MASK | SYSCTL_LFCLKCFG_MONITOR_MASK | SYSCTL_LFCLKCFG_LOWCAP_MASK);
register_temp |= (config->lowCap) ? (SYSCTL_LFCLKCFG_LOWCAP_ENABLE) : (SYSCTL_LFCLKCFG_LOWCAP_DISABLE);
register_temp |= (config->monitor) ? (SYSCTL_LFCLKCFG_MONITOR_ENABLE) : (SYSCTL_LFCLKCFG_MONITOR_DISABLE);
register_temp |= (config->xt1Drive);
SYSCTL->SOCLOCK.LFCLKCFG = register_temp;
}
void DL_SYSCTL_switchMCLKfromSYSOSCtoHSCLK (DL_SYSCTL_HSCLK_SOURCE source)
{
SYSCTL->SOCLOCK.HSCLKCFG = (uint32_t) source;
SYSCTL->SOCLOCK.MCLKCFG |= SYSCTL_MCLKCFG_USEHSCLK_ENABLE;
}
////////////////////////////////////////////////////////////////////////////
SYSCONFIG_WEAK void SYSCFG_DL_SYSCTL_init(void)
{
@@ -258,6 +169,27 @@ SYSCONFIG_WEAK void SYSCFG_DL_SYSCTL_init(void)
}
static const DL_TimerG_ClockConfig gQEI_0ClockConfig = {
.clockSel = DL_TIMER_CLOCK_BUSCLK,
.divideRatio = DL_TIMER_CLOCK_DIVIDE_1,
.prescale = 0U
};
SYSCONFIG_WEAK void SYSCFG_DL_QEI_0_init(void) {
DL_TimerG_setClockConfig(
QEI_0_INST, (DL_TimerG_ClockConfig *) &gQEI_0ClockConfig);
DL_TimerG_configQEI(QEI_0_INST, DL_TIMER_QEI_MODE_2_INPUT,
DL_TIMER_CC_INPUT_INV_NOINVERT, DL_TIMER_CC_0_INDEX);
DL_TimerG_configQEI(QEI_0_INST, DL_TIMER_QEI_MODE_2_INPUT,
DL_TIMER_CC_INPUT_INV_NOINVERT, DL_TIMER_CC_1_INDEX);
DL_TimerG_setLoadValue(QEI_0_INST, 65535);
DL_TimerG_enableClock(QEI_0_INST);
}
static const DL_VREF_Config gVREFConfig = {
.vrefEnable = DL_VREF_ENABLE_DISABLE,