公告

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

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

cross mob
Translation_Bot
Community Manager
Community Manager
Community Manager

此代码适用于 XMC1300 驱动卡。 TSSOP38

 

 

#include "DAVE.h"
#include "xmc_common.h"
#include "xmc_gpio.h"
#include 


XMC_GPIO_CONFIG_t gpio_output_config = {
		.mode= XMC_GPIO_MODE_OUTPUT_PUSH_PULL,
		.output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH,
};

#define  XMC_SCU_CLOCK_PCLKSRC_MCLK 32000000
XMC_SCU_CLOCK_CONFIG_t clock_config;

int main(void)
{ /*PCLK = MCLK*/
clock_config.pclk_src=XMC_SCU_CLOCK_PCLKSRC_MCLK;
clock_config.fdiv = 0U; /**< Fractional divider */
clock_config.idiv = 0U; /**MCLK = 32MHz */
/* Configure FDIV, IDIV, PCLKSEL dividers*/
XMC_SCU_CLOCK_Init(&clock_config);
XMC_GPIO_Init(XMC_GPIO_PORT0, 4, &gpio_output_config);
while(1)
{
  XMC_GPIO_PORT0->OMR = 0x10001U << 4;
}
return 0;
}


 

此代码生成高达 1MHz 的时钟,但要求是生成 32MHz 的时钟。 请问有人建议CAN ?

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

嗨 @smart

根据我的理解,您提到  代码正在生成高达1MHz的时钟。你指的是哪个频率?是外设时钟频率吗?如果是,那么 CAN 请使用此命令获取PCLK ,XMC_SCU_CLOCK_GetPeripheralClockFrequency(), CAN 看到PCLK的频率为32MHz。

你指的是 GPIO 的频率吗?

最好的问候
Pradeep。

 

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

嗨 @ppn

我已经尝试了上面的建议,但没有变化,它仍然生成 1MHz。 我已经附上了编辑后的代码。 CAN 请您建议代码或问题?

此代码适用于 XMC1300 驱动卡。 TSSOP38

 

 

 

#include "DAVE.h"
#include "xmc_common.h"
#include "xmc_gpio.h"
#include 

XMC_GPIO_CONFIG_t gpio_output_config = {
		.mode= XMC_GPIO_MODE_OUTPUT_PUSH_PULL,
		.output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH,
};

#define  XMC_SCU_CLOCK_PCLKSRC_MCLK 32000000

int main(void)
/* Configure FDIV, IDIV, PCLKSEL dividers*/
XMC_SCU_CLOCK_GetPeripheralClockFrequency();
XMC_GPIO_Init(XMC_GPIO_PORT0, 4, &gpio_output_config);
while(1)
{
  XMC_GPIO_PORT0->OMR = 0x10001U << 4;
}
return 0;
}


 

 

此代码生成高达 1MHz 的时钟,但要求是生成 32MHz 的时钟。 请问有人建议CAN ?

0 点赞
lock attach
Attachments are accessible only for community members.
Translation_Bot
Community Manager
Community Manager
Community Manager

嗨 @smart

您尝试实现的频率是 32 MHz,这在 GPIO 切换中是不可能的,因为 CPU 以 32 MHz 运行,因此当您尝试切换 GPIO 时,需要一些时间来实现指令集,例如切换 GPIO 等,因此我们 CAN无法达到 32 MHz 的目标频率。

您 CAN 使用 CCU4 或 CCU8 单元,它们生成频率为 32 MHz、占空比为 50% 的 PWM 信号,这是您的用例。

请参考以下所附项目。

希望这会有所帮助,如果您需要更多信息,请告诉我。

最好的问候
Pradeep。

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

我不需要配置任何外围设备。 我只想制作一个简单的程序然后在 while 循环中切换 LED。 那个 while 回路应该在 (1/32MHz) 下运行,即 31.25ns。

但是就我而言,这是无法实现的。 CAN 我知道原因吗?

0 点赞
lock attach
Attachments are accessible only for community members.
Translation_Bot
Community Manager
Community Manager
Community Manager

嗨 @smart

我们知道你想以 32 MHz 的频率切换 LED,这可以通过生成 PWM 信号并将 PWM 的输出连接到主板上的用户 LED 来实现。

应将 PWM 配置为 32 MHz 频率和 50% 的占空比。

有关参考,请参阅以下附带项目,其中它以32 MHz的频率切换LED,这是您的用例。

以下项目是在 XMC 1300 启动套件上完成的,它以 32 MHz 的频率切换用户 LED 103。

接下来的问题是,为什么你无法通过切换 GPIO 来实现上述功能?

问题的答案是,XMC 1300 GPIO 在 32 MHz 的 fmCLK(主时钟频率)下运行。

因此,对于 M0 Cortex 执行指令通常需要一个时钟周期。

所以你使用的命令是 " XMC_GPIO_PORT1-> OMR = 0x < < 10001U 4 首先需要转换为装配级。"

稍后在 Disassembly 中,将执行以下三条指令,它们是

ppn_0-1691746191720.png

由于每条指令需要 1 个时钟周期,因此在 while 循环中使用的命令总共将消耗 3 个时钟周期。

对于切换 3 条指令,这意味着总共 3 个周期,作为回报,将频率降低 32/3 = 10.6 MHz,从 c 到汇编语言的转换需要一些时钟,所以这就是您 CAN无法通过切换 GPIO 实现 32 MHz 的原因。

希望这会有所帮助,如果您需要更多信息,请告诉我。

最好的问候
Pradeep。

0 点赞