TI-DSP C2000程序升级bootloader定制、驱动开发、应用开发、在线指导,支持28002x,28004x系列,28335,2837xS单核系列,2837xD双核系列,28388系列等大部分C28系列,附带升级上位机开发。 can通讯升级和串口升级均可。

在嵌入式开发领域,TI-DSP C2000 系列一直备受青睐,它以强大的性能和丰富的功能广泛应用于各种工业控制、电力电子等项目中。今天咱就来唠唠 TI-DSP C2000 的程序升级、bootloader 定制,以及驱动和应用开发这些事儿,顺带还支持在线指导哦,而且覆盖 28002x,28004x 系列,28335,2837xS 单核系列,2837xD 双核系列,28388 系列等大部分 C28 系列,最后还得说说附带的升级上位机开发。

Bootloader 定制

Bootloader 就像是设备启动的“引路人”,它负责初始化硬件设备、建立内存空间映射,为后续正式程序的运行做好准备。在 TI-DSP C2000 中定制 Bootloader,首先要了解目标芯片的启动机制。以 28335 为例,它上电复位后,会从特定地址开始执行代码。

// 简单示例代码,初始化一些基本寄存器
void bootloader_init(void) {
    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // 停止定时器时钟同步
    SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; // 使能 ADC 时钟
    EDIS;
}

这里通过 EALLOWEDIS 宏来访问受保护的寄存器,对系统时钟和 ADC 时钟进行了配置。TBCLKSYNC 置 0 是为了在初始化过程中避免定时器干扰,而 ADCENCLK 置 1 是为了后续可能的 ADC 操作提前准备。

定制 Bootloader 的关键在于实现程序升级功能。这就涉及到数据的接收与存储,以及如何安全地切换到新程序。比如通过 CAN 或串口接收升级程序数据时,要保证数据的完整性和正确性。

驱动开发

驱动开发是让硬件设备与上层应用程序顺畅沟通的桥梁。以 GPIO 驱动为例,在 C2000 中控制 GPIO 引脚输出高低电平,代码如下:

// 配置 GPIO 为输出模式,并输出高电平
void gpio_init(void) {
    EALLOW;
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0; // 设置 GPIO0 为通用 I/O
    GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; // 设置 GPIO0 为输出方向
    GpioDataRegs.GPASET.bit.GPIO0 = 1; // 设置 GPIO0 输出高电平
    EDIS;
}

这里先通过 GPAMUX1 寄存器将 GPIO0 设置为通用 I/O 功能,然后通过 GPADIR 寄存器设置为输出方向,最后通过 GPASET 寄存器让它输出高电平。每个寄存器的操作都对应着特定的硬件功能控制,熟悉这些寄存器的功能是驱动开发的基础。

应用开发

应用开发是基于 Bootloader 和驱动之上,实现具体业务逻辑的部分。比如一个简单的电机控制应用,可能会结合 ADC 采集电机的电流、转速等反馈信息,然后通过 PWM 输出控制电机的运转。

// 简单的 PWM 控制代码示例
void pwm_init(void) {
    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
    EPwm1Regs.TBPRD = 1000; // 设置周期
    EPwm1Regs.TBPHS.half.TBPHS = 0; // 相位设置为 0
    EPwm1Regs.TBCTL.bit.CTRMODE = 0x0002; // 连续增计数模式
    EPwm1Regs.CMPA.half.CMPA = 500; // 占空比 50%
    EPwm1Regs.AQCTLA.bit.ZRO = 0x0002; // 计数器为 0 时,PWM 输出高电平
    EPwm1Regs.AQCTLA.bit.CAU = 0x0001; // 计数器向上溢出时,PWM 输出低电平
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
    EDIS;
}

这段代码对 ePWM1 模块进行了初始化,设置了周期、相位、计数模式以及占空比,从而实现对 PWM 输出的控制。在实际应用中,会根据采集到的电机反馈信息实时调整 CMPA 的值,以精确控制电机的转速。

程序升级

前面提到 Bootloader 定制时涉及程序升级,这里详细说说。TI-DSP C2000 支持 CAN 通讯升级和串口升级两种方式。

CAN 通讯升级

CAN 通讯具有可靠性高、抗干扰能力强等优点。在 CAN 升级过程中,首先要初始化 CAN 模块。

// CAN 模块初始化示例代码
void can_init(void) {
    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.CAN0ENCLK = 1; // 使能 CAN0 时钟
    Can0Regs.CANMC.all = 0x0000; // 配置 CAN 主控制寄存器
    Can0Regs.CANBTC.all = 0x0031; // 配置波特率分频器和时间份额
    Can0Regs.CANRMP.all = 0x0000; // 重置消息处理器
    Can0Regs.CANME.all = 0x0001; // 使能邮箱 0
    Can0Regs.CANMD.all = 0x0000; // 设置为正常模式
    EDIS;
}

初始化完成后,上位机通过 CAN 总线发送升级数据,Bootloader 接收数据并存储到指定的 Flash 区域。接收数据时要处理好 CAN 消息的标识符、数据长度等信息,确保数据准确无误。

串口升级

串口升级相对简单,硬件连接方便。同样要先初始化串口模块。

// SCI 串口初始化示例代码
void sci_init(void) {
    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; // 使能 SCI-A 时钟
    SciaRegs.SCICCR.all = 0x0007; // 8 位数据位,1 位停止位,无校验
    SciaRegs.SCICTL1.all = 0x0003; // 使能发送和接收
    SciaRegs.SCIHBAUD = 0x0001; // 高波特率寄存器设置
    SciaRegs.SCILBAUD = 0x00E7; // 低波特率寄存器设置
    SciaRegs.SCICTL2.all = 0x0003; // 使能发送和接收中断
    EDIS;
}

串口升级时,上位机将升级数据通过串口发送,Bootloader 接收并存储。不过要注意串口数据的缓存处理,防止数据丢失或溢出。

升级上位机开发

最后说说附带的升级上位机开发。上位机通常使用 PC 端软件,比如基于 C# 或 Python 开发。以 Python 为例,使用 pyserial 库实现串口通讯升级上位机代码如下:

import serial

ser = serial.Serial('COM1', 9600) # 根据实际串口号和波特率设置

def send_upgrade_data(data):
    ser.write(data)

upgrade_file = open('upgrade.bin', 'rb')
data = upgrade_file.read()
send_upgrade_data(data)
upgrade_file.close()
ser.close()

这段代码打开一个升级文件,读取其中数据,然后通过串口发送到目标设备。对于 CAN 通讯升级的上位机开发,可能会用到 CAN 总线相关的库,比如 python-can,通过配置 CAN 设备参数,实现与目标设备的 CAN 通讯并发送升级数据。

TI-DSP C2000 的开发涵盖了从底层 Bootloader 定制、驱动开发,到上层应用开发以及程序升级和上位机开发等多个环节。每个环节都紧密相连,只有深入理解并熟练掌握,才能开发出高效稳定的嵌入式系统。希望这篇博文能给各位在 C2000 开发之路上的朋友一些帮助和启发。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐