LY-F335系列DSP产品是由湖南六岳微电子有限责任公司推出的一款专为工业控制领域研发设计的软32位数字信号处理器,旨在为用户提供稳定可靠,兼容替代,性能卓越的芯片产品。LY-F335系列DSP不仅具备高速的数据处理能力,还支持多种通信接口和丰富的外设资源,使其广泛应用于变频伺服、逆变储能、工业控制、电力电子、工业自动化、汽车电子等多个领域。从开发的角度,因为该芯片兼容TMS320F28335芯片,所以工具链选择了CCS10等可用于TI公司28335MCU的编译下载仿真软件,工具非常成熟,安装完成之后也易于使用。这些已经在上篇介绍完成,这一篇测评着重测试ADC转换结果在OLED上的显示,在此基础上介绍工程文件作用。
第一步硬件接线,在数据手册上查到可以使用了GPIO1、3、5、7作为OLED通信引脚,在开发板上找到之后,将GPIO1、3作为SDA引脚和SCL引脚,GPIO5、7则作为VCC和GND,仿真器、串口转接器与开发板接线如图,红色标注即为OLED接线:

在ADC转换工程中添加OLED文件夹,并将头文件搜索路径加入到工程:
接下来分析工程文件:
.ccxml是设置仿真器和开发板芯片类型的文件,与之前使用的工程一致,不需要修改; .cmd文件是规划变量存储空间的文件,在调试时一般是CODE使用RAM,正常工作时CODE代码段使用flash存储器,调试和正常工作时代码放在不同存储空间所以需要修改;CMD的作用就是为程序代码和数据分配存储空间。
在工程项目中,操作(添加或删除)CMD文件的方法:
右击你的project,选择第一个“Add files to project”后,选择你要添加的.cmd的路径。如果要删去,则选中.cmd文件后“remove from project"不管在这个页面的"linker Command file"里添加还是在C2000linker 的include中添加或用工程文件管理器添加,只要将两个CMD文件加入工程就行,Flash和RAM的CMD文件同时只能一个使用(关键是不同同时编译,可以两个都添加,但是不用于编译使用)。
在DSP28335工程文件里(不用BIOS产生CMD文件),手写CMD文件一般有两个,在RAM里调试时用的两个CMD文件分别为DSP2833x_Headers_nonBIOS.cmd和28335_RAM_lnk.cmd,烧写到flash里时用的两个CMD文件分别为DSP2833x_Headers_nonBIOS.cmd和F28335.cmd,其中DSP2833x_Headers_nonBIOS.cmd文件可以在所有工程文件中通用,主要作用是把外设寄存器产生的数据段映射到对应的存储空间,主要作用是把外设寄存器产生的数据段映射到对应的存储空间,可以跟DSP2833x_GlobalVariableDefs.c文件对照一下看看。
关键点:
在这个界面选择合适的CMD文件。
工程中asm文件是汇编语言写的代码,作用是进行ADC校正相关数据初始化,以及启动代码,不需要修改。
大多数.c文件是库文件比如DSP2833x_PieCtrl.c和DSP2833x_PieVect.c,在本工程中,实现OLED通信的主要是:OLED文件夹下的文件和主函数Example_2833xAdcSoc.c,调用__void__ Gpio_select ( void ),所有GPIO口被设置为输出状态:
void Gpio_select ( void )
{
EALLOW;
GpioCtrlRegs.GPAMUX1.all = 0x00000000; // All GPIO
GpioCtrlRegs.GPAMUX2.all = 0x00000000; // All GPIO
GpioCtrlRegs.GPAMUX1.all = 0x00000000; // All GPIO
GpioCtrlRegs.GPADIR.all = 0xFFFFFFFF; // All outputs
GpioCtrlRegs.GPBDIR.all = 0x0000000F; // All outputs
EDIS;}
将OLED添加到工程中,并将头文件调到工程,再进行如图所示修改:
在OLED_init函数中进行如下修改:
GpioDataRegs.GPASET.bit.GPIO5=1; //对应VCC
GpioDataRegs.GPACLEAR.bit.GPIO7=1; //对应GND
delay_ms(200); //重写函数避免调用出错
接着阅读并添加如下代码到主函数:
OLED_Init();
OLED_ColorTurn(0);//0正常显示,1 反色显示
OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
while(1)
{OLED_Refresh();
delay_loop();
OLED_Clear();
OLED_ShowString(8,16,"ZHONGJINGYUAN",16,1);
OLED_ShowString(0,32,"ADC:",16,1);
OLED_ShowNumber(63,32,Voltage1[0],8,16,1);
OLED_ShowString(0,48,"ADC:",16,1);
OLED_ShowNumber(63,48,LoopCount,8,16,1);
OLED_Refresh();
delay_loop();delay_loop();delay_loop();
delay_loop();delay_loop();delay_loop();
LoopCount++;
}
调试过程中发现BMP和显示汉字占据存储单元太大,导致CMD文件报错,于是删除了大部分BMP和汉字对应的常量并删除对应函数;接下来分析ADC转换如何实现,阅读代码发现使用了epwm周期性启动ADC转换,得到转换结果,在OLED上显示其中一个结果Voltage1[0];代码如下:
AdcRegs.ADCMAXCONV.all = 0x0001; // 设置SEQ1进行ADC转换
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x3; //设ADCINA3 为SEQ1转换的第一个通道.
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x2; //设置ADCINA2 为SEQ1 转换的第二个通道
// 使用ePWM(周期性)启动 ADC的SEQ1序列转换
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // 使能 SEQ1序列转换中断
// 要确保ePWM1 clock 已经在 InitSysCtrl()设置
EPwm1Regs.ETSEL.bit.SOCAEN = 1; // Enable SOC on A group
EPwm1Regs.ETSEL.bit.SOCASEL = 4; // Select SOC from from CPMA on upcount
EPwm1Regs.ETPS.bit.SOCAPRD = 1; // Generate pulse on 1st event
EPwm1Regs.CMPA.half.CMPA = 0x0080; // Set compare A value
EPwm1Regs.TBPRD = 0xFFFF; // 设置ePWM1周期
EPwm1Regs.TBCTL.bit.CTRMODE = 0; //启动epwm定时器
ADC转换可以将其他传感器模拟信号进行转换,这里没接硬件,给出OLED显示转换视频与图片:
更多回帖