XMC4500 シリアルボーレートが正しくない

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としてプログラムし、送信することができます。 ただし、ボーレートは 5 倍 TESTBOARD_150PC_OUT されます。PDIV=316、PCTQ=0、DCTQ=15 の場合、ボーレートは 19'200 であると予想されましたが、出力のボーレートは 3840 です。 しかし、私の理解では、分割されていない場合、fPeriphはfSysであるはずなのに、なぜまだ起動値にあるのですか? 一連の命令の実行に要する時間を測定したところ、PLL速度を上げると時間が短縮され、120MHzに達したときに予想倍率の5に達しました。これにより、fCpuは120MHZであると確信しています。 Systickは変化せず、24MHzのままであることに注意してください。これも予想外だったので、おそらくこれは私が間違っていることについての手がかりを与えます。 シリアル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 クロックはシステム クロックから取得されます。 sys tick time 割り込みを使用して、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 bps のボー レートを取得する方法を示しています。

例えば:

周辺クロックは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

channel->FDR = モード |歩;

LinglingG_46_0-1704783410829.png

 

3: ASC モジュールが入力クロック fpin を取得します。

Fpin= Fperi/(1023/ステップ)=72000000/(1023/1017)=72000000/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:次に、以下の画面を参照してボーレートを取得できます。

FASC=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 クロックはシステム クロックから取得されます。 sys tick time 割り込みを使用して、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 bps のボー レートを取得する方法を示しています。

例えば:

周辺クロックは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

channel->FDR = モード |歩;

LinglingG_46_0-1704783410829.png

 

3: ASC モジュールが入力クロック fpin を取得します。

Fpin= Fperi/(1023/ステップ)=72000000/(1023/1017)=72000000/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:次に、以下の画面を参照してボーレートを取得できます。

FASC=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 リファレンス マニュアルを研究し、独自のコードを使用して機能を再現しようとしました。 この戦略は通常機能し、実際、間違ったボーレートでASCのデータ TESTBOARD_150PC_OUT を取得します。
ASCを正しくプログラムしたと思うので、fPeriphは予想される120MHzではなく24MHzであることを示唆しています。
これがどのように可能かはわかりませんが、明らかに可能です。
私が探しているのは、私が間違っているかもしれないことを提案する誰かです。
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 件の賞賛