GPIO

SCI GPIO映射

img

GPIO43初始化:由CPU1控制、复用为SCI接收引脚、输入模式、标准推挽/浮空配置、异步输入限定模式

1
2
3
4
5
6
7
8
//
// GPIO43 is the SCI Rx pin.
//
GPIO_setMasterCore(43, GPIO_CORE_CPU1);
GPIO_setPinConfig(GPIO_43_SCIRXDA);
GPIO_setDirectionMode(43, GPIO_DIR_MODE_IN);
GPIO_setPadConfig(43, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(43, GPIO_QUAL_ASYNC);

GPIO42初始化:由CPU1控制、复用为SCI发送引脚、输出模式、标准推挽/浮空配置、异步输出限定模式

1
2
3
4
5
6
7
8
//
// GPIO42 is the SCI Tx pin.
//
GPIO_setMasterCore(42, GPIO_CORE_CPU1);
GPIO_setPinConfig(GPIO_42_SCITXDA);
GPIO_setDirectionMode(42, GPIO_DIR_MODE_OUT);
GPIO_setPadConfig(42, GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode(42, GPIO_QUAL_ASYNC);

GPIO函数功能说明

函数名 参数 返回值 功能说明
GPIO_setMasterCore pin: uint32_t (GPIO引脚号)
core: GPIO_CoreSelect (控制器核心)
void 设置指定GPIO引脚由哪个核心控制。
core可选值:
- GPIO_CORE_CPU1
- GPIO_CORE_CPU1_CLA1
- GPIO_CORE_CPU2
- GPIO_CORE_CPU2_CLA1
GPIO_setPinConfig pinConfig: uint32_t (引脚配置值) void 配置GPIO引脚的多路复用功能(配置值在pin_map.h中定义,如GPIO_43_SCIRXDA)
GPIO_setDirectionMode pin: uint32_t (GPIO引脚号)
pinIO: GPIO_Direction (方向模式)
void 设置GPIO引脚方向模式。
pinIO可选值:
- GPIO_DIR_MODE_IN
- GPIO_DIR_MODE_OUT
GPIO_setPadConfig pin: uint32_t (GPIO引脚号)
pinType: uint32_t (引脚类型)
void 设置GPIO引脚的电气特性。
pinType可选值:
- GPIO_PIN_TYPE_STD
- GPIO_PIN_TYPE_PULLUP
- GPIO_PIN_TYPE_OD
- GPIO_PIN_TYPE_INVERT(可组合使用)
GPIO_setQualificationMode pin: uint32_t (GPIO引脚号)
qualification: GPIO_QualificationMode
void 设置输入限定模式。
qualification可选值:
- GPIO_QUAL_SYNC
- GPIO_QUAL_3SAMPLE
- GPIO_QUAL_6SAMPLE
- GPIO_QUAL_ASYNC

串口

串口参数配置:115200、8、1、N,这个配置很简单,不做详细介绍

1
2
3
4
5
6
//
// 8 char bits, 1 stop bit, no parity. Baud rate is 115200.
//
SCI_setConfig(SCIA_BASE, DEVICE_LSPCLK_FREQ, 115200, (SCI_CONFIG_WLEN_8 |
SCI_CONFIG_STOP_ONE |
SCI_CONFIG_PAR_NONE));

FIFO

SCIA FIFO配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SCI_enableModule(SCIA_BASE);
SCI_resetChannels(SCIA_BASE);
SCI_enableFIFO(SCIA_BASE);

//
// RX and TX FIFO Interrupts Enabled
//
SCI_enableInterrupt(SCIA_BASE, (SCI_INT_RXFF | SCI_INT_TXFF));
SCI_disableInterrupt(SCIA_BASE, SCI_INT_RXERR);

// Set FIFO interrupt levels to 32 characters
SCI_setFIFOInterruptLevel(SCIA_BASE, SCI_FIFO_TX16, SCI_FIFO_RX16);
SCI_performSoftwareReset(SCIA_BASE);

SCI_resetTxFIFO(SCIA_BASE);
SCI_resetRxFIFO(SCIA_BASE);

枚举类型 SCI_TxFIFOLevel 定义了 SCI(串行通信接口)模块发送 FIFO 的中断触发水位线级别,用于配置何时触发发送 FIFO 中断

枚举值 值(十六进制) 含义 典型应用场景
SCI_FIFO_TX0 0x0000 FIFO 完全空时触发中断 高实时性要求,需立即补充数据
SCI_FIFO_TX1 0x0001 FIFO 剩余 15/16 满(即已发送1个字节)时触发 低延迟传输
SCI_FIFO_TX2 0x0002 FIFO 剩余 14/16 满时触发
SCI_FIFO_TX15 0x000F FIFO 剩余 1/16 满(即已发送15个字节)时触发 平衡中断频率和响应速度
SCI_FIFO_TX16 0x0010 FIFO 完全满时触发中断 错误检测(通常避免使用)

FIFO配置流程:

  1. SCI_enableModule(SCIA_BASE)
  • 使能SCI模块
  • 这是使用SCI通信的第一步,必须先使能模块才能进行其他配置
  1. SCI_resetChannels(SCIA_BASE)
  • 复位SCI通道
  • 清除所有通道相关的配置和状态
  • 确保从一个干净的状态开始配置
  1. SCI_enableFIFO(SCIA_BASE)
  • 使能SCI的FIFO功能
  • FIFO(First In First Out)缓冲区可以提高数据传输效率
  • 允许在发送和接收时缓存多个数据
  1. SCI_enableInterrupt(SCIA_BASE, (SCI_INT_RXFF | SCI_INT_TXFF))
  • 使能FIFO相关的中断
  • SCI_INT_RXFF: 接收FIFO中断,当接收FIFO达到设定水平时触发
  • SCI_INT_TXFF: 发送FIFO中断,当发送FIFO低于设定水平时触发
  • 使用位或运算(|)同时使能这两个中断
  1. SCI_disableInterrupt(SCIA_BASE, SCI_INT_RXERR)
  • 禁用接收错误中断
  • SCI_INT_RXERR包括帧错误、溢出错误等
  • 在这个例子中不需要处理这些错误
  1. SCI_setFIFOInterruptLevel(SCIA_BASE, SCI_FIFO_TX16, SCI_FIFO_RX16)
  • 设置FIFO中断触发水平
  • SCI_FIFO_TX16: 当发送FIFO中数据少于16个时触发中断
  • SCI_FIFO_RX16: 当接收FIFO中数据达到16个时触发中断
  • 这些值可以根据需要调整,以平衡实时性和系统负载
  1. SCI_performSoftwareReset(SCIA_BASE)
  • 执行SCI软件复位
  • 清除所有配置和状态
  • 确保之前的配置完全生效
  1. SCI_resetTxFIFO(SCIA_BASE)SCI_resetRxFIFO(SCIA_BASE)
  • 分别复位发送和接收FIFO
  • 清空FIFO缓冲区
  • 确保没有残留的旧数据

中断

发送和接收中断服务函数:SCI_clearInterruptStatus和Interrupt_clearACKGroup两个步骤是必要的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//
// sciaTXFIFOISR - SCIA Transmit FIFO ISR
//
__interrupt void sciaTXFIFOISR(void)
{
SCI_clearInterruptStatus(SCIA_BASE, SCI_INT_TXFF);

//
// Issue PIE ACK
//
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
}

//
// sciaRXFIFOISR - SCIA Receive FIFO ISR
//
__interrupt void sciaRXFIFOISR(void)
{
uint16_t i;
uint16_t rxCount;

// Read received data
rxCount = SCI_getRxFIFOStatus(SCIA_BASE) & 0x7F; // Get number of words in RX FIFO
if(rxCount > 32) rxCount = 32;

// Read all received data
for(i = 0; i < rxCount; i++)
{
rDataA[i] = SCI_readCharNonBlocking(SCIA_BASE);
}

// Echo back all received data
for(i = 0; i < rxCount; i++)
{
SCI_writeCharNonBlocking(SCIA_BASE, rDataA[i]);
}

SCI_clearOverflowStatus(SCIA_BASE);
SCI_clearInterruptStatus(SCIA_BASE, SCI_INT_RXFF);

//
// Issue PIE ack
//
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
}

发送和接收中断使能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//
// Initialize PIE and clear PIE registers. Disables CPU interrupts.
//
Interrupt_initModule();

//
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
//
Interrupt_initVectorTable();

//
// Interrupts that are used in this example are re-mapped to
// ISR functions found within this file.
//
Interrupt_register(INT_SCIA_RX, sciaRXFIFOISR);
Interrupt_register(INT_SCIA_TX, sciaTXFIFOISR);

Interrupt_enable(INT_SCIA_RX);
Interrupt_enable(INT_SCIA_TX);

Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);

第一次发送传输时记得手动使能中断函数

1
Interrupt_enable(INT_SCIA_TX);

中断的配置流程:

  1. Interrupt_initModule()
  • 初始化外设中断扩展模块(PIE)
  • 清除所有PIE寄存器
  • 禁用CPU中断
  • 这是配置中断系统的第一步,确保从一个干净的状态开始
  1. Interrupt_initVectorTable()
  • 初始化PIE中断向量表
  • 将向量表中的所有中断向量指向默认的中断服务程序(ISR)
  • 这确保了即使有未处理的中断,系统也不会崩溃
  1. Interrupt_register(INT_SCIA_RX, sciaRXFIFOISR)Interrupt_register(INT_SCIA_TX, sciaTXFIFOISR)
  • 将特定的中断与对应的中断服务程序(sciaRXFIFOISR和sciaTXFIFOISR)关联起来
  • INT_SCIA_RX 是SCI接收中断,关联到 sciaRXFIFOISR 函数
  • INT_SCIA_TX 是SCI发送中断,关联到 sciaTXFIFOISR 函数
  • 这样当这些中断发生时,系统就知道该调用哪个函数来处理
  1. Interrupt_enable(INT_SCIA_RX)Interrupt_enable(INT_SCIA_TX)
  • 启用特定的中断
  • 使能SCI接收和发送中断
  • 只有被使能的中断才会触发对应的ISR
  1. Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9)
  • 清除中断确认组9的中断标志
  • 这确保之前可能存在的未处理中断不会立即触发
  • 中断组9通常包含SCI相关的中断
  1. 第一次发送传输需要手动使能中断服务函数,如Interrupt_enable(INT_SCIA_TX)

总结

controlSuite里边的SCI loopback例程不大靠谱,导入CCS里边后编译不成功,即使你折腾好运行也是有问题的,建议使用C2000里边的example


© 2025 hywing 使用 Stellar 创建
总访问 113701 次 | 本页访问 326