公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Translation_Bot
Community Manager
Community Manager
Community Manager
我正在尝试在不使用 或 XMC 库的情况下对 XMC4500 Relax 进行编程。COOLDIM_PRG_BOARDDAVE™因此,内核和时钟设置是我自己的代码。 我已将 USIC 模块 1 通道 0 编程为 ASC 并且可以传输。 但是,波特率 TESTBOARD_150PC_OUT 了 5 倍。在 PDIV=316、PCTQ=0 和 DCTQ=15 的情况下,我预计波特率为 19'200,但输出的波特率为 3840,即好像 fperiPh 是 24 MHz (foSi) 而不是 120 MHz (fSys) 一样。 但是,我的理解是,如果不可分割,fperiPh应该是fSys,那么为什么它仍处于启动值呢? 我测量了执行一组指令所花费的时间,发现随着我提高 PLL 速度,在达到 120 MHz 时达到预期的 5 系数,时间缩短了。这使我相信 fCPU 是 120 MHZ。 我注意到 Systick 没有变化,一直保持在 24 MHz。这也出乎意料,所以也许这为我做错了什么提供了线索。 有人为何我的串行 IO 的波特率错误有什么建议或想法吗? 最诚挚的问候, 阿兰

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/XMC/XMC4500-Incorrect-serial-baudrate/td-p/672517

0 点赞
1 解答
Translation_Bot
Community Manager
Community Manager
Community Manager

首先:

请确保以正确的方式设置外设时钟并获得所需的值。 您可以查看以下代码以获得外设时钟 72Mhz。 ASC 时钟来自系统时钟。 你可以使用系统滴答时间中断来测试 cpu 时钟。

 

#define CLOCK_CCUCLK_ENABLED 1U
#define CLOCK_CCUCLK_DIV 1U
#define CLOCK_CPUCLK_DIV 1U
#define CLOCK_FOFI_CALIBRATION_MODE XMC_SCU_CLOCK_FOFI_CALIBRATION_MODE_FACTORY
#define CLOCK_OSCHP_ENABLED 1U
#define CLOCK_OSCHP_MODE XMC_SCU_CLOCK_OSCHP_MODE_OSC
#define CLOCK_PERICLK_DIV 1U
#define CLOCK_SYSPLL_ENABLED 1U
#define CLOCK_SYSPLL_SEL XMC_SCU_CLOCK_SYSPLLCLKSRC_OSCHP
#define CLOCK_SYSPLL_MODE XMC_SCU_CLOCK_SYSPLL_MODE_NORMAL
#define CLOCK_SYSPLL_PDIV 1U
#define CLOCK_SYSPLL_NDIV 24U
#define CLOCK_SYSPLL_KDIV 1U
#define CLOCK_RTCCLK_SEL XMC_SCU_HIB_RTCCLKSRC_OSI
#define CLOCK_STDBYCLK_SEL XMC_SCU_HIB_STDBYCLKSRC_OSI
#define CLOCK_SYSCLK_SEL XMC_SCU_CLOCK_SYSCLKSRC_PLL
#define CLOCK_SYSCLK_DIV 4U

void SystemCoreClockSetup(void)
{
  XMC_SCU_CLOCK_CONFIG_t clock_config =
  {
  #if defined(CLOCK_SYSPLL_ENABLED)
    .syspll_config.n_div = CLOCK_SYSPLL_NDIV,
    .syspll_config.p_div = CLOCK_SYSPLL_PDIV,
    .syspll_config.k_div = CLOCK_SYSPLL_KDIV,
    .syspll_config.clksrc=CLOCK_SYSPLL_SEL,
    .syspll_config.mode = CLOCK_SYSPLL_MODE,
  #else
    .syspll_config.mode = XMC_SCU_CLOCK_SYSPLL_MODE_DISABLED,
  #endif
  #if defined(CLOCK_OSCHP_ENABLED)
    .enable_oschp = true,
  #endif
  #if defined(CLOCK_OSCLP_ENABLED)
    .enable_osculp = true,
  #endif
    .calibration_mode = CLOCK_FOFI_CALIBRATION_MODE,
    .fstdby_clksrc=CLOCK_STDBYCLK_SEL,
    .fsys_clksrc=CLOCK_SYSCLK_SEL,
    .fsys_clkdiv = CLOCK_SYSCLK_DIV,
    .fcpu_clkdiv = CLOCK_CPUCLK_DIV,
  #if defined(CLOCK_CCUCLK_ENABLED)
    .fccu_clkdiv = CLOCK_CCUCLK_DIV,
  #endif
    .fperipheral_clkdiv = CLOCK_PERICLK_DIV
  };
 
 #if defined(CLOCK_EXTCLK_ENABLED)
  /* External output source clock */
  XMC_SCU_CLOCK_SetExternalOutputClockSource(CLOCK_EXTCLK_SEL);
  /* External clock divider setting */
  XMC_SCU_CLOCK_SetExternalOutputClockDivider(CLOCK_EXTCLK_DIV);
 #endif
   
  XMC_SCU_CLOCK_Init(&clock_config);
 
  /* RTC source clock */
  XMC_SCU_HIB_SetRtcClockSource(CLOCK_RTCCLK_SEL);
 
 #if defined(CLOCK_USBCLK_ENABLED)
   /* USB/SDMMC source clock */
   XMC_SCU_CLOCK_SetUsbClockSource(CLOCK_USBCLK_SEL);
   /* USB/SDMMC divider setting */
   XMC_SCU_CLOCK_SetUsbClockDivider(CLOCK_USBCLK_DIV);
 #endif
 
 #if defined(CLOCK_USBPLL_ENABLED)
  XMC_SCU_CLOCK_EnableUsbPll();
  XMC_SCU_CLOCK_StartUsbPll(CLOCK_USBPLL_PDIV, CLOCK_USBPLL_NDIV);
 #endif  
 #if defined(CLOCK_ECATCLK_ENABLED)
  /* ECAT source clock */
  XMC_SCU_CLOCK_SetECATClockSource(CLOCK_ECATCLK_SEL);
  /* ECAT divider setting */
  XMC_SCU_CLOCK_SetECATClockDivider(CLOCK_ECATCLK_DIV);
 #endif
 
 #if defined(CLOCK_WDTCLK_ENABLED)
  /* WDT source clock */
  XMC_SCU_CLOCK_SetWdtClockSource(CLOCK_WDTCLK_SEL);
  /* WDT divider setting */
  XMC_SCU_CLOCK_SetWdtClockDivider(CLOCK_WDTCLK_DIV);
 #endif
 
 #if defined(CLOCK_EBUCLK_ENABLED)
  /* EBU divider setting */
  XMC_SCU_CLOCK_SetEbuClockDivider(CLOCK_EBUCLK_DIV);
 #endif 
  #if defined(CLOCK_USBCLK_ENABLED)
  XMC_SCU_CLOCK_EnableClock(XMC_SCU_CLOCK_USB);
 #endif
 #if defined(CLOCK_SDCLK_ENABLED)
  XMC_SCU_CLOCK_EnableClock(XMC_SCU_CLOCK_MMC);
 #endif
 #if defined(CLOCK_ETHCLK_ENABLED)
  XMC_SCU_CLOCK_EnableClock(XMC_SCU_CLOCK_ETH);
 #endif
 #if defined(CLOCK_EBUCLK_ENABLED)
  XMC_SCU_CLOCK_EnableClock(XMC_SCU_CLOCK_EBU);
 #endif
 #if defined(CLOCK_CCUCLK_ENABLED)
  XMC_SCU_CLOCK_EnableClock(XMC_SCU_CLOCK_CCU);
 #endif
 #if defined(CLOCK_WDTCLK_ENABLED)
  XMC_SCU_CLOCK_EnableClock(XMC_SCU_CLOCK_WDT);
 #endif
}

 

 

 

以下步骤显示如何获得 19200 个基点的波特率。

例如:

外设时钟为 72Mhz。

1:设置采样点:

sample_point=8

 

 

__STATIC_INLINE void XMC_UART_CH_SetSamplePoint(XMC_USIC_CH_t *const channel, const uint32_t sample_point)
{
  channel->PCR_ASCMode = (uint32_t)((channel->PCR_ASCMode & (uint32_t)(~USIC_CH_PCR_ASCMode_SP_Msk)) |
                                    (sample_point << USIC_CH_PCR_ASCMode_SP_Pos));
}

 

 

2: setFractionalDivider:(选择分数模式并逐步设置值 1017)

 

 

__STATIC_INLINE void XMC_USIC_CH_SetFractionalDivider(XMC_USIC_CH_t *const channel, const XMC_USIC_CH_BRG_CLOCK_DIVIDER_MODE_t mode, const uint16_t step)
{
  channel->FDR = mode | step;
}

 

 

模式=32768

步长 = 1017

频道-> FDR = 模式 | 步骤;

LinglingG_46_0-1704783410829.png

 

3:ASC 模块获得输入时钟 fpin

Fpin= Fperi/ (1023/step) =7200000/ (1023/1017) =7200000/1.0058997 =71577712

 

 

void XMC_USIC_CH_SetBaudrateDivider(XMC_USIC_CH_t *const channel, 
                                    XMC_USIC_CH_BRG_CLOCK_SOURCE_t clksel,
                                    bool pppen,
                                    uint32_t pdiv,
                                    XMC_USIC_CH_BRG_CTQSEL_t ctqsel,
                                    uint32_t pctq,
                                    uint32_t dctq)
{
    uint32_t regval = channel->BRG;
    regval &= (uint32_t)~(USIC_CH_BRG_CLKSEL_Msk | USIC_CH_BRG_PPPEN_Msk | USIC_CH_BRG_PDIV_Msk | USIC_CH_BRG_CTQSEL_Msk | USIC_CH_BRG_PCTQ_Msk | USIC_CH_BRG_DCTQ_Msk);
    regval |= clksel | (pppen ? USIC_CH_BRG_PPPEN_Msk : 0) | (pdiv << USIC_CH_BRG_PDIV_Pos) | ctqsel | (pctq << USIC_CH_BRG_PCTQ_Pos) | (dctq << USIC_CH_BRG_DCTQ_Pos);
    channel->BRG = regval;
}

 

 

 

LinglingG_46_1-1704783410833.png

 

4:然后我们可以参考下面的屏幕来获取波特率:

F ASC =71577712/ (233*16) =19200bps

LinglingG_46_2-1704783410842.png

 

建议你可以先使用组件或库来实现该功能,然后根据成功的项目进行开发。

最后但并非最不重要的一点是,我们可以在这里参考 XMC4500 参考手册。

希望它能帮助你深入了解波特率的生成。

 

 

 

 

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/XMC/XMC4500-Incorrect-serial-baudrate/m-p/672919

在原帖中查看解决方案

0 点赞
3 回复数
Translation_Bot
Community Manager
Community Manager
Community Manager

首先:

请确保以正确的方式设置外设时钟并获得所需的值。 您可以查看以下代码以获得外设时钟 72Mhz。 ASC 时钟来自系统时钟。 你可以使用系统滴答时间中断来测试 cpu 时钟。

 

#define CLOCK_CCUCLK_ENABLED 1U
#define CLOCK_CCUCLK_DIV 1U
#define CLOCK_CPUCLK_DIV 1U
#define CLOCK_FOFI_CALIBRATION_MODE XMC_SCU_CLOCK_FOFI_CALIBRATION_MODE_FACTORY
#define CLOCK_OSCHP_ENABLED 1U
#define CLOCK_OSCHP_MODE XMC_SCU_CLOCK_OSCHP_MODE_OSC
#define CLOCK_PERICLK_DIV 1U
#define CLOCK_SYSPLL_ENABLED 1U
#define CLOCK_SYSPLL_SEL XMC_SCU_CLOCK_SYSPLLCLKSRC_OSCHP
#define CLOCK_SYSPLL_MODE XMC_SCU_CLOCK_SYSPLL_MODE_NORMAL
#define CLOCK_SYSPLL_PDIV 1U
#define CLOCK_SYSPLL_NDIV 24U
#define CLOCK_SYSPLL_KDIV 1U
#define CLOCK_RTCCLK_SEL XMC_SCU_HIB_RTCCLKSRC_OSI
#define CLOCK_STDBYCLK_SEL XMC_SCU_HIB_STDBYCLKSRC_OSI
#define CLOCK_SYSCLK_SEL XMC_SCU_CLOCK_SYSCLKSRC_PLL
#define CLOCK_SYSCLK_DIV 4U

void SystemCoreClockSetup(void)
{
  XMC_SCU_CLOCK_CONFIG_t clock_config =
  {
  #if defined(CLOCK_SYSPLL_ENABLED)
    .syspll_config.n_div = CLOCK_SYSPLL_NDIV,
    .syspll_config.p_div = CLOCK_SYSPLL_PDIV,
    .syspll_config.k_div = CLOCK_SYSPLL_KDIV,
    .syspll_config.clksrc=CLOCK_SYSPLL_SEL,
    .syspll_config.mode = CLOCK_SYSPLL_MODE,
  #else
    .syspll_config.mode = XMC_SCU_CLOCK_SYSPLL_MODE_DISABLED,
  #endif
  #if defined(CLOCK_OSCHP_ENABLED)
    .enable_oschp = true,
  #endif
  #if defined(CLOCK_OSCLP_ENABLED)
    .enable_osculp = true,
  #endif
    .calibration_mode = CLOCK_FOFI_CALIBRATION_MODE,
    .fstdby_clksrc=CLOCK_STDBYCLK_SEL,
    .fsys_clksrc=CLOCK_SYSCLK_SEL,
    .fsys_clkdiv = CLOCK_SYSCLK_DIV,
    .fcpu_clkdiv = CLOCK_CPUCLK_DIV,
  #if defined(CLOCK_CCUCLK_ENABLED)
    .fccu_clkdiv = CLOCK_CCUCLK_DIV,
  #endif
    .fperipheral_clkdiv = CLOCK_PERICLK_DIV
  };
 
 #if defined(CLOCK_EXTCLK_ENABLED)
  /* External output source clock */
  XMC_SCU_CLOCK_SetExternalOutputClockSource(CLOCK_EXTCLK_SEL);
  /* External clock divider setting */
  XMC_SCU_CLOCK_SetExternalOutputClockDivider(CLOCK_EXTCLK_DIV);
 #endif
   
  XMC_SCU_CLOCK_Init(&clock_config);
 
  /* RTC source clock */
  XMC_SCU_HIB_SetRtcClockSource(CLOCK_RTCCLK_SEL);
 
 #if defined(CLOCK_USBCLK_ENABLED)
   /* USB/SDMMC source clock */
   XMC_SCU_CLOCK_SetUsbClockSource(CLOCK_USBCLK_SEL);
   /* USB/SDMMC divider setting */
   XMC_SCU_CLOCK_SetUsbClockDivider(CLOCK_USBCLK_DIV);
 #endif
 
 #if defined(CLOCK_USBPLL_ENABLED)
  XMC_SCU_CLOCK_EnableUsbPll();
  XMC_SCU_CLOCK_StartUsbPll(CLOCK_USBPLL_PDIV, CLOCK_USBPLL_NDIV);
 #endif  
 #if defined(CLOCK_ECATCLK_ENABLED)
  /* ECAT source clock */
  XMC_SCU_CLOCK_SetECATClockSource(CLOCK_ECATCLK_SEL);
  /* ECAT divider setting */
  XMC_SCU_CLOCK_SetECATClockDivider(CLOCK_ECATCLK_DIV);
 #endif
 
 #if defined(CLOCK_WDTCLK_ENABLED)
  /* WDT source clock */
  XMC_SCU_CLOCK_SetWdtClockSource(CLOCK_WDTCLK_SEL);
  /* WDT divider setting */
  XMC_SCU_CLOCK_SetWdtClockDivider(CLOCK_WDTCLK_DIV);
 #endif
 
 #if defined(CLOCK_EBUCLK_ENABLED)
  /* EBU divider setting */
  XMC_SCU_CLOCK_SetEbuClockDivider(CLOCK_EBUCLK_DIV);
 #endif 
  #if defined(CLOCK_USBCLK_ENABLED)
  XMC_SCU_CLOCK_EnableClock(XMC_SCU_CLOCK_USB);
 #endif
 #if defined(CLOCK_SDCLK_ENABLED)
  XMC_SCU_CLOCK_EnableClock(XMC_SCU_CLOCK_MMC);
 #endif
 #if defined(CLOCK_ETHCLK_ENABLED)
  XMC_SCU_CLOCK_EnableClock(XMC_SCU_CLOCK_ETH);
 #endif
 #if defined(CLOCK_EBUCLK_ENABLED)
  XMC_SCU_CLOCK_EnableClock(XMC_SCU_CLOCK_EBU);
 #endif
 #if defined(CLOCK_CCUCLK_ENABLED)
  XMC_SCU_CLOCK_EnableClock(XMC_SCU_CLOCK_CCU);
 #endif
 #if defined(CLOCK_WDTCLK_ENABLED)
  XMC_SCU_CLOCK_EnableClock(XMC_SCU_CLOCK_WDT);
 #endif
}

 

 

 

以下步骤显示如何获得 19200 个基点的波特率。

例如:

外设时钟为 72Mhz。

1:设置采样点:

sample_point=8

 

 

__STATIC_INLINE void XMC_UART_CH_SetSamplePoint(XMC_USIC_CH_t *const channel, const uint32_t sample_point)
{
  channel->PCR_ASCMode = (uint32_t)((channel->PCR_ASCMode & (uint32_t)(~USIC_CH_PCR_ASCMode_SP_Msk)) |
                                    (sample_point << USIC_CH_PCR_ASCMode_SP_Pos));
}

 

 

2: setFractionalDivider:(选择分数模式并逐步设置值 1017)

 

 

__STATIC_INLINE void XMC_USIC_CH_SetFractionalDivider(XMC_USIC_CH_t *const channel, const XMC_USIC_CH_BRG_CLOCK_DIVIDER_MODE_t mode, const uint16_t step)
{
  channel->FDR = mode | step;
}

 

 

模式=32768

步长 = 1017

频道-> FDR = 模式 | 步骤;

LinglingG_46_0-1704783410829.png

 

3:ASC 模块获得输入时钟 fpin

Fpin= Fperi/ (1023/step) =7200000/ (1023/1017) =7200000/1.0058997 =71577712

 

 

void XMC_USIC_CH_SetBaudrateDivider(XMC_USIC_CH_t *const channel, 
                                    XMC_USIC_CH_BRG_CLOCK_SOURCE_t clksel,
                                    bool pppen,
                                    uint32_t pdiv,
                                    XMC_USIC_CH_BRG_CTQSEL_t ctqsel,
                                    uint32_t pctq,
                                    uint32_t dctq)
{
    uint32_t regval = channel->BRG;
    regval &= (uint32_t)~(USIC_CH_BRG_CLKSEL_Msk | USIC_CH_BRG_PPPEN_Msk | USIC_CH_BRG_PDIV_Msk | USIC_CH_BRG_CTQSEL_Msk | USIC_CH_BRG_PCTQ_Msk | USIC_CH_BRG_DCTQ_Msk);
    regval |= clksel | (pppen ? USIC_CH_BRG_PPPEN_Msk : 0) | (pdiv << USIC_CH_BRG_PDIV_Pos) | ctqsel | (pctq << USIC_CH_BRG_PCTQ_Pos) | (dctq << USIC_CH_BRG_DCTQ_Pos);
    channel->BRG = regval;
}

 

 

 

LinglingG_46_1-1704783410833.png

 

4:然后我们可以参考下面的屏幕来获取波特率:

F ASC =71577712/ (233*16) =19200bps

LinglingG_46_2-1704783410842.png

 

建议你可以先使用组件或库来实现该功能,然后根据成功的项目进行开发。

最后但并非最不重要的一点是,我们可以在这里参考 XMC4500 参考手册。

希望它能帮助你深入了解波特率的生成。

 

 

 

 

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/XMC/XMC4500-Incorrect-serial-baudrate/m-p/672919

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

我不同意这个问题已经解决了。
你所做的只是让我使用XMC,这不是一个选项。
我知道使用 XMC 是重新开始的,如果我使用 DAVE™ 和 Xmc 库,我确实可以让应用程序正常工作,但我无法使用自己的代码重现同样的事情。
我研究了 XMC 库和 4500 参考手册,并尝试使用我自己的代码重现该功能。 这种策略通常有效,事实上,我确实以错误的波特率 TESTBOARD_150PC_OUT ASC 的数据。
我相信我对 ASC 的编程是正确的,所以这表明 fperiPh 的频率是 24MHz,而不是预期的 120Mhz。
我不明白这怎么可能,但显然是这样。
我想要的是找人来建议我可能做错了什么。
为了让 fperiPh 达到 24Mhz,我可能做错了什么或忘记做了什么?

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/XMC/XMC4500-Incorrect-serial-baudrate/m-p/677765

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

嗨,

你能在这里分享你的测试项目吗?

谢谢,

玲玲

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/XMC/XMC4500-Incorrect-serial-baudrate/m-p/677839

0 点赞