Core_DSC280025C核心板使用了昊芯HXS320F28025CRISC-V DSP芯片,该芯片集成了吴芯自主研发的H28x内核。核心板包括:JTAC调试接口、供电电源接口、复位、指示灯,以及两侧的对外扩展PIN脚等,除JTAG等10外,所有外设10全部引出,用户可通过杜邦跳线进行功能验证正,便于进行不同应用开发。

还送了仿真器,这一点做得很到位,谢谢!!从网站上的原理图可以找到需要的引脚,这款芯片使用的例程后缀是EDD,也就是找到文件名为__HXS320F280025CEDD__的代码实例。

开始测试,过程简单,在网站上找到IDE安装文件Haawking-IDE_V2.3.10Pre安装程序,注意要安装到win10,据说win7下会出现很多问题,安装注意不要有中文目录,安装后,需要下载程序实例,可以直接在IDE主页面也可以到官网下载:HX2000_Examples: HX2000系列芯片示例程序,独立更新及发布,适用Haawking IDE版本信息请查阅示例程序的说明文档。 - Gitee.com
在官网找到Haawking_DSC28002x_数字信号控制器的参考手册和数据手册,简单阅读之后发现和28335有点相似,这里我测试一个epwm输出PWM波形工程,外接逻辑分析仪,使用2根引脚, gnd和EPWM1A输出引脚(上图中19引脚GPIO0),实物接线如图(要注意不仅仿真器要接,开发板也要供电):

首先点击“File->New->Projects”,打开新建工程的窗口,选择“Haawking Project->Haawking Project”选项,点击“Next”进入下一个界面。
在新的界面中依次选择芯片型号、选择芯片对应版本、选择 RAM/FLASH、选择“Basic Project”作为模板、输入项目名称,点击 Finish 按钮即可。

右键单击工程名,选择 Build Project 编译整个工程。如果编译出现错误,请检查环境变量是否设置正确。
编译成功后,在“*******->Debug”目录下,会出现可执行文件 ******.elf。
在实际的使用中,除了芯片的驱动库和“BSP”之外,可能需要添加自己的源文件目录和头文件目录,除了可以将源文件和头文件放在“src”目录之外,还可以手动添加。这个工程是实现单路PWM输出,使用了事件管理器模块;
事件管理器包含如下主要模块:
•时基子模块 Time-Base
•计数器比较子模块Counter Compare
•动作限定子模块Action Qualifier
•死区发生器子模块Dead-Band Generator
•PWM斩波器(PC)子模块 PWM Chopper
•跳闸子模块Trip Zone
•事件触发子模块Event Trigger
•数字比较子模块Digital Compare
事件管理器产生PWM基本工作原理是计数器不断计数,计数值不断和比较寄存器做比较,匹配时发生电平跳变,如下图:

那么要产生PWM波(比如控制直流电机)需要设置如下内容:定时器基本工作模式(时基子模块 Time-Base),比较寄存器(计数器比较子模块Counter Compare),当发生匹配时引脚跳变的方式(动作限定子模块Action Qualifier);
如果需要生成占空比动态可调节的PWM波,还需要设置epwm中断,在每个中断发生时去修改占空比(CMPx寄存器),这里需要注意,一般CMPx寄存器设置为__双缓冲结构__;这种双缓冲结构允许用户在任意时刻修改占空比,但是比较值只在特定时刻从影子寄存器更新到工作寄存器,这使占空比的更新可控,产生PWM波形精确。另外如果是控制三相电机,需要三相六开关电路,也就是上下桥臂(带死区)互补的三相epwm输出,这款芯片也具备这些功能,设置也简单;
/系统时钟初始化/
Device_init();
/GPIO锁定/
Device_initGPIO();
/GPIO配置,用于显示中断状态/
GPIO_config();
/关中断,清中断/
Interrupt_initModule();
/初始化中断向量表/
Interrupt_initVectorTable();
/中断入口地址INT_EPWM1,指向执行epwm1ISR中断服务程序/
Interrupt_register(INT_EPWM1, &epwm1ISR);
/屏蔽TBCLK时基同步,便于PWM初始化配置写入/
SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
EALLOW; /允许修改关键寄存器与EDIS配套使用/
/配置GPIO0为EPWM1A,GPIO1为EPWM1B/
epwm_gpio();
/同步策略/
sync_config();
/EPWM配置/
epwm_config();
EDIS; /禁止修改关键寄存器与EALLOW配套使用/
/使能TBCLK时基同步,以使PWM配置写入,并实现多PWM同步/
SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
/中断使能INT_EPWM1/
Interrupt_enable(INT_EPWM1);
/打开全局中断/
EINT;
ERTM;
大多数嵌入式初始化过程类似,都是先完成系统时钟、中断配置以及GPIO初始化;打开配置EPWM初始化函void epwm_config(void);代码如下:
void epwm_config(void)
{
/*配置EPWM时钟分频:EPWM_CLOCK_DIVIDER_4-低速时钟1分频,
-
EPWM_HSCLOCK_DIVIDER_4-高速时钟4分频*/
EPWM_setClockPrescaler(EPWM1_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_4);
/*配置EPWM周期=SYSCLK/CLKDIV/HSCLKDIV/2/TBPRD=160M/1/4/2/2000=10kHz*/
EPWM_setTimeBasePeriod(EPWM1_BASE, 2000);
/*配置EPWM计数初值TBCTR=0*/
EPWM_setTimeBaseCounter(EPWM1_BASE, 0);
/*配置EPWM计数模式:EPWM_COUNTER_MODE_UP_DOWN-向上向下计数*/
EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_UP_DOWN);
/*EPWM禁止相位装载*/
EPWM_disablePhaseShiftLoad(EPWM1_BASE);
/*EPWM相位偏移:TBPHS=0*/
EPWM_setPhaseShift(EPWM1_BASE, 0);
/*HRPWM相位禁止装载:TBPHSHRLOADE=0*/
HRPWM_disablePhaseShiftLoad(EPWM1_BASE);
/*配置同步信号输入: EPWM_SYNC_IN_PULSE_SRC_SYNCOUT_EPWM1-通过EPWM1同步信号输入*/
EPWM_setSyncInPulseSource(EPWM1_BASE, EPWM_SYNC_IN_PULSE_SRC_SYNCOUT_EPWM1);
/*EPWM相位同步:
-
在EPWM_SYNC_OUT_PULSE_ON_CNTR_COMPARE_C-
-
向上计数CTR=CMPC时产生同步事件EPWMSYNCI*/
EPWM_enableSyncOutPulseSource(EPWM1_BASE, EPWM_SYNC_OUT_PULSE_ON_CNTR_COMPARE_C);
/*EPWM比较值配置:CMPA=1000-占空比50%*/
EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, 1000);
/*EPWM比较值装载: EPWM_COUNTER_COMPARE_A-CMPA在EPWM_COMP_LOAD_ON_CNTR_ZERO-CTR=0时装载影子模式*/
EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);
/*EPWM比较值配置:CMPB=1000-占空比50%*/
EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_B, 1000);
/*EPWM比较值装载: EPWM_COUNTER_COMPARE_B-CMPB在EPWM_COMP_LOAD_ON_CNTR_ZERO-CTR=0时装载影子模式*/
EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO);
/*EPWM比较值配置:CMPA=1000-占空比25%*/
EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_C, 500);
/*EPWM比较值装载: EPWM_COUNTER_COMPARE_C-CMPC在EPWM_COMP_LOAD_ON_CNTR_ZERO-CTR=0时装载影子模式*/
EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_C, EPWM_COMP_LOAD_ON_CNTR_ZERO);
/*HRPWM动作配置:EPWM_AQ_OUTPUT_A-EPWM1A
-
在EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO-TBCTR=零时
-
EPWM_AQ_OUTPUT_NO_CHANGE-不产生动作*/
EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
/*HRPWM动作配置:EPWM_AQ_OUTPUT_A-EPWM1A
-
在EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD-TBCTR=周期值时
-
EPWM_AQ_OUTPUT_NO_CHANGE-不产生动作*/
EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
/*HRPWM动作配置:EPWM_AQ_OUTPUT_A-EPWM1A
-
在EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA-向上计数TBCTR=CMPA时
-
EPWM_AQ_OUTPUT_HIGH-产生置高动作*/
EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
/*HRPWM动作配置:EPWM_AQ_OUTPUT_A-EPWM1A
-
在EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA-向下计数TBCTR=CMPA时
- EPWM_AQ_OUTPUT_LOW-产生置低动作*/
EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
/*HRPWM动作配置:EPWM_AQ_OUTPUT_A-EPWM1A
- 在EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB-向上计数TBCTR=CMPB时
- EPWM_AQ_OUTPUT_NO_CHANCE-不产生动作*/
EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
/*HRPWM动作配置:EPWM_AQ_OUTPUT_A-EPWM1A
- 在EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB-向下计数TBCTR=CMPB时
- EPWM_AQ_OUTPUT_NO_CHANCE-不产生动作*/
EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
/*HRPWM动作配置:EPWM_AQ_OUTPUT_A-EPWM1A
- 在EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB-向上计数TBCTR=CMPB时
- EPWM_AQ_OUTPUT_HIGH-产生置高动作*/
EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_T1_COUNT_UP);
/*HRPWM动作配置:EPWM_AQ_OUTPUT_B-EPWM1B
- 在EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO-TBCTR=零时
- EPWM_AQ_OUTPUT_NO_CHANGE-不产生动作*/
EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
/*HRPWM动作配置:EPWM_AQ_OUTPUT_B-EPWM1B
- 在EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD-TBCTR=周期值时
- EPWM_AQ_OUTPUT_NO_CHANGE-不产生动作*/
EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
/*HRPWM动作配置:EPWM_AQ_OUTPUT_B-EPWM1B
- 在EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA-向上计数TBCTR=CMPA时
- EPWM_AQ_OUTPUT_NO_CHANCE-不产生动作*/
EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
/*HRPWM动作配置:EPWM_AQ_OUTPUT_B-EPWM1B
- 在EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA-向下计数TBCTR=CMPA时
- EPWM_AQ_OUTPUT_NO_CHANCE-不产生动作*/
EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
/*HRPWM动作配置:EPWM_AQ_OUTPUT_A-EPWM1A
- 在EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB-向上计数TBCTR=CMPB时
- EPWM_AQ_OUTPUT_HIGH-产生置高动作*/
EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
/*HRPWM动作配置:EPWM_AQ_OUTPUT_B-EPWM1B
- 在EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB-向下计数TBCTR=CMPB时
- EPWM_AQ_OUTPUT_LOW-产生置低动作*/
EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
/配置T1动作事件触发源- PWM_AQ_TRIGGER_EVENT_TRIG_EPWM_SYNCIN-通过同步事件触发/
EPWM_setActionQualifierT1TriggerSource(EPWM1_BASE, EPWM_AQ_TRIGGER_EVENT_TRIG_EPWM_SYNCIN);
/EPWM使能中断/
EPWM_enableInterrupt(EPWM1_BASE);
/EPWM使能中断扩展:CMPC/CMPD扩展/
EPWM_enableInterruptEventCountInit(EPWM1_BASE);
/EPWM中断触发点选择:EPWM_INT_TBCTR_ZERO-向上计数时,CTR=CMPC时触发/
EPWM_setInterruptSource(EPWM1_BASE, EPWM_INT_TBCTR_U_CMPC );
/EPWM中断触发次数配置:每周期触发1次/
EPWM_setInterruptEventCount(EPWM1_BASE, 1);
}
这段代码是设置epwm工作的程序,目的是启动定时器不断与比较寄存器做比较周期性产生PWM信号;为完成动态修改占空比需要使用epwm中断函数,可以使用Interrupt_register(INT_EPWM1, &epwm1ISR);函数指定INT_EPWM1中断入口函数名epwm1ISR最后是中断处理函数:
__interrupt void epwm1ISR(void){
/清除EPWM事件中断/
EPWM_clearEventTriggerInterruptFlag(EPWM1_BASE);
/清除中断应答PIEACK/
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP3);}
如果需要动态修改占空比,就在这个函数中调用
EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, 1000);
以下是调试结果:

总结:开发过程简易,(不像有些国产厂商拿出个半成品,什么开发环境都难以安装)代码类似ti的28335当然CPU底层架构RISC-V我也没深入了解,仅从使用开发方面来说,容易上手,当然epwm的死区设置等还是要深入了解一下才能拿来开发三相电机驱动,是否兼容ti的电机代码,还要进一步学习。
|