2011,独立年,DSP伴我走过
2011年,是我人生的转折点。终于我告别了向父母要钱的日子,从经济上走向了独立。先是忙着考研,总算顺利通过了初试、复试,拿到了录取通知。这是今年上半年的事了。
上半年还有一件不得不提的事,就是DSP。
接触DSP也就是从今年1月份开始的。考研前夕,学校有项目资金,买了块5509开发板。寒假正式开始研究。
用的HX-5509板子,TDS510仿真器,一共1100元买的
学习过程比较枯燥,无非就是IO口,时钟,中断,外设使用。但HX的视频教程比较丰富,我也从中学到很多知识,得到了一些乐趣,比如,通过DSP播放自己的声音,绘制各种波形、图像,做做FFT,FIR滤波实验等。
但我并不满足光盘里的例程。视频有时候也不够详细,只是泛泛而谈。于是我仔细阅读了TI官方文档,独立编写了一些实用程序,其中规模较大的是USB基础模块,并在学习DSP过程中充分利用了matlab这个工具,简化了开发,加速了学习进程。
其实基础的东西很关键,一遇到问题肯定都是这些方面:硬件配置,开发环境选项,调试环境建立。假期将这三个方面做了充分准备。
毕业设计是用5509完成便携式ECG系统设计,涉及到采集、存储、传输、回放、预警等功能。
有了假期的准备,开始真刀实枪上阵。
前端模拟采集模块已经在前一个项目里成熟,直接拿来用。
假期调试成功ADC,直接利用CCS就能看到采集的波形,很方便。
显示用的TFT屏是坛友Power G6提供的,分辨率240*400,调试顺利
有这三样东东,基本能显示ECG了,看着距离成功不远了,但其实还差很远
其次是数字滤波和心率计算,看了一位师兄提供的外文文献,将其算法实现,这需要用到假期准备的内容了。用matlab仿成功后,将滤波用C语言实现,在DSP上跑起来了。从开题到这里大约用了不到两周时间。
再然后就是存储。系统里有SD卡做大容量存储器,需要按FAT32文件系统来读写,之前没玩过SD卡,这时认真分析了一下文件系统格式,看了些代码,逐渐熟悉了怎么回事,然后确定了方案:将数据分段,按时间先后保存成单独文件,遇到很多问题。后来虽然解决了,但感觉健壮性仍不够。以后项目中采用FATFS。
再然后就是传输。USB调试花费了很长时间,问题也遇到很多,当时战线拉的太长,有时一天内先调试USB不成功,就继续调试SD卡,再然后调试系统菜单……全面进攻。后期重点进攻USB,实现了上位机显示、存储功能。
很快,大学时光就这样结束了,我拿到了毕业证,走向了社会。
研究生生活还没开始,自己决定先找个工作,锻炼自己,积累经验,体验生活。
于是到了京城
于是找了个小公司
于是开始了每天挤地铁
于是蜗居在一个偏僻的宿舍
于是拿着每月3000元的实习生待遇
于是继续搞DSP研究
暑假,酷热的京城,时不时迎来暴雨的洗礼
那段时间很不好过,晚上回宿舍等车有时半小时都等不到,遇到下雨更悲催,打车都没有,回到宿舍已经11点多……
京城的生活就是这样,没有人会“可怜”你,大家都很忙,自顾不暇
在此期间,学习了6455,并完成了几个项目中的部分工作,bootloader(基于Flash),高速总线接口(同Virtex5),NDK百兆网应用程序(上位机+下位机)等,也遇到不少问题,由于以前看过5509,学习时有了更明确的目标,针对应用深入学习了DSP的EMIFA,EDMA3,EMAC接口,并调试成功了这些模块。
终于能有同行称自己“赵工”
以后只要有机会,还会再搞DSP 恭喜! 好,,继续努力 很好,学习能力很强 很强。 mark! 向你学习 学习,向楼主学习,先从简单的学起 回复【楼主位】zhaoyongke 赵永科
-----------------------------------------------------------------------
恩 不错~~~共勉~~ 请问楼主HX-5509板子怎么把程序下到外部FLASH
是否编写二次引导程序
能否提供简单例程参考? 回复【9楼】qwerttt
-----------------------------------------------------------------------
Flash烧写可以直接用开发板提供的例程。
HX的板子不能直接从Flash引导,除非修改CPLD内容(CPLD工程是原理图完成的,改起来需要费点功夫)。建议通过SPI EEPROM或I2C EEPROM进行引导,将用户代码从Flash搬移到内部DARAM,然后运行用户程序。之前应将用户程序编译完生成.bin文件,通过自己写的Flash烧写程序,烧入Flash中。
只是提供一个思路,现在板子送老师了,不能帮你搞定这个问题,不好意思! 回复【9楼】qwerttt
-----------------------------------------------------------------------
我暑假搞过6455上的bootloader in Flash,和你说的情况类似。
工程其实很简单,只贴主程序,涉及Flash烧写的程序可以参考HX提供的例程
//Flash烧写的工程main 函数
void main(void)
{
unsigned char *pflash=(unsigned char *)0xb0000000;//指向Flash起始地址
unsigned int i,n=0;
unsigned int p;
FILE *fp;//文件句柄,用于从PC磁盘读.bin文件
fp=fopen("usercode.bin","rb");//打开文件,只读方式
n=fread( temp_array,1,MAX_SIZE_OF_FILE,fp);//读取文件内容到数组temp_array,返回值n代表实际读取字节数
if (n==0)
{
printf("error\n");
while(1);
}
EraseFlash();//擦除整片Flash
WriteData(0,n,temp_array);//将usercode.bin写入Flash
printf("Burn OK\n");
while(1);
}
//Bootloader 主函数
void (*pfun)(void);
void copy_flash_ram(void)
{
unsigned int i,j,byte_count,ram_start_addr,rom_section_start_addr;
pfun=(void (*)(void))(*((unsigned int *)PROG_IN_FLASH_ADDR));
byte_count=(*((unsigned int *)PROG_IN_FLASH_ADDR+1));
ram_start_addr=(*((unsigned int *)PROG_IN_FLASH_ADDR+2));
rom_section_start_addr=PROG_IN_FLASH_ADDR+12;
if(byte_count==0)
{
byte_count=0;
return;
}
while(1)
{
unsigned int temp=byte_count&0x03;
for(i=0;i<byte_count;i++)
{
for(j=0;j<3*1024;j++);
*((unsigned char *)ram_start_addr+i)=
*((unsigned char *)rom_section_start_addr+i);
}
if(temp)
{
temp=4-temp;
}
rom_section_start_addr+=byte_count+temp;//必须对其到4的整数倍
byte_count=(*((unsigned int *)rom_section_start_addr));
rom_section_start_addr+=4;
ram_start_addr=(*((unsigned int *)rom_section_start_addr));
rom_section_start_addr+=4;
if(byte_count==0)
{
pfun();
}
}
} 记得跟你是校友,帮顶一个 回复【12楼】span42 狂奔的蜗牛
-----------------------------------------------------------------------
哈哈,多谢捧场! 求HX视频 回复【14楼】newkey
-----------------------------------------------------------------------
学校计流量,恕不能上传~~
从官网下可以看这个http://www.mcuhx.com/Files/News12.htm 学习了
页:
[1]