tms320f28335 串口中断
时间: 2023-12-30 17:00:28 浏览: 132
TMS320F28335是一款数字信号处理器(DSP),它具有丰富的外设功能,包括串口通信功能。串口通信是一种常用的数据传输方式,可以实现设备之间的数据交换与通信。
TMS320F28335中的串口通信功能是通过中断来实现的。中断是一种处理器的特殊指令,当特定事件发生时,会中断正常的程序执行,转而执行中断服务程序。串口中断就是当接收到或发送完成一个字节的数据时,处理器会中断当前的程序执行,转而执行串口中断服务程序。
要使用TMS320F28335的串口中断功能,首先需要配置串口通信的参数,如波特率、数据位宽等。然后,需要编写中断服务程序,即处理接收或发送数据的具体操作。可以根据需求选择中断类型,如接收中断、发送中断或接收/发送中断等。
在中断服务程序中,可以通过读取或写入相应的寄存器与串口进行数据交互。例如,可以通过读取接收缓冲寄存器来获取接收到的数据,或者通过写入发送缓冲寄存器来发送数据。
使用串口中断可以更好地处理数据的实时性和可靠性,能够充分利用处理器的性能。通过合理地设计中断服务程序,可以实现稳定高效的数据传输和通信。
总结来说,TMS320F28335的串口中断功能能够实现可靠的数据传输与通信。通过配置串口参数和编写中断服务程序,可以灵活地使用串口中断功能,满足各种应用需求。
相关问题
tms320f28027 中断优先级_TMS320F28027 自带串口中断收发数据例子
关于TMS320F28027中断优先级,中断优先级是通过IPC(Interrupt Priority Control)模块控制的。IPC模块包括两个寄存器:IPC0和IPC1,它们分别用于控制CPU中断和DMA中断的优先级。
IPC0中的每个位表示一个中断源,位0表示IPC0中断源的最高优先级,位31表示IPC0中断源的最低优先级。IPC1中的每个位表示一个DMA中断源,位0表示IPC1中断源的最高优先级,位31表示IPC1中断源的最低优先级。
TMS320F28027自带了多个串口,其中SCI(串行通信接口)是最常用的。下面是一个SCI中断收发数据的例子:
```
#include "F2802x_Device.h"
interrupt void sciaRxIsr(void);
interrupt void sciaTxIsr(void);
Uint16 ReceivedCount;
Uint16 TransmitCount;
char ReceivedData[16];
char TransmitData[16] = "Hello, World!\r\n";
void main(void)
{
InitSysCtrl();
InitSciaGpio();
InitScia();
InitPieCtrl();
InitPieVectTable();
EnableInterrupts();
while(1)
{
// Do nothing
}
}
void InitScia()
{
// Initialize SCI-A
SciaRegs.SCICCR.all = 0x0007;
SciaRegs.SCICTL1.all = 0x0003;
SciaRegs.SCICTL2.all = 0x0000;
SciaRegs.SCICTL2.bit.TXINTENA = 1;
SciaRegs.SCICTL2.bit.RXBKINTENA = 1;
SciaRegs.SCIHBAUD.all = 0x0000;
SciaRegs.SCILBAUD.all = 0x0027;
SciaRegs.SCICTL1.all = 0x0023;
}
void InitSciaGpio()
{
// Initialize SCI-A GPIO
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0;
GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0;
GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3;
GpioCtrlRegs.GPAQSEL2.bit.GPIO29 = 3;
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1;
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1;
EDIS;
}
interrupt void sciaRxIsr(void)
{
// Receive data from SCI-A
ReceivedData[ReceivedCount++] = SciaRegs.SCIRXBUF.all;
// Echo back received data
SciaRegs.SCITXBUF.all = ReceivedData[ReceivedCount-1];
// Clear RX interrupt flag
PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
}
interrupt void sciaTxIsr(void)
{
// Transmit data through SCI-A
if(TransmitCount < sizeof(TransmitData))
{
SciaRegs.SCITXBUF.all = TransmitData[TransmitCount++];
}
else
{
SciaRegs.SCICTL2.bit.TXINTENA = 0;
}
// Clear TX interrupt flag
PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
}
```
在这个例子中,我们使用SCI-A进行串口通信。在InitScia函数中,我们初始化了SCI-A的控制寄存器和波特率寄存器。在InitSciaGpio函数中,我们将SCI-A的引脚配置为GPIO模式,并设置了输入/输出上拉器和中断模式。在main函数中,我们启用了中断,并且在一个无限循环中等待中断发生。
在sciaRxIsr中断服务程序中,我们接收了从SCI-A收到的数据,并通过SCI-A将接收到的数据回显。在sciaTxIsr中断服务程序中,我们发送了一个包含“Hello, World!”字符串的数据包,并在发送完成后禁用了TX中断。
请注意,这只是一个基本的例子,实际应用中需要根据具体情况进行修改和优化。
1. 写出相关 C 语言指令,完成以下任务: (1)将 TMS320F28335 的引脚 GPIO0 设置为普通输出引脚、使能上拉电阻,并 将该引脚输出电平设置为高电平; (2)将 TMS320F28335 的引脚 GPIO1 设置为 ePWM1 模块的 EPWMB 信号输出 引脚。 2. 将 TMS320F28335 的 SCIA 串口的波涛率设置为 115200 波特。假设低速外设 时钟 LSPCLK 的频率是 37.5MHz。请写出相关数据的计算过程及 C 语言指令。 3. 利用 TMS320F28335 的 ADC 模块采集 8 个通道的模拟量输入信号,假设采集 顺序为:A7、A4、A6、A5、A2、B2、B0、A3。要求:采用级联、顺序采样方 式。请写出相关 C 语言指令,按上要求完成 ADC 模块配置。
1.
(1)将 TMS320F28335 的引脚 GPIO0 设置为普通输出引脚、使能上拉电阻,并将该引脚输出电平设置为高电平:
```
//配置GPIO0为普通输出引脚
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; //设置为输出引脚
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0; //使能上拉电阻
//将GPIO0输出电平设置为高电平
GpioDataRegs.GPASET.bit.GPIO0 = 1;
```
(2)将 TMS320F28335 的引脚 GPIO1 设置为 ePWM1 模块的 EPWMB 信号输出引脚:
```
//配置GPIO1为ePWM1模块的EPWMB信号输出引脚
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; //设置为复用功能
GpioCtrlRegs.GPAGMUX1.bit.GPIO1 = 0; //选择复用功能为EPWMB
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0; //禁用上拉电阻
```
2. 将 TMS320F28335 的 SCIA 串口的波涛率设置为 115200 波特。假设低速外设时钟 LSPCLK 的频率是 37.5MHz。请写出相关数据的计算过程及 C 语言指令。
计算过程:
LSPCLK = 37.5MHz
波特率 = 115200
BRR = LSPCLK / (波特率 * 8) - 1 = 40
C语言指令:
```
//使能SCI-A引脚复用功能
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1;
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1;
//配置SCI-A
SciaRegs.SCICCR.all = 0x0007;
SciaRegs.SCICTL1.all = 0x0003;
SciaRegs.SCICTL2.all = 0x0003;
SciaRegs.SCICTL2.bit.TXINTENA = 1;
SciaRegs.SCIHBAUD = 0;
SciaRegs.SCILBAUD = 40;
SciaRegs.SCICTL1.all = 0x0023;
```
3. 利用 TMS320F28335 的 ADC 模块采集 8 个通道的模拟量输入信号,假设采集顺序为:A7、A4、A6、A5、A2、B2、B0、A3。要求:采用级联、顺序采样方式。请写出相关 C 语言指令,按上要求完成 ADC 模块配置。
```
//配置ADC模块
AdcRegs.ADCCTL1.bit.ADCREFSEL = 0; //选择内部参考电压
AdcRegs.ADCCTL1.bit.ADCBGPWD = 1; //使能内部参考电压缓冲区
AdcRegs.ADCCTL1.bit.ADCPWDN = 1; //使能ADC模块电源
AdcRegs.ADCCTL1.bit.ADCENABLE = 1; //使能ADC模块
AdcRegs.ADCCTL1.bit.ADCREFPWD = 1; //使能内部参考电压缓冲区电源
AdcRegs.ADCCTL1.bit.ADCREFSEL = 0; //选择内部参考电压
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1; //设置中断触发时间
AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 1; //使能非重叠采样
AdcRegs.ADCCTL2.bit.CLKDIV2EN = 1; //使能ADC时钟除以2
AdcRegs.ADCCTL2.bit.ADCRES = 3; //设置采样分辨率为12位
AdcRegs.ADCSOC0CTL.bit.CHSEL = 7; //选择A7通道
AdcRegs.ADCSOC1CTL.bit.CHSEL = 4; //选择A4通道
AdcRegs.ADCSOC2CTL.bit.CHSEL = 6; //选择A6通道
AdcRegs.ADCSOC3CTL.bit.CHSEL = 5; //选择A5通道
AdcRegs.ADCSOC4CTL.bit.CHSEL = 2; //选择A2通道
AdcRegs.ADCSOC5CTL.bit.CHSEL = 10; //选择B2通道
AdcRegs.ADCSOC6CTL.bit.CHSEL = 8; //选择B0通道
AdcRegs.ADCSOC7CTL.bit.CHSEL = 3; //选择A3通道
AdcRegs.ADCSOC0CTL.bit.ACQPS = 63; //设置采样时间
AdcRegs.ADCSOC1CTL.bit.ACQPS = 63;
AdcRegs.ADCSOC2CTL.bit.ACQPS = 63;
AdcRegs.ADCSOC3CTL.bit.ACQPS = 63;
AdcRegs.ADCSOC4CTL.bit.ACQPS = 63;
AdcRegs.ADCSOC5CTL.bit.ACQPS = 63;
AdcRegs.ADCSOC6CTL.bit.ACQPS = 63;
AdcRegs.ADCSOC7CTL.bit.ACQPS = 63;
AdcRegs.ADCINTSEL1N2.bit.INT1SEL = 7; //设置ADCINT1的触发源为SOC7
AdcRegs.ADCINTSEL1N2.bit.INT1E = 1; //使能ADCINT1中断
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //清除ADCINT1标志位
AdcRegs.ADCINTSEL1N2.bit.INT2SEL = 0; //设置ADCINT2的触发源为SOCA
AdcRegs.ADCINTSEL1N2.bit.INT2E = 1; //使能ADCINT2中断
AdcRegs.ADCINTFLGCLR.bit.ADCINT2 = 1; //清除ADCINT2标志位
AdcRegs.ADCINTSOCSEL1.bit.SOC0 = 2; //设置ADCINT1触发SOC0
AdcRegs.ADCINTSOCSEL1.bit.SOC1 = 2; //设置ADCINT1触发SOC1
AdcRegs.ADCINTSOCSEL1.bit.SOC2 = 2; //设置ADCINT1触发SOC2
AdcRegs.ADCINTSOCSEL1.bit.SOC3 = 2; //设置ADCINT1触发SOC3
AdcRegs.ADCINTSOCSEL2.bit.SOC4 = 2; //设置ADCINT1触发SOC4
AdcRegs.ADCINTSOCSEL2.bit.SOC5 = 2; //设置ADCINT1触发SOC5
AdcRegs.ADCINTSOCSEL2.bit.SOC6 = 2; //设置ADCINT1触发SOC6
AdcRegs.ADCINTSOCSEL2.bit.SOC7 = 2; //设置ADCINT1触发SOC7
AdcRegs.ADCSOCFIFOCTL.bit.SOCCOUNT = 8; //设置FIFO中SOC数量为8
AdcRegs.ADCSOCFIFOCTL.bit.CHAINDELAY = 1; //设置级联采样延迟为1个CLK周期
AdcRegs.ADCSOCFIFOCTL.bit.TRIGSEL = 0; //设置FIFO触发源为SOCA
AdcRegs.ADCINTSOCSEL1.bit.SOC8 = 1; //设置ADCINT2触发SOC8
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1; //设置ADCINT1触发时间
AdcRegs.ADCCTL1.bit.ADCREFPWD = 1; //使能内部参考电压缓冲区电源
AdcRegs.ADCCTL1.bit.ADCPWDN = 1; //使能ADC模块电源
AdcRegs.ADCCTL1.bit.ADCENABLE = 1; //使能ADC模块
```