This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C129ENCPDT:TM4C129ENCPDT

Guru**** 2318830 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1524153/tm4c129encpdt-tm4c129encpdt

器件型号:TM4C129ENCPDT

工具/软件:

您好:

我一直在阅读关于使用 EPI 外设的知识、并注意到、有一些用例使用和不使用 UDMA。 我想知道 TI 推荐的方法是什么。 关于背景信息、我的设计使用 TI RTOS。 有一个 TCP 任务通过 POE 接口接收命令、EPI 提供一个从 MCU 到 Lattice FPGA 的接口。 FPGA 控制某些大功率继电器的状态、存在安全互锁装置和其他控制信号。

目前,我计划通过为 FPGA 中的"外设"创建一堆结构指针,然后将这些指针指向 EPI 内存空间中的地址来使用 EPI。 例如、下面列出了一个温度传感器、FPGA 通过类似 SPI 的接口定期轮询该传感器:

//类/结构

/*温度传感器外围数据结构*/

/*寄存器定义*/
typedef 结构

//lsb
uint8_t enable:1;//<设置后、外围设备已启用
uint8_t softRst:1;//<设置后、外设保持复位状态
uint8_t modeSelection : 3;//<每个数据表、选择操作模式
uint8_t tempDataFormat:3;//<每个数据表、选择温度数据格式
//MSB
}TempCtrlReg0Type;
typedef 联合体

TempCtrlReg0Type 位;
uint8_t 字节;
}TempCtrlReg0UseType;

typedef 结构

//lsb
uint8_t faultQueue:2;//<每个数据表、保存与故障相关的数据/设置
Uint8_t ctPinPolarity:1;//<根据数据表、设置 CT 引脚的极性
uint8_t intPinPolarity:1;//<每个数据表、设置 INT 引脚的极性
uint8_t intCtMode:1;//<每个数据表、设置模式
uint8_t shutdown:1;//<每个数据表、将传感器设置为关闭模式
uint8_t unused:1;//< unused bit
int8_t 分辨率:1;//<每个数据表、设置分辨率
//MSB
}TempCtrlReg1Type;
typedef 联合体

TempCtrlReg1Type 位;
uint8_t 字节;
}TempCtrlReg1UseType;

typedef 结构

//lsb
uint8_t unused:4;//<unused bits
Uint8_t tLOW:1;//<每个数据表、启用低温。 以上
uint8_t thigh:1;//<每个数据表、启用高温。 以上
uint8_t tCrt:1;//<每个数据表、启用临界温度。 以上
Uint8_t nRdy:1;///<每个数据表、nRdy 状态
//MSB
}TempStatusRegType;
typedef 联合体

TempStatusRegType 位;
uint8_t 字节;
}TempStatusRegUseType;

typedef 结构

//lsb
Uint16_t tempValue0:8;//<双字节值的 lsb 字节
uint16_t tempValue1:8;//<两字节值的 MSB 字节
//MSB
}TempValueRegType;
typedef 联合体

TempValueRegType 字节;
uint16_t 已满;
}TempValueRegUseType;

typedef 结构

//lsb
Uint16_t tempCritValue0:8;//<双字节值的 lsb 字节
Uint16_t tempCritValue1:8;//<两字节值的 MSB 字节
//MSB
}TempCritValueRegType;
typedef 联合体

TempCritValueRegType 字节;
uint16_t 已满;
}TempCritValueRegUseType;

typedef 结构

//lsb
uint8_t tHyst:4;
uint8_t unused:4;
}TempHysteResistRegType;
typedef 联合体

TempHystepResistRegType 位;
uint8_t 字节;
}TempHysteResistRegisterType;

typedef 结构

//lsb
Uint16_t tempHighValue0:8;//<双字节值的 lsb 字节
uint16_t tempHighValue1:8;//<两字节值的 MSB 字节
//MSB
}TempHighValueRegType;
typedef 联合体

TempHighValueRegType 字节;
uint16_t 已满;
}TempHighValueRegUseType;

typedef 结构

//lsb
Uint16_t tempLowValue0:8;//<双字节值的 lsb 字节
uint16_t tempLowValue1:8;//<两字节值的 MSB 字节
//MSB
}TempLowValueRegType;
typedef 联合体

TempLowValueRegType 字节;
uint16_t 已满;
}TempLowValueRegUseType;

/*温度传感器外设寄存器定义*/

typedef 结构

//lsb
TempCtrlReg0UseType tempCtrlReg0;
TempCtrlReg1UseType tempCtrlReg1;
TempStatusRegUseType tempStatusReg;
TempValueRegUseType tempValueReg;
TempCritValueRegUseType tempCritValueReg;
TempHysteRespRegUseType tempHysterValueReg;
TempHighValueRegUseType tempHighValueReg;
TempLowValueRegUseType tempLowValueReg;
//MSB
}温度传感器类型;

现在、我的计划实例化此类型的指针、并将其设置为等于 EPI 基址+此外设专用的偏移量。

TempSensorType* tempSense = EPWM_BASE + TEMP_SENSE_ADDR (<-这是 pseduo 代码、旨在传达概念、而不是实现)。  

完成此操作后、我只需要对此结构中的元素进行写入或读取、从而在 EPI 上进行写入或读取。 例如、如果我想在 FPGA 中启用此外设、我的代码将如下所示:

tempSense->tempCtrlReg0.bits.enable = 1;

同样道理、如果我想读取使能位所在的整个8位寄存器的值、也想这样做:

uint8_t cntrReg0Val = 0;

ctrlReg0Val = tempSense->tempctrlReg0.byte;

FPGA 中的这些外设将有10到15个、每个外设都将使用结构(和结构指针)来写入和读取 FPGA 内的特定地址位置。  

我的问题是使用 UDMA 会有好处吗? 我担心这些事务会花费太多时间、而其他任务(如 TCP 任务)的响应速度可能会降低。  

此外、如果我使用 UDMA、我是否必须使用 EPI FIFO、或者内存到内存的传输是否足够、以便对结构的元素进行写入/读取会导致对 EPI 进行相应的写入/读取?

谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Unknown 说:
    我的问题是使用 UDMA 会有好处吗? 我担心这些事务会花费太多时间、而其他任务(如 TCP 任务)的响应速度可能会降低。  [/报价]

    您好、Noah:

     我认为、如果使用 UDMA 有益、这取决于多个因素。 外设事务通常是单个而不是突发。 例如、写入以配置控制寄存器或读取外设数据寄存器。 您需要写入寄存器和读取寄存器的频率才能处理数据。 由于这些测试通常以非突发方式完成、并且您的 FPGA 中的外设不是连续的、因此我认为使用 UDMA 没有太多好处、但您需要自己试用。 假设 FPGA 中有一个外设 A 和一个外设 B、供您读取。 您可能需要创建两个不同的 RTOS 任务来读取这些外设。 每个任务可以按不同的间隔配置以启动读取、并且可能必须挂起、直到读取数据。 我不知道这将如何影响其余的任务。 与 读取 MCU 侧外设寄存器(速度很快)不同、从 FPGA 读取寄存器的速度要慢得多。 挂起任务的时间将更长、您需要考虑到这一点。  

    [报价 userid="589411" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1524153/tm4c129encpdt-tm4c129encpdt

    此外、如果我使用 UDMA、我是否必须使用 EPI FIFO、或者内存到内存的传输是否足够、以便对结构的元素进行写入/读取会导致对 EPI 进行相应的写入/读取?

    [/报价]

     是的、您可以使用软件启动的存储器在内部存储器和外部存储器之间进行存储器传输。