一:G32R501介绍
G32R501 Micro-EVB评估板是基于G32R501实时控制MCU设计的一款最小系统演示板和开发平台,采用G32R501DRYT7(LQFP64)作为板载主控芯片,该芯片基于Arm(®)Cortex(®)-M52双核,支持双核并行工作,实现高效协同。 G32R501 Micro-EVB板载的Geehy-Link调试器可以进行快捷调试。此外,板上引出了标准化排针接口,支持扩展连接一个Geehy电机功率板用于评估电机驱动性能,方便用户快速上手进行开发和应用。
三:使用的编译器和调试方法
刚刚看到的时候就发现,需要使用Am Keil MDK(≥V5.40),为了方便,我使用的是最新的版本5.43,没想到的是最新的版本,刚刚安装极海的SDK包,就提示安装不上,当时上网查看,说的是新版本的keil,取消了直接安装的功能,可以使用在线安装,不过没有科学上网的情况下,还是比较麻烦的。后来上网查才知道,原来keil的支持包是支持导入的。方法如下图所示:依次点击图中的按钮,然后等待安装完成就可以了。
四:双核点灯配置过程
4.1 新建工程
这里为了更好的看到双核的效果,我将单核启动和双核启动放到的同一个工程里面,如下图所示:
为了方便区分,命名为G32501,G32R501_cpu0,G32R501_cpu1三个不同的名字,不过在某个情况下,还是依靠主核CPU0,即使是在双核的情况下,CPU1也是依靠CPU0运行的,只是双核启动的地址不同。4.2 cpu0 配置:
在原有的基础上新建一个CPU0的工程,配置.sct文件,选择双核配置。
然后配置调试器和只有cpu0的没有区别;
4.3 cpu1的配置
这里参考cpu0的配置,配置.sct文件,选择双核配置。
这里需要注意下配置下,CPU1的调试界面,我们可以参考官方的文档得知,CPU1是依靠CPU0下载BIN文件,所以CPU1无需自行下载,同时可以使用CPU0工程中调用CPU1的BIN文件就可以了,使用代码如下所示:
这里分享一下双核启动的分配情况如下所示:
五:代码编写过程:
5.1 单核代码
LED灯初始化的底层驱动函数:
/**************************************************************
* @brief LED初始化配置
*
* @param
* @retval
**************************************************************/
void LED_Init(uint32_t ledio, GPIO_CoreSelect core)
{
GPIO_setPadConfig(ledio, GPIO_PIN_TYPE_STD);
GPIO_setDrivingCapability(ledio,GPIO_DRIVE_LEVEL_VERY_HIGH);
GPIO_setQualificationMode(ledio, GPIO_QUAL_SYNC);
GPIO_setDirectionMode(ledio, GPIO_DIR_MODE_OUT);
GPIO_setMasterCore(ledio, core);
}配置板载的LED所使用的引脚,同时配置好IO口属于哪个核;void LED_Init(void)
{
WRPRT_DISABLE;
GPIO_setPinConfig(LED1_CONFIG);
GPIO_setPadConfig(LED1_IO, GPIO_PIN_TYPE_STD);
GPIO_setDrivingCapability(LED1_IO,GPIO_DRIVE_LEVEL_VERY_HIGH);
GPIO_setQualificationMode(LED1_IO, GPIO_QUAL_SYNC);
GPIO_setDirectionMode(LED1_IO, GPIO_DIR_MODE_OUT);
GPIO_setMasterCore(LED1_IO, GPIO_CORE_CPU0);
WRPRT_ENABLE;
}主程序如下所示:
int main()
{
Device_init();
HARDWARE_INIT();
while(1)
{
GPIO_togglePin(LED1_IO);
GPIO_togglePin(LED2_IO);
DelayMs(500);
}
return 1;
}烧录之后,可以看到板载的LED0,LED1以500MS的间隔闪烁。
5.2 双核启动配置:
5.2.1 CPU0的配置过程:
配置程序在CPU0启动,代码如下所示:
void CPU_SrartCPU0()
{
uint32_t cpu1_imageSize = 0;
uint32_t cpu1_imageStartAddr = 0;
cpu1_imageSize = (uint32_t)&Image$$ER_ROM_CPU1$$Length;
cpu1_imageStartAddr = (uint32_t)&Image$$ER_ROM_CPU1$$Base;
SysCtl_setCPU1BootAddress(cpu1_imageStartAddr);
SysCtl_enableBootCPU1();
}配置CPU0下载时候,加载CPU1的BIN文件,如下所示:
__attribute__((__used__, section("cpu1_code")))
void G32R501_incbin(void)
{
__asm(".incbin \"cpu1_image.bin\"");
}配置LED1所属于核0:void LED_Init(void)
{
WRPRT_DISABLE;
GPIO_setPinConfig(LED1_CONFIG);
GPIO_setPadConfig(LED1_IO, GPIO_PIN_TYPE_STD);
GPIO_setDrivingCapability(LED1_IO,GPIO_DRIVE_LEVEL_VERY_HIGH);
GPIO_setQualificationMode(LED1_IO, GPIO_QUAL_SYNC);
GPIO_setDirectionMode(LED1_IO, GPIO_DIR_MODE_OUT);
GPIO_setMasterCore(LED1_IO, GPIO_CORE_CPU0);
WRPRT_ENABLE;
}在程序中,添加LED的闪烁函数就可以了;5.2.2 CPU1的配置过程:
/**************************************************************
* @brief LED初始化配置
*
* @param
* @retval
**************************************************************/
void LED_Init(void)
{
WRPRT_DISABLE;
GPIO_setPinConfig(LED2_CONFIG);
GPIO_setPadConfig(LED2_IO, GPIO_PIN_TYPE_STD);
GPIO_setDrivingCapability(LED2_IO,GPIO_DRIVE_LEVEL_VERY_HIGH);
GPIO_setQualificationMode(LED2_IO, GPIO_QUAL_SYNC);
GPIO_setDirectionMode(LED2_IO, GPIO_DIR_MODE_OUT);
GPIO_setMasterCore(LED2_IO, GPIO_CORE_CPU1);
WRPRT_ENABLE;
}可以看到需要配置LED2,归属于CPU1核就可以了。
六:注意事项
在使用双核调试时候,由于CPU1核是依靠与CPU0核下载的,所以当我们修改CPU1的代码时候,需要编译完成后,同时修改到CPU0的工程下,进行下载;
在使用某个引脚的时候,需要注意配置下该引脚属于哪个核在调用。
我要赚赏金
