TMS320C6748 (DSP)
cpp
void UARTConsoleInit(void)
{
// 1. 使能时钟和电源
PSCModuleControl(SOC_PSC_1_REGS, 13, 0, PSC_MDCTL_NEXT_ENABLE);
// 2. 配置引脚复用
UARTPinMuxSetup(2, FALSE);
// 3. 配置UART参数
UARTStdioInitExpClk(BAUD_115200, UART_RX_TRIG_LEVEL_1);
}
STM32 (Cortex-M)
cpp
void USART2_Init(void)
{
// 1. 使能时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); // UART时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // GPIO时钟
// 2. 配置引脚复用
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2); // TX
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2); // RX
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 3. 配置UART参数
USART_Init(USART2, &USART_InitStructure); // 115200, 8N1
USART_Cmd(USART2, ENABLE);
}
详细类比表格
| 功能模块 | TMS320C6748 | STM32 | 说明 |
|---|---|---|---|
| 时钟/电源管理 | PSC (Power and Sleep Controller) | RCC (Reset and Clock Control) | C6748的PSC集成了电源和时钟,STM32分开管理 |
| 使能外设时钟 | PSCModuleControl(SOC_PSC_1_REGS, 13, ...) |
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ...) |
两者都必须先使能时钟才能操作外设 |
| 引脚复用 | UARTPinMuxSetup(2, FALSE) |
GPIO_PinAFConfig() + GPIO_Init() |
C6748封装得更简洁,STM32需要分步配置 |
| 引脚配置内容 | PINMUX寄存器自动配置 | 手动配置模式/速度/上下拉 | STM32更灵活但更繁琐 |
| UART参数配置 | UARTConfigSetExpClk() |
USART_Init() |
两者参数类似:波特率/数据位/停止位/校验 |
| FIFO使能 | UARTFIFOEnable() |
STM32F4/F7有FIFO,F1没有 | C6748明确使能FIFO,提高效率 |
| 使能UART | UARTEnable() |
USART_Cmd(ENABLE) |
最后一步都是使能外设 |
核心概念对应关系
1. 电源和时钟系统
cpp
TMS320C6748:
PSC (Power and Sleep Controller)
├── PSC0 → 管理部分外设 (如 UART0)
└── PSC1 → 管理部分外设 (如 UART1/UART2)
└── 模块13 = UART2
STM32:
RCC (Reset and Clock Control)
├── AHB1/AHB2 → 高速总线 (GPIO)
├── APB1 → 低速总线 (USART2/3/4/5)
└── APB2 → 高速总线 (USART1/6)
类比:
- C6748的
PSCModuleControl()≈ STM32的RCC_APBxPeriphClockCmd() - 两者都是"开闸放水",让外设获得时钟才能工作
2. 引脚复用 (Pin Mux)
cpp
TMS320C6748:
每个引脚可复用多种功能,通过 PINMUX 寄存器选择
UARTPinMuxSetup(2, FALSE) → 自动配置 UART2_TX/RX 引脚
STM32:
每个引脚可复用为 AF0~AF15 功能
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2)
类比:
- C6748的函数封装得更高层
- STM32需要手动指定每个引脚的复用功能编号
3. 条件编译切换 UART 实例
C6748 的这段代码:
cpp
#if (0 == UART_STDIO_INSTANCE)
PSCModuleControl(SOC_PSC_0_REGS, 9, ...); // UART0
#elif (1 == UART_STDIO_INSTANCE)
PSCModuleControl(SOC_PSC_1_REGS, 12, ...); // UART1
#else
PSCModuleControl(SOC_PSC_1_REGS, 13, ...); // UART2
#endif
等价于 STM32 中:
cpp
#ifdef USE_USART1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
#elif defined(USE_USART2)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
#elif defined(USE_USART3)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
#endif
关键差异总结
| 特性 | TMS320C6748 | STM32 |
|---|---|---|
| 架构定位 | 高性能浮点 DSP | 通用 ARM Cortex-M |
| 时钟管理 | PSC 统一管理电源+时钟 | RCC 只管时钟,电源单独管理 |
| 代码风格 | 驱动库封装较深 | HAL/标准库层次清晰 |
| 引脚配置 | 一个函数搞定 | 需要配置多个结构体 |
| FIFO | 硬件自带,需显式使能 | 部分型号支持 |
记忆要点
把 C6748 的初始化想象成 STM32 的"三部曲":
- "开电闸" → PSCModuleControl ≈ RCC 使能时钟
- "接线路" → UARTPinMuxSetup ≈ GPIO 复用配置
- "调参数" → UARTStdioInitExpClk ≈ USART_Init + USART_Cmd
只是 C6748 把这些步骤封装得更简洁,而 STM32 更加"手把手"地让你配置每个细节。本质上做的事情完全一样!