主题:SysConfig 中讨论的其他器件
工具/软件:
尝试将 GPMC 设置为 3 个不同区域、 CS0 上为 32 位 32Meg、CS1 上为 16 位 32Meg、CS2 上为 32 位 64Meg。 我只能使最后一个配置正常工作。
由于 SysConfig 不允许根据需要进行配置、因此我创建了一个示例、然后使用它创建一个例程来支持这 3 个部分:
/************************************************************************ /
void Drivers_gpmcOpen (void){
uint32_t instCnt;
int32_t 状态= SystemP_Success;
gpcm_init();
GPMC_clockEnable ();
GPMC_clockSetFrequency ();
对于 (instCnt = 0u;instCnt < CONFIG_GPMC_NUM_instances;instCnt++){
gGpmcHandle[instCnt]= NULL;/*初始化为 NULL 以便我们可以正常退出*/
}
/*打开所有实例*/
对于 (instCnt = 0U;instCnt < gGpmcConfigNum;instCnt++){
gGpmcHandle[instCnt]= GPMC_OPEN (instCnt、&gGpmcParams[instCnt]);
if (NULL == gGpmcHandle[instCnt]){
状态= SystemP_FAILURE;
休息;
}
if (GPMC_setDeviceType (gGpmcHandle[instCnt])!= SystemP_Success){
状态= SystemP_FAILURE;
休息;
}
if (GPMC_setDeviceSize (gGpmcHandle[instCnt])!= SystemP_Success){
状态= SystemP_FAILURE;
休息;
}
if (GPMC_configureTimingParameters (gGpmcHandle[instCnt])!= SystemP_Success){
状态= SystemP_FAILURE;
休息;
}
}
if (SystemP_FAILURE == status){
drivers_gpmcClose ();/*正常退出*/
}
返回;
}
/************************************************************************ /
问题是,我只能得到最后一个项目的工作,如果我做了一次一个,这些部分工作,但做更多,只有最后一个工作. (无论顺序如何)。
在深入探究后、我发现 GPMC_OPEN 称为例程
静态 int32_t GPMC_PROGRAMInstance(GPMC_HANDLE 配置)
路由顶部是一个复位器件:
/*重置 GPMC */
CSL_REG32_fins (hwAttrs->gpmcBaseAddr + CSL_GPMC_SYSCONFIG、GPMC_SYSCONFIG_SOFTRESET、CSL_GPMC_GPMC_GPMC_SYSCONFIG_SOFTRESET_RESET);
STATUS += GPMC_MODULEResetStatusWaitTimeout (CONFIG、GPMC_MODULE_RESET_WAIT_TIME_MAX);
因此、每次调用 GPMC_Open(对于 3 个实例我需要这样做)时、器件都会复位。
为了纠正这个问题、 我添加了一个静态标志、只允许在第一次调用时复位器件。
+ STATIC INT RESET_DONE = 0;
然后、在执行复位的 2 行代码周围、将替换为以下代码:
+ if (RESET_DONE == 0) //仅在第一个实例时复位
+ {
/*重置 GPMC */
CSL_REG32_fins (hwAttrs->gpmcBaseAddr + CSL_GPMC_SYSCONFIG、GPMC_SYSCONFIG_SOFTRESET、CSL_GPMC_GPMC_GPMC_SYSCONFIG_SOFTRESET_RESET);
STATUS += GPMC_MODULEResetStatusWaitTimeout (CONFIG、GPMC_MODULE_RESET_WAIT_TIME_MAX);
+ RESET_DONE = 1;
+ }
这解决了问题、所有区域都能正常工作。
我发现的只是一个小的 FYI。