主题中讨论的其他器件:C2000WARE
工具/软件:Code Composer Studio
大家好、
我有 一个用于 TMS320F280049 微控制器的定制板。 我将示例项目与支持新微控制器的 C200ware 结合使用。 头文件看起来是与开发板或其他器件一起使用的。 这是我发布的有关我的设计 https://e2e.ti.com/support/microcontrollers/c2000/f/171/p/673208/2478927#2478927的另一个主题。
我在从闪存运行代码时遇到困难、但是、它从 RAM 运行正常。 我已将变量".TI.ramfunc"更改为"ramfuncs"、以匹配所有其他微控制器系列。
我已将我的代码包含在此帖子中。
/包含的文件
//
#include "F28x_Project.h"
//
//定义
//
#define DEVICE_GPIO_PIN_LED1 12.
uint32_t NewVar=10;
//
//主函
//
void main (void)
{
//
memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、&RamfuncsLoadEnd -&RamfuncsLoadStart);
//初始化设备时钟和外设
//
InitSysCtrl(); 此函数在内部更改为使用内部振荡器" InitSysPll (INT_OSC2、19、1、1);"
//
//初始化 GPIO 并将 GPIO 引脚配置为推挽输出
//
InitGpio();
GPIO_SetupPinMux (DEVICE_GPIO_PIN_LED1、GPIO_MUX_CPU1、0);
GPIO_SetupPinOptions (DEVICE_GPIO_PIN_LED1、GPIO_OUTPUT、GPIO_PushPull);
//
//初始化 PIE 并清除 PIE 寄存器。 禁用 CPU 中断。
//
Dint;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//
InitPieVectTable();
NewVar = 12;
//
//启用全局中断(INTM)和实时中断(DBGM)
//
EINT;
ERTM;
NewVar = 13;
//
//永久循环
//
for (;;)
{
//
//打开 LED
//
GPIO_WritePin (DEVICE_GPIO_PIN_LED1、0);
//
//延迟一位。
//
DELAY_US (1000000);
//
//关闭 LED
//
GPIO_WritePin (DEVICE_GPIO_PIN_LED1、1);
NewVar = 15;
//
//延迟一位。
//
DELAY_US (1000000);
}
}
//
//文件结束
//
空 InitSysCtrl (空)
{
//
//禁用看门狗
//
DisableDog ();
#ifdef _flash
//
//将时间关键代码和闪存设置代码复制到 RAM
//这包括以下函数:InitFlash();
// RamfuncsLoadStart、RamfuncsLoadSize 和 RamfuncsRunStart
//符号由链接器创建。 请参阅器件.cmd 文件。
//
//memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);
memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、&RamfuncsLoadEnd -&RamfuncsLoadStart);
#endif
//
// PLLSYSCLK =(XTAL_OSC)*(IMULT + FULT)/(PLLSYSCLKDIV)
//
//InitSysPll (XTAL_OSC、IMULT_10、FULT_0、PLLCLK_by_2);
//InitSysPll (INT_OSC2、IMULT_19、FULT_0pt25、PLLCLK_by_2);
InitSysPll (INT_OSC2、19、1、1);
//
//调用闪存初始化以设置闪存等待状态
//此函数必须驻留在 RAM 中
//
InitFlash();
//
//打开所有外设
//
InitPeripheralClocks();
}
//
// InitFlash -此函数初始化闪存控制寄存器
//注意
//必须在 RAM 中执行此函数。 执行它
//超出 OTP/Flash 将产生不可预测的结果
//
#ifdef __cplusplus
#pragma CODE_SECTION ("ramfuncs");
#endif
空 InitFlash (空)
{
EALLOW;
//
//重置组和泵处于睡眠状态
//闪存访问将自动为组和泵加电
//闪存访问后,组和泵进入低功耗模式(可配置
//在 FBFALBACK/FPAC1寄存器中)-如果没有进一步的闪存访问
//为闪存组和泵加电、这也设置的回退模式
//闪存和泵激活
//
Flash0CtrlRegs.FPAC1.bit.PMPPWR = 0x1;
Flash0CtrlRegs.FBFALBACk.bit.BNKPWR0 = 0x3;
Flash0CtrlRegs.FBFALBACk.bit.BNKPWR1 = 0x3;
//
//在更改等待状态之前禁用缓存和预取机制
//
Flash0CtrlRegs.FRD_INTF_CTRL.bit.data_cache_EN = 0;
Flash0CtrlRegs.FRD_INTF_CTRL.bit.prefet_EN = 0;
//
//根据频率设置等待状态
//注意
//闪存操作所需的最小等待状态
//在给定的 CPU 速率下,必须由 TI 进行表征。
//有关最新信息,请参阅数据表。
//
#if CPU_FRQ_100MHz
if ((ClkCfgRegs.CLKSRCCTL1.bit.OSCCLKSRCSEL = 0x0)||
(ClkCfgRegs.CLKSRCCTL1.bit.OSCCLKSRCSEL == 0x2)||
(ClkCfgRegs.CLKSRCCTL1.bit.OSCCLKSRCSEL == 0x3))
{
Flash0CtrlRegs.FRDCNTL.bit.RWAIT = 0x5;
}
其他
{
Flash0CtrlRegs.FRDCNTL.bit.RWAIT = 0x4;
}
#endif
//
//启用缓存和预取机制以提高性能
/从闪存执行的代码。
//
Flash0CtrlRegs.FRD_INTF_CTRL.bit.data_cache_EN = 1;
Flash0CtrlRegs.FRD_INTF_CTRL.bit.prefet_EN = 1;
//
//复位时启用 ECC。 如果应用软件禁用了它
//以及应用程序是否再次希望启用 ECC
//
Flash0EccRegs.ecc_enable.bit.enable = 0xA;
EDIS;
//
//强制流水线清空以确保写入
//返回前发生最后配置的寄存器。
//
_asm (" RPT #7 || NOP");
}
//
// FlashOff -此函数关闭闪存
//注意
//必须在 RAM 中执行此函数。 执行它
//超出 OTP/Flash 将产生不可预测的结果。
//注意:闪存泵和闪存组断电后的闪存访问将会进行
//唤醒泵和组
//
#ifdef __cplusplus
#pragma CODE_SECTION ("ramfuncs");
#endif
空 FlashOff (空)
{
EALLOW;
//
//将备用电源模式配置为睡眠
//
Flash0CtrlRegs.FBFALBACk.bit.BNKPWR0 = 0;
Flash0CtrlRegs.FBFALBACk.bit.BNKPWR1 = 0;
//
//将备用电源模式配置为睡眠
//
Flash0CtrlRegs.FPAC1.bit.PMPPWR = 0;
EDIS;
}