0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用TLE984X系列MCU进行产品开发

CHANBAEK 来源:头条号嵌小白 作者:头条号嵌小白 2023-03-08 17:17 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

使用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
    mcu
    +关注

    关注

    147

    文章

    18604

    浏览量

    386845
  • 振荡器
    +关注

    关注

    28

    文章

    4155

    浏览量

    142318
  • 时钟
    +关注

    关注

    11

    文章

    1953

    浏览量

    134536
  • 函数
    +关注

    关注

    3

    文章

    4406

    浏览量

    66829
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73135
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    英飞凌预驱模块TLE989x的核心功能

    检测等模块。在过去十多年的汽车小电机应用上,该系列产品已得到广泛使用。TLE989x作为全新产品,它的预驱模块也集成了英飞凌最新技术,那究竟有哪些神奇的功能呢?让我一探究竟吧。
    的头像 发表于 09-09 15:35 2150次阅读
    英飞凌预驱模块<b class='flag-5'>TLE989x</b>的核心功能

    用Config Wizard for MOTIX MCU 987X软件打开ICW_TLE987x.xml和config.icwp时报错的原因?

    请教下,我在 用Config Wizard for MOTIX MCU 987X 软件打开 ICW_TLE987x.xml 和 config.icwp时提示如下错误 有谁知道这是啥原因吗?
    发表于 01-24 07:46

    TLE9879和TLE9877的差异是什么?

    TLE987x系列TLE9877和TLE9879等等,我现在想查下TLE9879和TLE987
    发表于 02-01 06:15

    芯海通用 MCU 应用笔记: CS32F03x 系列硬件设计指南

    本技术说明文档提供关于 CS32F03x 系列 MCU 的电源,启动引导配置,应用注意事项的说明,旨在帮助用户更好地使用 CS32F03x 系列
    发表于 05-16 11:32

    如何为MOTIX TLE9879X MCU配置500KHz的GPT中断?

    嗨, 我正在使用带有 TLE9879x MOTIX MCU(准确地说是 TLE9879QXA40)的定制板。 我需要配置 500KHz 的任何软件中断。 我试过使用定时器 3,但只能获得
    发表于 07-03 08:04

    TLE2027,TLE2037,TLE2027A,TLE20

    The TLE20x7 and TLE20x7A contain innovative circuit design expertise and high-quality process
    发表于 09-16 23:18 21次下载

    TLE9842-2QX主要特性_PCB设计图

    Infineon公司的TLE9842-2QX是TLE984x系列中一员,集成了32位ARM Cortex M0 MCU核,继电器驱动器,高边开关,LIN收发器和能工作在汽车电池的电源系
    发表于 04-13 16:33 8101次阅读
    <b class='flag-5'>TLE</b>9842-2QX主要特性_PCB设计图

    数据闪存tle984x处理应用笔记资料下载

    数据闪存tle984x处理应用笔记
    发表于 04-12 11:53 8次下载
    数据闪存<b class='flag-5'>tle984x</b>处理应用笔记资料下载

    TLE9845QX系列产品的汽车马达控制方案

    Infineon公司的TLE9845QX系列产品是集成了32位ARM® Cortex® M0内核的继电器驱动芯片,MCU工作频率高达40MHz.器件在单个芯片上集成了通过继电器或PN MOSFET半
    发表于 04-14 19:14 3152次阅读
    <b class='flag-5'>TLE</b>9845QX<b class='flag-5'>系列产品</b>的汽车马达控制方案

    关于车用智能电机控制的性能分析和应用

    最新的ePower单芯片家族又有了新一代的产品TLE987xTLE986x以及TLE984x,不仅具有32位的处理器超强的处理能力,并能够同时适用于2相和3相电机控制的需求,帮助客户
    的头像 发表于 09-25 09:43 3691次阅读

    基于AD984X模拟到数字转换的参考设计

    View the reference design for AD984X. http://www.elecfans.com/soft/ has thousands of reference designs to help bring your project to life.
    发表于 07-08 17:37 0次下载
    基于AD<b class='flag-5'>984X</b>模拟到数字转换的参考设计

    贸泽开售英飞凌MOTIX™ TLE989x MCU: 配备CAN (FD) 接口的单芯片功率IC,更适合汽车/BLDC电机控制

    TLE989x微控制器 (MCU)。TLE989x系列微控制器扩展了其全面且经过验证的MOTIX™ MCU嵌入式功率IC
    发表于 10-25 17:08 1314次阅读
    贸泽开售英飞凌MOTIX™ <b class='flag-5'>TLE989x</b> <b class='flag-5'>MCU</b>: 配备CAN (FD) 接口的单芯片功率IC,更适合汽车/BLDC电机控制

    【重磅上市】BB5x系列8位MCU为嵌入式和IoT开发提供出色的性价比

    Silicon Labs (亦称 “ 芯科科技 ” )宣布推出新的 BB5 8 位微控制器( MCU系列产品,该系列 MCU 针对价格和性能进行
    的头像 发表于 11-15 15:55 1160次阅读
    【重磅上市】BB5<b class='flag-5'>x</b><b class='flag-5'>系列</b>8位<b class='flag-5'>MCU</b>为嵌入式和IoT<b class='flag-5'>开发</b>提供出色的性价比

    TLE206x,TLE206xA,TLE206xB运算放大器数据表

    电子发烧友网站提供《TLE206x,TLE206xA,TLE206xB运算放大器数据表.pdf》资料免费下载
    发表于 06-05 09:46 0次下载
    <b class='flag-5'>TLE206x</b>,<b class='flag-5'>TLE</b>206xA,<b class='flag-5'>TLE</b>206xB运算放大器数据表

    TLE202x,TLE202xA,TLE202xB,TLE202xY功耗精密运算放大器数据表

    电子发烧友网站提供《TLE202x,TLE202xA,TLE202xB,TLE202xY功耗精密运算放大器数据表.pdf》资料免费下载
    发表于 06-06 09:24 0次下载
    <b class='flag-5'>TLE202x</b>,<b class='flag-5'>TLE</b>202xA,<b class='flag-5'>TLE</b>202xB,<b class='flag-5'>TLE</b>202xY功耗精密运算放大器数据表