?? sci_interrupt.c
字號(hào):
//===========================================================================
//
// 文件名稱: SCI_interrupt.c
//
// 功能描述: DSP28 SCI - 同計(jì)算機(jī)通信,采用超級(jí)中斷接受數(shù)據(jù)
// 間隔2秒DSP向計(jì)算機(jī)發(fā)送字符"2812-UART is fine !"
// SCI配置 : 波特率 9600 ,數(shù)據(jù)長(zhǎng)度 8 Bit , 無(wú)極性 , 1位停止位
// TX緩沖空觸發(fā)SCI-TX INT 中斷
// CPU CORE 定時(shí)器0中斷出發(fā)第一次傳輸
//===========================================================================
#include "DSP281x_Device.h"
// 使用的函數(shù)原型聲明
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內(nèi)核寄存器
Gpio_select(); // 配置GPIO復(fù)用功能寄存器
InitPieCtrl(); // 調(diào)用外設(shè)中斷擴(kuò)展初始化單元 PIE-unit ( 代碼 : DSP281x_PieCtrl.c)
InitPieVectTable(); // 初始化 PIE vector向量表 ( 代碼 : DSP281x_PieVect.c )
// 重新映射 PIE - Timer 0的中斷
EALLOW; // 解除寄存器保護(hù)
PieVectTable.TINT0 = &cpu_timer0_isr;
EDIS; // 使能寄存器保護(hù)
InitCpuTimers();
// 配置 CPU-Timer 0 周期50 ms:
// 150MHz CPU 頻率, 50000 微妙中斷周期
ConfigCpuTimer(&CpuTimer0, 150, 50000);
// 使能PIE內(nèi)的 TINT0 : Group 1 interrupt 7
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
// 使能 CPU INT1 (連接到CPU-Timer 0中斷)
IER = 1;
EALLOW; // 解除寄存器保護(hù)
PieVectTable.TXAINT = &SCI_TX_isr;
EDIS; // 使能寄存器保護(hù)
// 使能PIE內(nèi)的 SCI_A_TX_INT中斷
PieCtrlRegs.PIEIER9.bit.INTx2 = 1;
// 使能 CPU INT 9
IER |= 0x100;
// 全局中斷使能和更高優(yōu)先級(jí)的實(shí)時(shí)調(diào)試事件
EINT; // 全局中斷使能INTM
ERTM; // 使能實(shí)時(shí)調(diào)試中斷DBGM
CpuTimer0Regs.TCR.bit.TSS = 0; // 啟動(dòng)定時(shí)器0
SCI_Init();
while(1)
{
while(CpuTimer0.InterruptCount < 40) // 等待50ms * 40
{
EALLOW;
SysCtrlRegs.WDKEY = 0xAA; // 看門狗控制
EDIS;
}
CpuTimer0.InterruptCount = 0; // 復(fù)位計(jì)數(shù)器
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; // 設(shè)置所有 GPIO 輸入的量化值等于0
GpioMuxRegs.GPBQUAL.all = 0x0;
GpioMuxRegs.GPDQUAL.all = 0x0;
GpioMuxRegs.GPEQUAL.all = 0x0;
EDIS;
}
void InitSystem(void)
{
EALLOW;
SysCtrlRegs.WDCR= 0x00AF; // 配置看門狗
// 0x00E8 禁止看門狗,預(yù)定標(biāo)系數(shù)Prescaler = 1
// 0x00AF 不禁止看門狗, 預(yù)定標(biāo)系數(shù)Prescaler = 64
SysCtrlRegs.SCSR = 0; // 看門狗產(chǎn)生復(fù)位
SysCtrlRegs.PLLCR.bit.DIV = 10; // 配置處理器鎖相環(huán),倍頻系數(shù)為5
SysCtrlRegs.HISPCP.all = 0x1; // 配置高速外設(shè)時(shí)鐘分頻系數(shù): 2
SysCtrlRegs.LOSPCP.all = 0x2; // 配置低速外設(shè)時(shí)鐘分頻系數(shù): 4
// 使用的外設(shè)時(shí)鐘時(shí)鐘設(shè)置:
// 一般不使用的外設(shè)的時(shí)鐘禁止,降低系統(tǒng)功耗
SysCtrlRegs.PCLKCR.bit.EVAENCLK=0;
SysCtrlRegs.PCLKCR.bit.EVBENCLK=0;
SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1; // 使能SCI模塊的時(shí)鐘
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 停止位 無(wú)循環(huán)模式
// 無(wú)極性, 字符長(zhǎng)度:8 bits,
// 異步模式, 空閑線協(xié)議
SciaRegs.SCICTL1.all =0x0003; // 使能 TX, RX, 內(nèi)部 SCICLK,
// 禁止 RX ERR, SLEEP, TXWAKE
SciaRegs.SCIHBAUD = 487 >> 8 ; // 波特率:9600(LSPCLK = 37.5MHz) ;
SciaRegs.SCILBAUD = 487 & 0x00FF;
SciaRegs.SCICTL2.bit.TXINTENA = 1; // 使能SCI發(fā)送中斷
SciaRegs.SCICTL1.all =0x0023; // 使SCI退出復(fù)位
}
interrupt void cpu_timer0_isr(void)
{
CpuTimer0.InterruptCount++;
// 每個(gè)定時(shí)器中斷清除一次看門狗計(jì)數(shù)器
EALLOW;
SysCtrlRegs.WDKEY = 0x55; // 看門狗控制
EDIS;
// 響應(yīng)中斷并允許系統(tǒng)接收更多的中斷
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
//===========================================================================
// SCI_A 發(fā)送中斷服務(wù)程序
// 發(fā)送字符串 message[]
//===========================================================================
interrupt void SCI_TX_isr(void)
{
if (index < 26) SciaRegs.SCITXBUF=message[index++];
// 重新初始化PIE為下一次 SCI-A TX準(zhǔn)備接收下一次中斷
PieCtrlRegs.PIEACK.all = 0x0100; //響應(yīng)中斷
}
//===========================================================================
// 代碼結(jié)束.
//===========================================================================
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -