专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
DSP
SCI中断方式
2019-07-13 15:15
发布
生成海报
站内文章
/
DSP
9538
0
1098
//===========================================================================
//
// 文件名称: 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;
//响应中断
}
//===========================================================================
// 代码结束.
//===========================================================================
Ta的文章
更多
>>
99se PCB 镜像
0 个评论
百人实战中的项目
0 个评论
SCI中断方式
0 个评论
嵌入式Linux下串口编程(一)
0 个评论
热门文章
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮