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
@@ -5,16 +5,25 @@
* @v2CliArgs --device "MSPM0G3507" --package "LQFP-64(PM)" --product "mspm0_sdk@2.04.00.06"
* @versions {"tool":"1.23.1+4034"}
*/
scripting.excludeFromBuild("device_linker.cmd");
scripting.excludeFromBuild("device_linker.lds");
scripting.excludeFromBuild("device.opt");
scripting.excludeFromBuild("device.cmd.genlibs");
scripting.excludeFromBuild("device.lds.genlibs");
scripting.excludeFromBuild("Event.dot");
/**
* Import the modules used in this configuration.
*/
const GPIO = scripting.addModule("/ti/driverlib/GPIO", {}, false);
const GPIO1 = GPIO.addInstance();
const GPIO2 = GPIO.addInstance();
const SYSCTL = scripting.addModule("/ti/driverlib/SYSCTL");
const SYSTICK = scripting.addModule("/ti/driverlib/SYSTICK");
const VREF = scripting.addModule("/ti/driverlib/VREF");
const GPIO = scripting.addModule("/ti/driverlib/GPIO", {}, false);
const GPIO1 = GPIO.addInstance();
const GPIO2 = GPIO.addInstance();
const QEI = scripting.addModule("/ti/driverlib/QEI", {}, false);
const QEI1 = QEI.addInstance();
const SYSCTL = scripting.addModule("/ti/driverlib/SYSCTL");
const SYSTICK = scripting.addModule("/ti/driverlib/SYSTICK");
const VREF = scripting.addModule("/ti/driverlib/VREF");
const ProjectConfig = scripting.addModule("/ti/project_config/ProjectConfig");
/**
* Write custom configuration values to the imported modules.
@@ -79,6 +88,13 @@ GPIO2.associatedPins[0].interruptEn = true;
GPIO2.associatedPins[0].polarity = "RISE";
GPIO2.associatedPins[0].pin.$assign = "PA18";
QEI1.$name = "QEI_0";
QEI1.peripheral.$assign = "TIMG8";
QEI1.peripheral.ccp0Pin.$assign = "PB6";
QEI1.peripheral.ccp1Pin.$assign = "PB7";
QEI1.ccp0PinConfig.$name = "ti_driverlib_gpio_GPIOPinGeneric0";
QEI1.ccp1PinConfig.$name = "ti_driverlib_gpio_GPIOPinGeneric1";
SYSCTL.forceDefaultClkConfig = true;
SYSCTL.clockTreeEn = true;
scripting.suppress("For best practices when the CPUCLK is running at 32MHz and above, clear the flash status bit using DL_FlashCTL_executeClearStatus\\(\\) before executing any flash operation\\. Otherwise there may be false positives\\.", SYSCTL);
@@ -98,6 +114,8 @@ VREF.peripheral.vrefPosPin.$assign = "PA23";
VREF.peripheral.vrefNegPin.$assign = "PA21";
VREF.vrefNegPinConfig.$name = "ti_driverlib_gpio_GPIOPinGeneric30";
ProjectConfig.genLibIQVersion = "MATHACL";
/**
* Pinmux solution for unlocked pins/peripherals. This ensures that minor changes to the automatic solver in a future
* version of the tool will not impact the pinmux you originally saw. These lines can be completely deleted in order to
+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,
@@ -87,6 +87,23 @@ extern "C" {
/* Defines for QEI_0 */
#define QEI_0_INST TIMG8
#define QEI_0_INST_IRQHandler TIMG8_IRQHandler
#define QEI_0_INST_INT_IRQN (TIMG8_INT_IRQn)
/* Pin configuration defines for QEI_0 PHA Pin */
#define GPIO_QEI_0_PHA_PORT GPIOB
#define GPIO_QEI_0_PHA_PIN DL_GPIO_PIN_6
#define GPIO_QEI_0_PHA_IOMUX (IOMUX_PINCM23)
#define GPIO_QEI_0_PHA_IOMUX_FUNC IOMUX_PINCM23_PF_TIMG8_CCP0
/* Pin configuration defines for QEI_0 PHB Pin */
#define GPIO_QEI_0_PHB_PORT GPIOB
#define GPIO_QEI_0_PHB_PIN DL_GPIO_PIN_7
#define GPIO_QEI_0_PHB_IOMUX (IOMUX_PINCM24)
#define GPIO_QEI_0_PHB_IOMUX_FUNC IOMUX_PINCM24_PF_TIMG8_CCP1
/* Defines for VREF */
#define VREF_VOLTAGE_MV 3300
#define GPIO_VREF_VREFPOS_PORT GPIOA
@@ -126,10 +143,13 @@ void SYSCFG_DL_init(void);
void SYSCFG_DL_initPower(void);
void SYSCFG_DL_GPIO_init(void);
void SYSCFG_DL_SYSCTL_init(void);
void SYSCFG_DL_QEI_0_init(void);
void SYSCFG_DL_VREF_init(void);
void SYSCFG_DL_SYSTICK_init(void);
bool SYSCFG_DL_saveConfiguration(void);
bool SYSCFG_DL_restoreConfiguration(void);
#ifdef __cplusplus
}