使用TLE984X系列MCU進行產品開發,開發過程中參考官方例程配置SCU-CGU函數。 CGU全稱為Clock Generation Unit(時鐘產生單元),使用官方工具箱配置時鐘,模式為內部振蕩器PLL,產生25MHz時鐘信號。 配置完成后,生成工程文件,可找遍了整個工程文件,也沒有看到SCU初始化單元是怎么被執行的。 下面是部分代碼:
int main(void)
{
/* Initialization of hardware modules based on Config Wizard configuration */
TLE_Init();//函數初始化,包含SCU初始化函數
/*****************************************************************************
** Place your application code here **
*****************************************************************************/
/*****************************************************************************
** Main endless loop **
*****************************************************************************/
for (;;)
{
/* Main watchdog1 (WDT1) service */
// (void)WDT1_Service();
/***************************************************************************
** Place your application code here **
***************************************************************************/
}
void TLE_Init(void)
{
//#ifdef RTE_DEVICE_SDK_SCU
SCU_Init();//SCU初始化函數
//#endif
//#ifdef RTE_DEVICE_SDK_PMU
PMU_Init();
//#endif
//#ifdef RTE_DEVICE_SDK_ADC1
// ADC1_Init();
//#endif
//#ifdef RTE_DEVICE_SDK_ADC2
// ADC2_Init();
//#endif
//#ifdef RTE_DEVICE_SDK_CCU6
// CCU6_Init();
//#endif
//#ifdef RTE_DEVICE_SDK_GPT12E
// GPT12E_Init();
//#endif
//#ifdef RTE_DEVICE_SDK_TRX
TRX_Init();
//#endif
//#ifdef RTE_DEVICE_SDK_HS
// HS1_Init();
//#if (UC_FEAT_HS > 1u)
// HS2_Init();
//#endif
//#endif
//#ifdef RTE_DEVICE_SDK_LS
// LS1_Init();
// LS2_Init();
//#endif
//#ifdef RTE_DEVICE_SDK_MON
// MONx_Init();
//#endif
//#ifdef RTE_DEVICE_SDK_PORT
PORT_Init();
//#endif
//#ifdef RTE_DEVICE_SDK_SSC
// SSC1_Init();
// SSC2_Init();
//#endif
//#ifdef RTE_DEVICE_SDK_TIMER2X
TIMER2_Init();
TIMER21_Init();
//#endif
//#ifdef RTE_DEVICE_SDK_UART
// UART1_Init();
// UART2_Init();
//#endif
//#ifdef RTE_DEVICE_SDK_INT
// INT_Init();
//#endif
}
void SCU_Init(void)
{
/***************************************************************************
** System Clock Output Control **
***************************************************************************/
SCU->COCON.reg = (uint32) (SCU_COCON);
/***************************************************************************
** Module Pin Select **
**************************************************************************/
#ifdef SCU_MODPISEL
SCU->MODPISEL.reg = (uint32) SCU_MODPISEL;
#endif
#ifdef SCU_MODPISEL1
SCU->MODPISEL1.reg = (uint8) SCU_MODPISEL1;
#endif
#ifdef SCU_MODPISEL2
SCU->MODPISEL2.reg = (uint8) SCU_MODPISEL2;
#endif
#ifdef SCU_MODPISEL3
SCU->MODPISEL3.reg = (uint8) SCU_MODPISEL3;
#endif
SCU->GPT12PISEL.reg = (uint8) SCU_GPT12PISEL;
}
第三段代碼中,只是配置了fsys的分頻及選擇外部中斷口,沒有任何關于時鐘源的選擇及時鐘配置相關的代碼。 百思不得其解(對啟動文件未曾了解),使用keil工具進行Debug,將斷點打在PC初始位置,PC:0x00000000,按下F10單步調試,指針會在當前匯編代碼中逐步執行,且PC會跳轉至SystemInit函數中執行。
PC初始化
SCU配置初始化函數
void SCU_ClkInit(void)
{
sint32 int_was_mask;
/* disable all interrupts */
int_was_mask = CMSIS_Irq_Dis();
/***************************************************************************
** NVM Protection Control **
**************************************************************************/
#if (SCU_NVM_BOOT_PROT == 1u)
(void)user_nvm_protect_set((uint32) SCU_NVM_PROT_PW, NVM_PASSWORD_SEGMENT_BOOT);
#endif
#if (SCU_NVM_CODE_PROT == 1u)
(void)user_nvm_protect_set((uint32) SCU_NVM_PROT_PW, NVM_PASSWORD_SEGMENT_CODE);
#endif
#if (SCU_NVM_DATA_PROT == 1u)
(void)user_nvm_protect_set((uint32) SCU_NVM_PROT_PW, NVM_PASSWORD_SEGMENT_DATA);
#endif
/***************************************************************************
** PLL/SYSCLK Control **
**************************************************************************/
SCU->NMICON.bit.NMIPLL = 0u;
/* enable XTAL1/2 pins */
SCU_OpenPASSWD();
SCU->MODPISEL1.reg = (uint32)(SCU_MODPISEL1 & SCU_MODPISEL1_XTAL12EN_Msk);
SCU->PASSWD.reg = PASSWD_Close;
/* select LP_CLK */
SCU_OpenPASSWD();
SCU->SYSCON0.bit.SYSCLKSEL = 2u;
SCU_ClosePASSWD();
/* Oscillator Select */
SCU_OpenPASSWD();
SCU->OSC_CON.reg = (uint32)SCU_OSC_CON;//
SCU_ClosePASSWD();
SCU_OpenPASSWD();
SCU->PLL_CON.reg = (uint32) SCU_PLL_CON;
SCU_ClosePASSWD();
SCU_OpenPASSWD();
SCU->CMCON1.reg = (uint32) SCU_CMCON1;
SCU_ClosePASSWD();
SCU->PLL_CON.bit.RESLD = 1u;
/* set PLL_CON.bit.VCOBYP=0 */
SCU->PLL_CON.reg=(SCU->PLL_CON.reg&~SCU_PLL_CON_VCOBYP_Msk)|SCU_PLL_CON_UNPROT_VCOBYP_Msk;
/* set PLL_CON.bit.OSCDISC=0 */
SCU->PLL_CON.reg=(SCU->PLL_CON.reg&~SCU_PLL_CON_OSCDISC_Msk)|SCU_PLL_CON_UNPROT_OSCDISC_Msk;
while (u1_Field_Rd32(&SCU->PLL_CON.reg, (uint8)SCU_PLL_CON_LOCK_Pos, SCU_PLL_CON_LOCK_Msk) == (uint8)0)
{
}
SCU_OpenPASSWD();
/* 0u << 6u */
SCU->SYSCON0.reg = 0u;//PLL OUT signal
SCU_ClosePASSWD();
SCU->NMISRCLR.bit.FNMIPLLC = 1u;
/***************************************************************************
** Analog Clock Control **
***************************************************************************/
/* set factor for MI_CLK and Filt_CLK*/
SCU->APCLK.reg = (uint32) SCU_APCLK;
/* apply setting by toggling APCLK_SET */
SCU_OpenPASSWD();
SCU->APCLK_CTRL.bit.APCLK_SET = 1u;
SCU_ClosePASSWD();
CMSIS_NOP();
SCU_OpenPASSWD();
SCU->APCLK_CTRL.bit.APCLK_SET = 0u;
SCU_ClosePASSWD();
/* enable interrupts */
if (int_was_mask == 0)
{
CMSIS_Irq_En();
}
}
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
于是,進一步分析,并且對啟動文件中部分代碼做了一番分析。 程序在執行main函數之前,會先執行啟動文件,啟動文件中可以處理函數,并使用LDR,將該函數的地址放入R0通用寄存器,再使用BLX指令跳轉執行。 執行后再使用LDR進入main函數,程序便進入主函數開始執行。
啟動文件部分代碼
Debug過程中,遇到一個問題,LDR指令存入R0寄存器的地址,與函數名的地址不符合。 比如systemInit函數在R0寄存器中存入的地址為0x110004D5,但通過watch窗口看到的地址是0x110004D4,小編試過其他函數,均是一樣的情況,R0存入的地址比實際的地址+1。
Debug地址不同
-
mcu
+關注
關注
146文章
17475瀏覽量
354616 -
振蕩器
+關注
關注
28文章
3875瀏覽量
139675 -
時鐘
+關注
關注
11文章
1759瀏覽量
132202 -
函數
+關注
關注
3文章
4355瀏覽量
63319 -
代碼
+關注
關注
30文章
4858瀏覽量
69553
發布評論請先 登錄
相關推薦
用Config Wizard for MOTIX MCU 987X軟件打開ICW_TLE987x.xml和config.icwp時報錯的原因?
芯海通用 MCU 應用筆記: CS32F03x 系列硬件設計指南
如何對TLE9893集成電路進行編程?
如何為MOTIX TLE9879X MCU配置500KHz的GPT中斷?
TLE2027,TLE2037,TLE2027A,TLE20
TLE9842-2QX主要特性_PCB設計圖

TLE9845QX系列產品的汽車馬達控制方案

關于車用智能電機控制的性能分析和應用
基于AD984X模擬到數字轉換的參考設計

貿澤開售英飛凌MOTIX? TLE989x MCU: 配備CAN (FD) 接口的單芯片功率IC,更適合汽車/BLDC電機控制

【重磅上市】BB5x系列8位MCU為嵌入式和IoT開發提供出色的性價比

TLE206x,TLE206xA,TLE206xB運算放大器數據表

TLE202x,TLE202xA,TLE202xB,TLE202xY功耗精密運算放大器數據表

評論