这个源文件实际上包含该项目的入口函数main函数。
那么如何找到入口函数呢?
可以进入debug的simulator模式,选中run to main(),
当执行完启动文件startup_cm3.s后就进入了main函数(注意在main函数之前还进入了SystemInit函数),
如下图所示:


这个main函数主要架构如下:
int main(void)
{
HW_Init(); /*PDI(过程数据接口)初始化,这里用的是MCI接口*/
MainInit(); /*主函数初始化包含:ESC 和COE */
bRunApplication = TRUE; /*处于运行状态标志*/
do
{
MainLoop(); /*主循环函数,实现周期性和非周期性数据交换*/
} while (bRunApplication == TRUE); /*检查是否处于运行状态*/
HW_Release(); //无意义的函数
return 0; //设置正确返回
}
下面来依次看各个函数。
HW_Init(void)函数,定义了PDI接口,定义了ESC到PDI中断的映射:
ESC的PDI(过程数据接口)有这几种情况:
1. Up to 32 bit digital I/O——32位数字量I/O
2. Serial Peripheral Interface ——SPI总线
3. 8/16-bit synchronous/asynchronous Microcontroller Interface ——MCI接口
4. With FPGA, specific on-board-bus——带FPGA的,特定的on-board-bus
在倍福的手册中也可以看到0x0140寄存器描述了PDI过程数据接口的几种情况。

过程数据和参数是通过ESC上的DPRAM来交互的。为了保证数据的一致性,ESC硬件上会有一些 机制,比如同步管理器等。
HW_Init函数的解读也可以参考 https://blog.csdn.net/qq_15157841/article/details/51789250
UINT16 HW_Init(void)
{
UINT32 intMask = 0;
pEsc = (unsigned short *)ESC100StartAddress; //(unsigned short)MAKE_PTR_TO_ESC;定义指针pEsc,指向ESC物理内存起始地址
UINT16 u16PdiCtrl = 0;
/* we have to wait here, until the ESC is started */
do
{
HW_EscReadWord(u16PdiCtrl,ESC_PDI_CONTROL_OFFSET);//ESC_PDI_CONTROL_OFFSET==0x0140
} while (((u16PdiCtrl & 0xFF) < 0x8) || ((u16PdiCtrl & 0xFF) > 0xD) );//过程数据接口需要是MCI接口
HW_EscWriteDWord(intMask, ESC_AL_EVENTMASK_OFFSET);//ESC_AL_EVENTMASK_OFFSET==0x0204 AL Event masking of the AL Event Request register Events for mapping to PDI IRQ signal
/* enable the ESC-interrupt microcontroller specific,
the macro ENABLE_ESC_INT should be defined in ecat_def.h */
//------------ENABLE_ESC_INT();
return 0;
}
其中0x0204寄存器定义如下:

MainInit(void)函数,定义了EtherCAT从站接口,COE(CANopen Over EtherCAT)相关的配置。
/
/**
\param pO

本文详细介绍了嵌入式系统的启动流程,包括入口函数main函数的架构与工作原理,以及关键函数如HW_Init和MainInit的具体实现。此外,还深入探讨了EtherCAT从站接口的初始化过程。

1384

被折叠的 条评论
为什么被折叠?



