⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sci_interrupt.c

📁 dsp串口中断方式发送数据 需借助串口调试助手
💻 C
字号:
//===========================================================================
//
// 文件名称:	SCI_interrupt.c
//
// 功能描述:   DSP28 SCI - 同计算机通信,采用超级中断接受数据
//			   间隔2秒DSP向计算机发送字符"2812-UART is fine !"	
// SCI配置 :   波特率 9600 ,数据长度 8 Bit , 无极性 , 1位停止位
//             TX缓冲空触发SCI-TX INT 中断
//             CPU CORE 定时器0中断出发第一次传输	
//===========================================================================

#include "DSP281x_Device.h"

// 使用的函数原型声明

void Gpio_select(void);
void InitSystem(void);  
void SCI_Init(void);  
interrupt void cpu_timer0_isr(void);  
interrupt void SCI_TX_isr(void); 

// 全局变量
char message[]={"The F2812-UART is fine !\n\r"};
int index =0;			// 字符串指针     
 
void main(void)
{
	InitSystem();		// 初始化DSP内核寄存器

	Gpio_select();		// 配置GPIO复用功能寄存器

    
    InitPieCtrl();		// 调用外设中断扩展初始化单元 PIE-unit ( 代码 : DSP281x_PieCtrl.c)
	
	InitPieVectTable(); // 初始化 PIE vector向量表  ( 代码 : DSP281x_PieVect.c )
	
	// 重新映射 PIE -  Timer 0的中断 
	EALLOW;  // 解除寄存器保护
   	PieVectTable.TINT0 = &cpu_timer0_isr;
   	EDIS;    // 使能寄存器保护
	
	InitCpuTimers();
	
	// 配置 CPU-Timer 0 周期50 ms:
	// 150MHz CPU 频率, 50000 微妙中断周期
    ConfigCpuTimer(&CpuTimer0, 150, 50000);
    
    // 使能PIE内的 TINT0 : Group 1 interrupt 7
   	PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
    
	// 使能 CPU INT1 (连接到CPU-Timer 0中断) 
    IER = 1;
    
    EALLOW;	// 解除寄存器保护
	PieVectTable.TXAINT = &SCI_TX_isr;
	EDIS;       // 使能寄存器保护

    // 使能PIE内的 SCI_A_TX_INT中断
    PieCtrlRegs.PIEIER9.bit.INTx2 = 1;
    
    // 使能 CPU INT 9
    IER |= 0x100;	    
    
    // 全局中断使能和更高优先级的实时调试事件
   	EINT;   // 全局中断使能INTM
   	ERTM;   // 使能实时调试中断DBGM
   	
   	CpuTimer0Regs.TCR.bit.TSS = 0;  // 启动定时器0  
   	
	SCI_Init();
	while(1)
	{    
  	 	while(CpuTimer0.InterruptCount < 40)  // 等待50ms * 40
  	 	{ 
  		EALLOW;
    	SysCtrlRegs.WDKEY = 0xAA;		// 看门狗控制		
	   	EDIS;
	   	}     
	   	CpuTimer0.InterruptCount = 0;   // 复位计数器   
	   	index = 0;
	   	SciaRegs.SCITXBUF= message[index++]; 
	}
} 	


void Gpio_select(void)
{
	EALLOW;
	GpioMuxRegs.GPAMUX.all = 0x0;	// 所有 GPIO 端口配置为I/O
    GpioMuxRegs.GPBMUX.all = 0x0;   
    GpioMuxRegs.GPDMUX.all = 0x0;
    GpioMuxRegs.GPFMUX.all = 0x0;		 
    GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5 = 1; //配置  SCI-RX
    GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4 = 1; //配置  SCI-TX 
    GpioMuxRegs.GPEMUX.all = 0x0; 
    GpioMuxRegs.GPGMUX.all = 0x0;			
										
    GpioMuxRegs.GPADIR.all = 0x0;	  // GPIO PORT 配置为输入
    GpioMuxRegs.GPBDIR.all = 0x00FF;  // GPIO Port B15-B8  配置为输入 , B7-B0  配置为输出
    GpioMuxRegs.GPDDIR.all = 0x0;	  // GPIO PORT   配置为输入
    GpioMuxRegs.GPEDIR.all = 0x0;	  // GPIO PORT   配置为输入
    GpioMuxRegs.GPFDIR.all = 0x0;	  // GPIO PORT   配置为输入
    GpioMuxRegs.GPGDIR.all = 0x0;	  // GPIO PORT   配置为输入

    GpioMuxRegs.GPAQUAL.all = 0x0;	  // 设置所有 GPIO 输入的量化值等于0
    GpioMuxRegs.GPBQUAL.all = 0x0;
    GpioMuxRegs.GPDQUAL.all = 0x0;
    GpioMuxRegs.GPEQUAL.all = 0x0;
    EDIS;
}     

void InitSystem(void)
{
   	EALLOW;
   	SysCtrlRegs.WDCR= 0x00AF;		// 配置看门狗 
   									// 0x00E8  禁止看门狗,预定标系数Prescaler = 1
   									// 0x00AF  不禁止看门狗, 预定标系数Prescaler = 64
   	SysCtrlRegs.SCSR = 0; 			// 看门狗产生复位	
   	SysCtrlRegs.PLLCR.bit.DIV = 10;	// 配置处理器锁相环,倍频系数为5
    
   	SysCtrlRegs.HISPCP.all = 0x1;   // 配置高速外设时钟分频系数: 2
   	SysCtrlRegs.LOSPCP.all = 0x2;   // 配置低速外设时钟分频系数: 4
      	
   	// 使用的外设时钟时钟设置:
   	// 一般不使用的外设的时钟禁止,降低系统功耗   
   	SysCtrlRegs.PCLKCR.bit.EVAENCLK=0;
   	SysCtrlRegs.PCLKCR.bit.EVBENCLK=0;
   	SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1; // 使能SCI模块的时钟
   	SysCtrlRegs.PCLKCR.bit.SCIBENCLK=0;
   	SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=0;
   	SysCtrlRegs.PCLKCR.bit.SPIENCLK=0;
   	SysCtrlRegs.PCLKCR.bit.ECANENCLK=0;
   	SysCtrlRegs.PCLKCR.bit.ADCENCLK=0;
   	EDIS;
}

void SCI_Init(void)
{
	SciaRegs.SCICCR.all =0x0007;   	// 1bit 停止位    无循环模式 
                                   	// 无极性,       字符长度:8 bits,
                                   	// 异步模式,     空闲线协议
	SciaRegs.SCICTL1.all =0x0003;  	// 使能 TX, RX, 内部 SCICLK, 
                                   	// 禁止 RX ERR, SLEEP, TXWAKE
	SciaRegs.SCIHBAUD = 487 >> 8 ;  // 波特率:9600(LSPCLK = 37.5MHz) ; 
	SciaRegs.SCILBAUD = 487 & 0x00FF;
	SciaRegs.SCICTL2.bit.TXINTENA = 1;	// 使能SCI发送中断 	 
	SciaRegs.SCICTL1.all =0x0023;	    // 使SCI退出复位   
}  

interrupt void cpu_timer0_isr(void)
{
    CpuTimer0.InterruptCount++;
   	// 每个定时器中断清除一次看门狗计数器
   	EALLOW;
	SysCtrlRegs.WDKEY = 0x55;		// 看门狗控制
	EDIS;

   // 响应中断并允许系统接收更多的中断
   PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}             

//===========================================================================
// SCI_A 发送中断服务程序
// 发送字符串 message[] 
//===========================================================================
interrupt void SCI_TX_isr(void)
{
	if (index < 26) SciaRegs.SCITXBUF=message[index++];
	// 重新初始化PIE为下一次 SCI-A TX准备接收下一次中断
    PieCtrlRegs.PIEACK.all = 0x0100;   //响应中断
}

//===========================================================================
// 代码结束.
//===========================================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -