TI DSP TSM320F28003x代码笔记1
-
新建工程(使用位域库 device_support)
-
添加头文件路径
${PROJECT_ROOT}/device_support/f28003x/common/include ${PROJECT_ROOT}/device_support/f28003x/headers/include
-
包含头文件
#include "F28003x_Device.h" // 包含外设结构体定义 /common/include #include "F28003x_Examples.h" // 包含系统初始化等声明 /headers/include
-
添加依赖文件框架
28003x_generic_ram_lnk.cmd f28003x_adc.c f28003x_codestartbranch.asm f28003x_cputimers.c f28003x_defaultisr.c f28003x_dma.c f28003x_epwm.c f28003x_globalvariabledefs.c f28003x_gpio.c f28003x_headers_nonBIOS.cmd f28003x_piectrl.c f28003x_pievect.c f28003x_sysctrl.c f28003x_tempsensorconv.c f28003x_usdelay.asm
类型 必须文件 启动代码 codestartbranch.asm
初始化 sysctrl.c
,piectrl.c
,pievect.c
外设变量 globalvariabledefs.c
,headers_nonBIOS.cmd
中断处理 defaultisr.c
启动映射 lnk.cmd
延时支持 usdelay.asm
CMD映射文件 28003x_generic_ram_lnk.cmd -
主函数初始化流程
-
InitSysCtrl();
初始化系统时钟 -
InitGpio();
初始化GPIO-
这是TI C2000Ware 中一个通用的 GPIO 初始化函数,目的是统一重置和解锁所有 GPIO 引脚的控制状态
-
该API解锁,清零了GPIO对应的寄存器,如果不调用这个API,可能GPIO还是上锁状态,无法控制
-
关节代码段:
// // Disable pin locks // EALLOW; GpioCtrlRegs.GPALOCK.all = 0x00000000; GpioCtrlRegs.GPBLOCK.all = 0x00000000; GpioCtrlRegs.GPHLOCK.all = 0x00000000;
-
-
初始化中断(PIE)
DINT; //禁用全局中断 InitPieCtrl(); // 初始化 PIE 控制器 IER = 0x0000; // 禁用 CPU 所有中断 IFR = 0x0000; // 清除所有中断标志 InitPieVectTable(); // 初始化 PIE 向量表 ... ... //在主循环之前 EINT;//使能全局中断 ERTM;//使能实时中断 while1(1) { ... }
-
GPIO配置
void initLED_GPIO(void) { EALLOW; GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 0; // 00 = GPIO GpioCtrlRegs.GPADIR.bit.GPIO20 = 1; // 设置为输出 GpioCtrlRegs.GPAPUD.bit.GPIO20 = 1; // 启用上拉 EDIS; GpioDataRegs.GPADAT.bit.GPIO20 = 1;//熄灭 }
需要关注三个寄存器
-
GPAMUX寄存器 复用寄存器
注:MUX寄存器由两个寄存器组成:
GPyGMUXx.bit.GPIOy // 高复用选择位(Global MUX)
GPyMUXx.bit.GPIOy // 低复用选择位(Local MUX)具体复用配置见复用表
-
GPADIR寄存器 方向寄存器
-
GPAPUD寄存器 上拉失能寄存器
注:0为使能 1为失能
-
-
-
注册&使能中断
EALLOW; PieVectTable.EPWM4_INT = &epwm4_isr; // 注册 EPWM4 中断服务函数 EDIS; ... ... //应在主循环之前 PieCtrlRegs.PIEIER3.bit.INTx4 = 1; // 使能 EPWM4 中断(组3,通道4) IER |= M_INT3; // 使能 CPU 中断组3 EINT; // 使能全局中断 ERTM; // 使能实时中断
-
外设配置
-
ePWM
step1:允许修改
EALLOW;//一般都需要
step2:TZ模块配置(未使用)
step3:TB模块配置(配置时基)
应关注以下几个寄存器:
-
TBPRD周期寄存器(设置周期)
-
TBCTL 控制寄存器:
应注意以下几个bit:
-
CTRMODE:计数模式
-
PHSEN:相位加载
-
PRDLD:TBPRD加载选项,选择是否使用影子寄存器加载TBPRD
-
HSPCLKDIV:高速时钟预分频器 对SYSCLK分频
-
CLKDIV:时钟分频器 对HSPCLK分频
-
-
TBPHS 相位寄存器
EPwm4Regs.TBPRD = 600; // 设置周期为601个TBCLK周期 EPwm4Regs.CMPA.bit.CMPA = 300; // 设置比较器A EPwm4Regs.TBPHS.bit.TBPHS = 0; // 相位清零 EPwm4Regs.TBCTR = 0; // 清除计数器 EPwm4Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // 递增计数模式 EPwm4Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 禁用相位加载 EPwm4Regs.TBCTL.bit.PRDLD = TB_SHADOW; // 使用影子寄存器加载 TBPRD EPwm4Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // TBCLK = SYSCLK EPwm4Regs.TBCTL.bit.CLKDIV = TB_DIV1;
step4:CC模块配置
应关注以下寄存器:
1. CMPA,CMPB,CMPC,CMPD设置比较值: 2. CMPCTL比较控制寄存器: 1. SHDWAMODE:是否使用影子寄存器加载CMP 2. LOADAMODE:加载时间 什么时候更新CMP
step5:DB模块配置(未使用)
step6:AQ模块配置
- AQCTL动作控制寄存器
- ZRO:在CTR=0时,怎么置位PWM 拉高还是拉低
- CAU:在CTR=CMP时,怎么置位
step7:ET模块配置
- ETSEL:中断置位寄存器
- INTEL:什么时候触发中断
- INTEN:使能
- ETPS:多少次事件发生后才触发一次中断
-
-
-
中断服务函数
注意清除中断标志位和发送中断响应(PIEACK)
// EPWM4 中断服务函数 __interrupt void epwm4_isr(void) { static uint32_t i = 100000; EPwm4Regs.ETCLR.bit.INT = 1; // 清除中断标志位 PieCtrlRegs.PIEACK.all = PIEACK_GROUP3; // 允许更多来自组3的中断 if (i <= 0) { //GpioDataRegs.GPATOGGLE.bit.GPIO20 = 1; // 翻转 LED GpioDataRegs.GPATOGGLE.bit.GPIO20 = 1; // 翻转 LED i = 100000; } else { i--; } }
-