主题中讨论的其他器件: C2000WARE
帮助我分配 TMS320F280021的内存
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.
帮助我分配 TMS320F280021的内存

//########################################################################################################################
//
//文件:device.c
//
//标题:示例的器件设置。
//
//########################################################################################################################
//
//
//版权所有:
//版权所有(C) 2022德州仪器(TI)公司- http://www.ti.com/
//
//以源代码和二进制形式重新分发和使用,有无
//如果满足以下条件,则允许进行修改
//满足:
//
//重新分发源代码必须保留上述版权
//注意、此条件列表和以下免责声明。
//
//二进制形式的重新分发必须复制上述版权
//注意、中的条件列表和以下免责声明
//随提供的文档和/或其他材料
//分布。
//
//德州仪器公司的名称和的名称都不是
//其贡献者可用于认可或推广衍生产品
//未经特定的事先书面许可,从该软件下载。
//
//本软件由版权所有者和作者提供
//“原样”以及任何明示或暗示的保证,包括但不包括
//限于对适销性和适用性的暗示保证
//一个特定的目的是免责的。 在任何情况下、版权均不得
//所有者或贡献者应对任何直接、间接、偶然、
//特殊、典型或必然的损害(包括但不包括)
//仅限于采购替代货物或服务;
//数据或利润;或业务中断)
//责任理论,无论是合同责任、严格责任还是侵权行为
//(包括疏忽或其他)以任何方式因使用而产生
//此软件,即使已被告知可能会发生此类损坏。
//$
//########################################################################################################################
//
//包含的文件
//
#include "device.h"
#include "driverlib.h"
#ifdef __cplusplus
使用 std::memcpy;
#endif
//
//
//函数来初始化器件。 主要将系统控制初始化为
//通过禁用看门狗、设置 SYSCLKOUT 频率、
和启用外设的时钟。
//
//注意:如果 XTAL 用作 PLL 源,建议调用
//配置 PLL 之前的 Device_verifyXTAL ()
//
//
void Device_init (void)
{
//
//禁用看门狗
//
sysctl_disableWatchdog();
//#ifdef _flash
//
//将时间关键代码和闪存设置代码复制到 RAM。 这包括
//以下函数:InitFlash();
//InitFlash();
// RamfuncsLoadStart、RamfuncsLoadSize 和 RamfuncsRunStart 符号
//由链接器创建。 请参阅器件.cmd 文件。
//
memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);
//
//调用闪存初始化以设置闪存等待状态。 此函数必须执行的操作
//驻留在 RAM 中。
//
Flash_initModule (FLASH0CTRL_base、FLASH0ECC_BASE、DEVICE_FLASH_WAITSTATES);
//#endif
//
//设置 PLL 控制和时钟分频器
//
SYSCTL_setclock (device_setClock_CFG);
//
//确保将 LSPCLK 分频器设置为默认值(4分频)
//
SYSCTL_setLowSpeedClock (SYSCTL_LSPCLK_PRESALE_4);
//
//这些断言将检查中针对时钟速率的#defines
// device.h 与已配置的实际速率匹配。 如果有的话
//不匹配,请检查 DEVICE_SYSCLK_FREQ 和的计算结果
// DEVICE_LSPCLK_FREQ 是精确的。 一些示例不会执行为
//如果这些不正确则为预期值。
//
assert (SYSCTL_getClock (DEVICE_OSCSRC_FREQ)== DEVICE_SYSCLK_FREQ);
assert (SYSCTL_getLowSpeedClock (DEVICE_OSCSRC_FREQ)== DEVICE_LSPCLK_FREQ);
//#ifndef _FLASH
//
//使用调试器运行时调用 Device_cal 函数
//此函数作为引导代码的一部分调用。 函数被调用
//在 Device_init 函数中、由于在调试期间会重置启动代码
//将不会执行,GEL 脚本将重新初始化所有
//寄存器和校准值将丢失。
// SYSCTL_deviceCal 是 Device_Cal 的包装程序函数
//
//sysctl_deviceCal ();
//#endif
//
//打开所有外设
//
device_enableAllPeripheral();
//
//锁定 VREGCTL 寄存器
//该器件不支持寄存器 VREGCTL。 它锁定到
//禁止对该寄存器进行任何写操作
//
ASysCtl_lockVREG ();
}
//
//
//函数打开所有外设、支持对进行读取和写入
//外设的寄存器。
//
//请注意,要降低功耗,应禁用未使用的外设。
//
//
void Device_enableAllPeripherals (空)
{
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_DMA);
SYSCTL_enablePeripheral (SYSCTL_PERIPH_CLK_TIMER0);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_Timer1);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_TIMER2);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_CPUBGCRC);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_HRCAL);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_TBCLKSYNC);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_ERAD);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_EPWM1);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_EPWM2);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_EPWM3);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_EPWM4);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_EPWM5);
SYSCTL_enablePeripheral (SYSCTL_PERIPH_CLK_EPWM6);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_EPWM7);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_ECAP1);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_ECAP2);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_ECAP3);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_EQEP1);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_EQEP2);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_SCIA);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_SPIA);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_SPIB);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_I2CA);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_I2CB);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_CANA);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_ADCA);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_ADCC);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_CMPSS1);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_CMPSS2);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_CMPSS3);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_CMPSS4);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_FSITXA);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_FSIRXA);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_Lina);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_LINB);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_PMBUSA);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_DCC0);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_DCC1);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_CLB1);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_CLB2);
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_HICA);
}
//
//
//功能可禁用 GPIO 上的引脚锁定和启用上拉。
//
//
void Device_initGPIO (void)
{
//
//禁用引脚锁定。
//
GPIO_unlockPortConfig (GPIO_PORT_A、0xFFFFFFFF);
GPIO_unlockPortConfig (GPIO_PORT_B、0xFFFFFFFF);
GPIO_unlockPortConfig (GPIO_PORT_H、0xFFFFFFFF);
}
//
//
//函数来验证 XTAL 频率
// freq 是以 MHz 为单位的 XTAL 频率
//如果实际的 XTAL 频率与匹配,该函数返回 true
//输入值
//
//请注意、此函数假定 PLL 尚未配置和
//因此使用 SYSCLK freq = 10MHz 来计算 DCC
//
//
bool Device_verifyXTAL (float freq)
{
//
//使用 DCC 以 INTOSC2作为参考时钟来验证 XTAL 频率
//
//
//打开 XTAL 并等待它使用 X1CNT 加电
//
SYSCTL_TurnOnOsc (SYSCTL_OSCSRC_XTAL);
SYSCTL_clearExternalOscCounterValue();
while (sysctl_getExternalOscCounterValue ()!= sysctl_X1CNT_X1CNT_M);
//
//启用 DCC0时钟
//
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_DCC0);
//
//启用外设时钟后插入至少5个周期的延迟
//
asm (" RPT #5 || NOP");
//
//将 XTAL 配置为 CLKSRC0、将 INTOSC2配置为 CLKSRC1
// Fclk0 = XTAL 频率(输入参数)
// Fclk1 = INTOSC2频率= 10MHz
//
//将 DCC 误差容差配置为+/-1%
// INTOSC2的频率变化可以为+/-10%
//
//假设 PLL 尚未配置,SYSCLK 频率= 10MHz
//
//注意:根据需要更新容差和 INTOSC2频率差异。
//
返回(DCC_verifyClockFrequency (DCC0_BASE、
DCC_COUNT1SRC_INTOSC2、10.0F、
DCC_COUNT0SRC_XTAL、FREQ、
1.0F、10.0F、10.0F);
}
//
//
//违反断言时要调用的错误处理函数
//
//
void __error__(const char *文件名、uint32_t 行)
{
//
//断言条件被计算为 false。 您可以使用文件名和
//行参数来确定出现了什么问题。
//
ESTOP0;
}