一、文件准备
首先需要安装controlSUITE,参考Code Composer Studio 问题笔记中的问题三
注意安装目录,下面需要用到!
二、建立工程
1.新建工程
2.移植文件
添加源include文件
分别从目录:
\controlSUITE\device_support\F2837xS\v210\F2837xS_common
\controlSUITE\device_support\F2837xS\v210\F2837xS_headers
中复制include文件夹至工程目录下
右键点击项目浏览器中的项目名,打开Properties(属性),直接在对话框中输入
${PROJECT_ROOT}/include
表示工程文件夹中的include文件夹
添加源source文件
分别从目录:
\controlSUITE\device_support\F2837xS\v210\F2837xS_common
\controlSUITE\device_support\F2837xS\v210\F2837xS_headers
复制source文件夹至工程目录下
添加cmd文件
在工程目录下创建CMD文件夹,顺便将2837x_FLASH_lnk.cmd文件删除
从目录:
\controlSUITE\device_support\F2837xS\v210\F2837xS_common\cmd
中复制2837xS_Generic_FLASH_lnk和2837xS_Generic_RAM_lnk文件
从目录:
\controlSUITE\device_support\F2837xS\v210\F2837xS_headers\cmd
中复制F2837xS_Headers_nonBIOS
至刚创建的创建CMD文件夹中
三、main编写测试
我把我用LED灯闪烁的程序放在下面,因板子不同,实际引脚可能需要修改
//#include "F2837xS_device.h"
//#include "F2837xS_Examples.h" // F2837xD Examples Include File
#include "F28x_Project.h"
void GPIO_Setup(void);
__interrupt void cpu_timer0_isr(void);
void spi_xmit(Uint16 a);
void spi_fifo_init(void);
void spi_init(void);
void error(void);
void Bsp_SpiSendRecv(int Len);
#define LED1_ON GpioDataRegs.GPASET.bit.GPIO24 = 1 //GPIO0置高
#define LED1_OFF GpioDataRegs.GPACLEAR.bit.GPIO24 = 1 //GPIO置低
#define LED2_ON GpioDataRegs.GPASET.bit.GPIO25 = 1
#define LED2_OFF GpioDataRegs.GPACLEAR.bit.GPIO25 = 1
#define LED3_ON GpioDataRegs.GPASET.bit.GPIO26 = 1
#define LED3_OFF GpioDataRegs.GPACLEAR.bit.GPIO26 = 1
#define LED4_ON GpioDataRegs.GPASET.bit.GPIO27 = 1
#define LED4_OFF GpioDataRegs.GPACLEAR.bit.GPIO27 = 1
Uint16 sdata[16]={0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008}; // send data
Uint16 rdata[16]={0}; // received data
int i=0;
void main(void)
{
// Step 1. 初始化系统,锁相环,看门狗,外设时钟
InitSysCtrl();
//
FALSH烧写配置
#ifdef _FLASH
InitFlash();
#endif
// Step 2. 初始化GPIO:
InitGpio();
GPIO_Setup();
// InitSpibGpio();
spi_fifo_init(); // Initialize the SPI FIFO
// Step 3. 清除所有中断;初始化中断向量表;禁止CPU中断。
DINT;
// 初始化PIE控制寄存器至默认状态,默认状态所有PIE中断被禁止;所有标志位被清除。
InitPieCtrl();
// 禁止所有CPU中断,清除CPU中断相关标志位。
IER = 0x0000;
IFR = 0x0000;
// 初始化中断向量表,中断向量表就是采用指针指向中断服务程序入口地址
InitPieVectTable();
EALLOW; // This is needed to write to EALLOW protected registers// 写保护
PieVectTable.TIMER0_INT = &cpu_timer0_isr;//取 cpu_timer0_isr 地址赋值给TIMER0_INT 中断向量
EDIS;//关闭保护
InitCpuTimers(); // For this example, only initialize the Cpu Timers//初始化 CPU 中断
// Configure CPU-Timer 0, 1, and 2 to interrupt every second:
// 200MHz CPU Freq, 1 second Period (in uSeconds)选择定时器,CPU频率,定时器周期(单位us)
ConfigCpuTimer(&CpuTimer0, 200, 1000000);
CpuTimer0Regs.TCR.all = 0x4000;// 对定时器 0 控制寄存器设置,使能定时器中断
IER |= M_INT1;//使能第 1 组中断
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;//使能第 1 组中断的第 7 个小中断,即定时器0
Enable global Interrupts and higher priority real-time debug events:
EINT; //使能全局中断
ERTM; // 使能全局中断实时调试
// Step 6. 循环
while(1)
{
// Bsp_SpiSendRecv(8);
// for(i=0;i<8;i++)
// {
// spi_xmit(sdata[i]);
// rdata[i] = SpibRegs.SPIRXBUF;
// }
// DELAY_US(1000*500);
// for(i=0;i<8;i++)
// {
// spi_xmit(rdata[i]);
// }
LED2_ON;
DELAY_US(1000*500);
LED2_OFF;
DELAY_US(1000*500);
//
// if(rdata[0] == 0x0001)
// {GpioDataRegs.GPATOGGLE.bit.GPIO24 = 1;}
// if(rdata[1] == 0x0001)
// {GpioDataRegs.GPATOGGLE.bit.GPIO25 = 1;}
// if(rdata[2] == 0x0001)
// {GpioDataRegs.GPATOGGLE.bit.GPIO26 = 1;}
}
}
//void Bsp_SpiSendRecv(int Len)
//{
// Uint16 i;
// for ( i=0;i<Len;i++ )
// {
// SpiaRegs.SPITXBUF=rdata[i]; //发送数据
// while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) { } //接收FIFO为空时,等待!
// rdata[i] = SpiaRegs.SPIRXBUF;
// }
//}
void GPIO_Setup() //配置GPIO的功能
{
GPIO_SetupPinMux(24, GPIO_MUX_CPU1, 0);//对引脚0设置;选择CPU1为内核,选择外设功能0
GPIO_SetupPinOptions(24, GPIO_OUTPUT, GPIO_PUSHPULL);//GPIO0,作为输出,上拉
GPIO_SetupPinMux(25, GPIO_MUX_CPU1, 0);
GPIO_SetupPinOptions(25, GPIO_OUTPUT, GPIO_PUSHPULL);
GPIO_SetupPinMux(26, GPIO_MUX_CPU1, 0);
GPIO_SetupPinOptions(26, GPIO_OUTPUT, GPIO_PUSHPULL);
GPIO_SetupPinMux(27, GPIO_MUX_CPU1, 0);
GPIO_SetupPinOptions(27, GPIO_OUTPUT, GPIO_PUSHPULL);
}
void cpu_timer0_isr(void)//定时器0中断函数
{
CpuTimer0.InterruptCount++;
// Acknowledge this interrupt to receive more interrupts from group 1 确认此中断以接收来自组1的更多中断
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
// GpioDataRegs.GPATOGGLE.bit.GPIO24 = 1;
// GpioDataRegs.GPATOGGLE.bit.GPIO25 = 1;
// GpioDataRegs.GPATOGGLE.bit.GPIO26 = 1;
GpioDataRegs.GPATOGGLE.bit.GPIO27 = 1;
}
//
// error - Error function that halts the debugger
//
void error(void)
{
asm(" ESTOP0"); // Test failed!! Stop!
for (;;);
}
//
// spi_xmit - Transmit value via SPI
//
void spi_xmit(Uint16 a)
{
SpibRegs.SPITXBUF = a;
}
//
// spi_fifo_init - Initialize SPIA FIFO
//
void spi_fifo_init()
{
// Initialize SPI FIFO registers
//
SpibRegs.SPIFFTX.all = 0xE040;//使能SPIFIFO功能;TXFIFO复位;清除 TXFF INT 中断位;TXFIFO 中 断不使能;
SpibRegs.SPIFFRX.all = 0x204f;//重新使能接收 FIFO 操作;清RXFIFO中断标志位;中断不使能。
SpibRegs.SPIFFCT.all = 0x0;//这个寄存器是设置FIFO延时的,不需要用到。
// Initialize core SPI registers
SpibRegs.SPIFFRX.bit.RXFIFORESET=1;
}
如有不足,欢迎大家指教!