中科昊芯 DSP
直播中

安安踢球球

6年用户 113经验值
擅长:电源/新能源 嵌入式技术
私信 关注

【中科昊芯Core_DSC280025C开发板试用体验】+epwm周期性启动光照传感器工程

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

IMG_256

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

IMG_256

开始测试,过程简单,在网站上找到IDE安装文件Haawking-IDE_V2.3.10Pre安装程序,注意要安装到win10,据说win7下会出现很多问题,安装注意不要有中文目录,安装后,需要下载程序实例,可以直接在IDE主页面也可以到官网下载:HX2000_Examples: HX2000系列芯片示例程序,独立更新及发布,适用Haawking IDE版本信息请查阅示例程序的说明文档。 - Gitee.com

在官网找到Haawking_DSC28002x_数字信号控制器的参考手册和数据手册,简单阅读之后发现和28335有点相似,这里我测试一个ADC在转换工程,外接一个光传感器,使用3根引脚,VCC3.3 gnd和A0模拟输入引脚(上图中18引脚),实物接线如图(要注意不仅仿真器要接, 开发板也要供电 ):

image.png

首先点击“File->New->Projects”,打开新建工程的窗口,选择“Haawking Project->Haawking Project”选项,点击“Next”进入下一个界面。

在新的界面中依次选择芯片型号、选择芯片对应版本、选择 RAM/FLASH、选择“Basic Project”作为模板、输入项目名称,点击 Finish 按钮即可。
image.png

右键单击工程名,选择 Build Project 编译整个工程。如果编译出现错误,请检查环境变量是否设置正确。

编译成功后,在“*******->Debug”目录下,会出现可执行文件 ******.elf。

在实际的使用中,除了芯片的驱动库和“BSP”之外,可能需要添加自己的源文件目录和头文件目录,除了可以将源文件和头文件放在“src”目录之外,还可以手动添加。

第一个工程是实现光照传感器转换的ADC数据转换,使用了事件管理器模块循环启动ADC转换,下面来分析代码:

在main函数中先完成系统初始化任务
Device_init();
//这个函数完成系统(以及外设)时钟和看门狗、flash配置等任务
Device_initGPIO();/GPIO锁定解除/
/关中断,清中断/
Interrupt_initModule();
/初始化中断向量表/
Interrupt_initVectorTable();
EALLOW;
/配置AdcAio模拟量输入引脚/
InitAdcAio();
/配置Adc参考电压/
InitAdc();
/配置Adc模块/
Adc_config();
/配置INT_ADCA1中断入口地址,指向执行adcA1ISR中断服务程序/
Interrupt_register(INT_ADCA1, &adcA1ISR);
/配置INT_ADCA1中断使能/
Interrupt_enable(INT_ADCA1);
EDIS;
/配置EPWM初始化/
initEPWM();

大多数嵌入式初始化过程类似,都是先完成系统时钟、中断配置以及GPIO初始化,为完成采样需要使用ADC中断函数,可以使Interrupt_register(INT_ADCA1, &adcA1ISR);函数指定ADC中断入口函数名;打开配置EPWM初始化函initEPWM();

代码如下:
/关闭ADC的触发:EPWM_SOC_A-EPWM_SOCA触发/
EPWM_disableADCTrigger(EPWM1_BASE, EPWM_SOC_A);
/*配置ADC触发源:EPWM_SOC_A-EPWM_SOCA

  • 在EPWM_SOC_TBCTR_U_CMPA-向上计数CTR=CMPA时触发*/
    EPWM_setADCTriggerSource(EPWM1_BASE, EPWM_SOC_A, EPWM_SOC_TBCTR_U_CMPA);
    /配置ADC触发源事件分频:1分频/
    EPWM_setADCTriggerEventPrescale(EPWM1_BASE, EPWM_SOC_A, 1);
    /*配置EPWM比较点:CMPA=1000-对应脉宽50%*/
    EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, 1000);
    /*配置EPWM时钟周期=SYSCLK/(TBPRD+1)=160M/2000=80kHz*/
    EPWM_setTimeBasePeriod(EPWM1_BASE, 1999);
    /*配置EPWM时钟分频:EPWM_CLOCK_DIVIDER_1-低速时钟1分频
    *EPWM_HSCLOCK_DIVIDER_1-高速时钟1分频 */
    EPWM_setClockPrescaler(EPWM1_BASE,
    EPWM_CLOCK_DIVIDER_1,
    EPWM_HSCLOCK_DIVIDER_1);
    /*配置EPWM时钟计数模式:EPWM_COUNTER_MODE_STOP_FREEZE-冻结计数器时钟 */
    EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_STOP_FREEZE);

这段代码是设置epwm工作的程序,目的是为了周期性产生ADC转换信号;

接下来是启动ADC:
while(1)
{ /使能启动ADC触发:EPWM_SOC_A-EPWM_SOCA/
EPWM_enableADCTrigger(EPWM1_BASE, EPWM_SOC_A);
/配置时钟计数模式:EPWM_COUNTER_MODE_UP-向上模式/
EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_UP);
/等待缓冲区空/
while(bufferFull == 0)
{ }
bufferFull = 0; // Clear the buffer full flag
/通过关闭ADC的EPWM_SOCA触发与EPWM计数器停止ADC采样/
EPWM_disableADCTrigger(EPWM1_BASE, EPWM_SOC_A);
EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_STOP_FREEZE);}
最后是中断处理函数:
__interrupt void adcA1ISR(void)
{/读取ADC结果ADC_SOC_NUMBER0-SOC0/
for(result=0;result<4;result++)
{
myADC0Results[result]=ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER2);
/读取ADC结果的第三次采样值,趋于准确/
if(result>=2)
{
ADC_A0result=myADC0Results[result];
}
}
/*清除ADC_INT_NUMBER1-ADCINT1中断状态*/
ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);

/*核查ADC中断是否出现溢出,若溢出则清除溢出中断与中断状态ADCINT1*/
if(true == ADC_getInterruptOverflowStatus(ADCA_BASE, ADC_INT_NUMBER1))
{
	/*清除ADC_INT_NUMBER1-ADCINT1中断溢出状态*/
	ADC_clearInterruptOverflowStatus(ADCA_BASE, ADC_INT_NUMBER1);
    ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);
}
/*清除ADC对应的PIE中断应答*/
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);

}

工程中GPIO设置和ADC配置函数省略,以下是调试结果:
image.png

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

回帖(2)

安安踢球球

2025-7-12 20:31:55
为什么word解析的代码   不对应?
举报

安安踢球球

2025-7-12 20:57:49
为什么上传的word代码和文档不对应?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分