OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
楼主: 龙之谷

菜鸟开帖,持续更新90天,顺序学习开发板大部分实验,以此帖作为一个坚持的动力

  [复制链接]

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-10-17 20:26:14 | 显示全部楼层
今天加班,比平时下班时间还晚,刚吃饭喝酒回来,对于我这喝一瓶啤酒都费劲的选手,今天强撑着喝了2两白,不知道今天还能不能更新,先在下层楼蹲个坑吧,今天更不了,明天加把劲多更一下~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
正点原子逻辑分析仪DL16劲爆上市
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-10-17 20:27:21 | 显示全部楼层
第八二天  2015年10月17日  周六     主题:内存管理打包


注:更新时间2015年10月18日 16:16:12

MALLOC.rar

5.18 KB, 下载次数: 667

ASSIST.txt

1.59 KB, 下载次数: 511

以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2012-12-31
在线时间
4 小时
发表于 2015-10-17 21:59:14 | 显示全部楼层
这毅力不是一般的好,不过建议自己敲代码,不必限于一天,每个都学得心里有数才开下一个
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-10-18 17:08:58 | 显示全部楼层
回复【403楼】hoverxx:
---------------------------------
毅力一般吧,如果不是开帖,估计中间都放弃好几次了,原子哥以及坛友以及自己吹的牛给了我很多动力~

谢谢你的建议,毫无疑问,这只最扎实的学习方法,我个人情况不怎么合适,主要是工作需要与自身能力有落差,急需尽快补上,并且有些东西前面费劲也理解不了,先跳过去,回过头却发现那些已经在不知不觉的学习中自然而然的掌握了~

对于简单一些实验,我也是照着例程敲(抄)代码,前期敲的多,后期把文件放到自己工程,敲一下主函数,测试通过就OK了~

估算一下,一共58个实验,还只是UCOS简单应用且不包括EMWIN,能够坚持敲代码(移植及TFT初始化类代码仅复制)的话,每个例程平均要花至少2~3天时间,也就是至少120~180天,如果加上理解、板上测试,时间可能会更长,这个过程是个比较大的考验~

-------------------------------------------------------------------------------------------------------
借回复楼层,有感而发,以下也是平时经常想的问题~
坚持到现在,虽然还是个“菜鸟”,但对帖子的效果还是开心的,尽管如此,不建议基础一般的通过这种几乎一天一例程的方式进行学习,而是在此基础上进行一些改进,建议如下
1.给自己一个记录,如在论坛开帖,坚持更新,对于类似帖子,个人将尽力参与帖子讨论,帮助是会传递的,鼓励也是~
2.适当宽松的时间,2~3天一个例程,10~15天一次放松休息~
3.保持进度,对于理解不了的可以求助,但超过安排时间则开始下一例程,可在第一遍学习后回过头来解决,可能那时已经不再是问题了,如例程SYS文件夹内容,不建议初学者去问,而是抽时间多看,等学到一定程度,自然明白了,一开始就硬啃,时间浪费、效率不高
这些小体会,不知是否有用,但自己会在以后学习中尽量按此进行~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-10-18 18:02:29 | 显示全部楼层
回复【404楼】龙之谷:
---------------------------------
能坚持这么久,真的很不错了.

以后肯定可以干大事.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-10-18 18:54:02 | 显示全部楼层
回复【405楼】正点原子:
---------------------------------
吼吼~~~~~哈哈
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-10-18 21:40:57 | 显示全部楼层
第八三天  2015年10月18日  周日     主题:W25Q128打包

ASSIT.txt

1.14 KB, 下载次数: 605

W25Q128_FLASH.rar

4.88 KB, 下载次数: 698

以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

6

主题

123

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1279
金钱
1279
注册时间
2012-5-27
在线时间
200 小时
发表于 2015-10-18 21:50:23 | 显示全部楼层
楼主真棒,能够有这么大的毅力去坚持一件事情,给楼主点赞。说实话,当初我有大把大把的时间都没有楼主的学习速度快。
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-10-18 21:57:14 | 显示全部楼层
回复【408楼】STM32F103:
---------------------------------
谢谢鼓励,共勉~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-10-18 23:30:10 | 显示全部楼层
第八三天  2015年10月18日  周日     主题:SD卡打包

SDCARD.rar

16.96 KB, 下载次数: 695

ASSIST.txt

1.18 KB, 下载次数: 599

以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-10-19 22:46:53 | 显示全部楼层
第八四天  2015年10月19日  周一     主题:FATFS打包

FATFS.rar

583.4 KB, 下载次数: 661

ASSIST.txt

1.41 KB, 下载次数: 609

以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

6

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2013-3-20
在线时间
11 小时
发表于 2015-10-20 21:15:55 | 显示全部楼层
fighting!
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-10-20 21:43:15 | 显示全部楼层
回复【412楼】杨胡:
---------------------------------
gongmian~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-10-20 22:15:48 | 显示全部楼层
顶楼主.............
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-10-20 22:16:42 | 显示全部楼层
第八五天  2015年10月20日  周二     主题:存储类应用总结(一)-----汉字显示章节

1.本章中使用FLASH来存储字库,并可以通过SD卡更新字库,STM32F4读取在FLASH里面的字库,然后将汉字显示在LCD上。

2.在W25Q128中,从12M地址以后开始存放字库,前面12M被fatfs占用了,12M以后紧跟着3个字库+UNIGBK,BIN,总大小3.09M,15.10M之后的0.9M供用户自由使用,建议用最后100K字节。
3.在W25Q128中,字库区域占用的总扇区大小:字库信息+unigbk表+3个字库=3238700字节,约占791个扇区。
4.字库在W25Q128中管理相关参数
占用总扇区数
[mw_shl_code=c,true]//字库区域占用的总扇区数大小(3个字库+unigbk表+字库信息=3238700字节,约占791个W25QXX扇区) #define FONTSECSIZE 791[/mw_shl_code]
起始地址
[mw_shl_code=c,true]#define FONTINFOADDR 1024*1024*12 //Explorer STM32F4是从12M地址以后开始存放字库 //前面12M被fatfs占用了. //12M以后紧跟3个字库+UNIGBK.BIN,总大小3.09M,被字库占用了,不能动! //15.10M以后,用户可以自由使用.建议用最后的100K字节比较好.[/mw_shl_code]
字库信息结构体
[mw_shl_code=c,true]//字库信息结构体定义 //用来保存字库基本信息,地址,大小等 __packed typedef struct { u8 fontok; //字库存在标志,0XAA,字库正常;其他,字库不存在 u32 ugbkaddr; //unigbk的地址 u32 ugbksize; //unigbk的大小 u32 f12addr; //gbk12地址 u32 gbk12size; //gbk12的大小 u32 f16addr; //gbk16地址 u32 gbk16size; //gbk16的大小 u32 f24addr; //gbk24地址 u32 gkb24size; //gbk24的大小 }_font_info; [/mw_shl_code]

5.字库在SD卡中位置:将学习光盘中\5,SD卡根目录文件  文件夹下面的SYSTEM文件夹拷贝到SD卡根目录,即完成字库在SD卡的存入。
6.字库在磁盘路径
[mw_shl_code=c,true]//字库存放在磁盘中的路径 u8*const GBK24_PATH="/SYSTEM/FONT/GBK24.FON"; //GBK24的存放位置 u8*const GBK16_PATH="/SYSTEM/FONT/GBK16.FON"; //GBK16的存放位置 u8*const GBK12_PATH="/SYSTEM/FONT/GBK12.FON"; //GBK12的存放位置 u8*const UNIGBK_PATH="/SYSTEM/FONT/UNIGBK.BIN"; //UNIGBK.BIN的存放位置[/mw_shl_code]

7.更新字库过程
①主函数中按键等触发更新字库函数
[mw_shl_code=c,true]update_font(20,110,16,"0:");//更新字库[/mw_shl_code]
其中
[mw_shl_code=c,true]f_mount(fs[0],"0:",1); //挂载SD卡[/mw_shl_code]
②执行更新字库函数
[mw_shl_code=c,true]//更新字体文件,UNIGBK,GBK12,GBK16,GBK24一起更新 //x,y:提示信息的显示地址 //size:字体大小 //src:字库来源磁盘."0:",SD卡;"1:",FLASH盘,"2:",U盘. //提示信息字体大小 //返回值:0,更新成功; // 其他,错误代码. u8 update_font(u16 x,u16 y,u8 size,u8* src) { u8 *pname; u32 *buf; u8 res=0; u16 i,j; FIL *fftemp; u8 rval=0; res=0XFF; ftinfo.fontok=0XFF; pname=mymalloc(SRAMIN,100); //申请100字节内存***** buf=mymalloc(SRAMIN,4096); //申请4K字节内存***** fftemp=(FIL*)mymalloc(SRAMIN,sizeof(FIL)); //分配内存***** if(buf==NULL||pname==NULL||fftemp==NULL) { myfree(SRAMIN,fftemp); myfree(SRAMIN,pname); myfree(SRAMIN,buf); return 5; //内存申请失败 } //先查找文件是否正常 strcpy((char*)pname,(char*)src); //copy src内容到pname strcat((char*)pname,(char*)UNIGBK_PATH); res=f_open(fftemp,(const TCHAR*)pname,FA_READ); if(res)rval|=1<<4;//打开文件失败 strcpy((char*)pname,(char*)src); //copy src内容到pname strcat((char*)pname,(char*)GBK12_PATH); res=f_open(fftemp,(const TCHAR*)pname,FA_READ); if(res)rval|=1<<5;//打开文件失败 strcpy((char*)pname,(char*)src); //copy src内容到pname strcat((char*)pname,(char*)GBK16_PATH); res=f_open(fftemp,(const TCHAR*)pname,FA_READ); if(res)rval|=1<<6;//打开文件失败 strcpy((char*)pname,(char*)src); //copy src内容到pname strcat((char*)pname,(char*)GBK24_PATH); res=f_open(fftemp,(const TCHAR*)pname,FA_READ); if(res)rval|=1<<7;//打开文件失败 myfree(SRAMIN,fftemp);//释放内存***** if(rval==0)//字库文件都存在. { LCD_ShowString(x,y,240,320,size,"Erasing sectors... ");//提示正在擦除扇区 for(i=0;i<FONTSECSIZE;i++) //先擦除字库区域,提高写入速度 { fupd_prog(x+20*size/2,y,size,FONTSECSIZE,i);//进度显示 W25QXX_Read((u8*)buf,((FONTINFOADDR/4096)+i)*4096,4096);//读出整个扇区的内容 for(j=0;j<1024;j++)//校验数据 { if(buf[j]!=0XFFFFFFFF)break;//需要擦除 } if(j!=1024)W25QXX_Erase_Sector((FONTINFOADDR/4096)+i); //需要擦除的扇区 } myfree(SRAMIN,buf); LCD_ShowString(x,y,240,320,size,"Updating UNIGBK.BIN"); strcpy((char*)pname,(char*)src); //copy src内容到pname strcat((char*)pname,(char*)UNIGBK_PATH); res=updata_fontx(x+20*size/2,y,size,pname,0); //更新UNIGBK.BIN if(res){myfree(SRAMIN,pname);return 1;} LCD_ShowString(x,y,240,320,size,"Updating GBK12.BIN "); strcpy((char*)pname,(char*)src); //copy src内容到pname strcat((char*)pname,(char*)GBK12_PATH); res=updata_fontx(x+20*size/2,y,size,pname,1); //更新GBK12.FON if(res){myfree(SRAMIN,pname);return 2;} LCD_ShowString(x,y,240,320,size,"Updating GBK16.BIN "); strcpy((char*)pname,(char*)src); //copy src内容到pname strcat((char*)pname,(char*)GBK16_PATH); res=updata_fontx(x+20*size/2,y,size,pname,2); //更新GBK16.FON if(res){myfree(SRAMIN,pname);return 3;} LCD_ShowString(x,y,240,320,size,"Updating GBK24.BIN "); strcpy((char*)pname,(char*)src); //copy src内容到pname strcat((char*)pname,(char*)GBK24_PATH); res=updata_fontx(x+20*size/2,y,size,pname,3); //更新GBK24.FON if(res){myfree(SRAMIN,pname);return 4;} //全部更新好了 ftinfo.fontok=0XAA; W25QXX_Write((u8*)&ftinfo,FONTINFOADDR,sizeof(ftinfo)); //保存字库信息 } myfree(SRAMIN,pname);//释放内存***** myfree(SRAMIN,buf);//***** return rval;//无错误. } [/mw_shl_code]
③更新字库依据更新内容分为四个阶段,每个阶段都调用同一个更新内容函数
[mw_shl_code=c,true]//更新某一个 //x,y:坐标 //size:字体大小 //fxpath:路径 //fx:更新的内容 0,ungbk;1,gbk12;2,gbk16;3,gbk24; //返回值:0,成功;其他,失败. u8 updata_fontx(u16 x,u16 y,u8 size,u8 *fxpath,u8 fx) { u32 flashaddr=0; FIL * fftemp; u8 *tempbuf; u8 res; u16 bread; u32 offx=0; u8 rval=0; fftemp=(FIL*)mymalloc(SRAMIN,sizeof(FIL)); //分配内存***** if(fftemp==NULL)rval=1; tempbuf=mymalloc(SRAMIN,4096); //分配4096个字节空间***** if(tempbuf==NULL)rval=1; res=f_open(fftemp,(const TCHAR*)fxpath,FA_READ); if(res)rval=2;//打开文件失败 if(rval==0) { switch(fx) { case 0: //更新UNIGBK.BIN ftinfo.ugbkaddr=FONTINFOADDR+sizeof(ftinfo); //信息头之后,紧跟UNIGBK转换码表 ftinfo.ugbksize=fftemp->fsize; //UNIGBK大小 flashaddr=ftinfo.ugbkaddr; break; case 1: ftinfo.f12addr=ftinfo.ugbkaddr+ftinfo.ugbksize; //UNIGBK之后,紧跟GBK12字库 ftinfo.gbk12size=fftemp->fsize; //GBK12字库大小 flashaddr=ftinfo.f12addr; //GBK12的起始地址 break; case 2: ftinfo.f16addr=ftinfo.f12addr+ftinfo.gbk12size; //GBK12之后,紧跟GBK16字库 ftinfo.gbk16size=fftemp->fsize; //GBK16字库大小 flashaddr=ftinfo.f16addr; //GBK16的起始地址 break; case 3: ftinfo.f24addr=ftinfo.f16addr+ftinfo.gbk16size; //GBK16之后,紧跟GBK24字库 ftinfo.gkb24size=fftemp->fsize; //GBK24字库大小 flashaddr=ftinfo.f24addr; //GBK24的起始地址 break; } while(res==FR_OK)//死循环执行 { res=f_read(fftemp,tempbuf,4096,(UINT *)&bread); //读取数据 if(res!=FR_OK)break; //执行错误 W25QXX_Write(tempbuf,offx+flashaddr,4096); //从0开始写入4096个数据 offx+=bread; fupd_prog(x,y,size,fftemp->fsize,offx); //进度显示 if(bread!=4096)break; //读完了. } f_close(fftemp); } myfree(SRAMIN,fftemp); //释放内存***** myfree(SRAMIN,tempbuf); //释放内存***** return res; } [/mw_shl_code]
9.更新字库主要过程点
①确定更新内容SD卡路径
[mw_shl_code=c,true]strcpy((char*)pname,(char*)src); //copy src内容到pname strcat((char*)pname,(char*)UNIGBK_PATH); [/mw_shl_code]
②确定更新内容在W25Q128中数据信息
[mw_shl_code=c,true]ftinfo.ugbkaddr=FONTINFOADDR+sizeof(ftinfo); //信息头之后,紧跟UNIGBK转换码表 ftinfo.ugbksize=fftemp->fsize; //UNIGBK大小 flashaddr=ftinfo.ugbkaddr;[/mw_shl_code]
③读取SD卡数据(每次4K字节)
[mw_shl_code=c,true]res=f_read(fftemp,tempbuf,4096,(UINT *)&bread); //读取数据[/mw_shl_code]
其中,fftemp中存储路径信息
④将读出数据写入W25Q128(每次4K字节)
[mw_shl_code=c,true]W25QXX_Write(tempbuf,offx+flashaddr,4096); //从0开始写入4096个数据 [/mw_shl_code]

10.内存分配总结
①在update_font函数中
[mw_shl_code=c,true]pname=mymalloc(SRAMIN,100); //申请100字节内存 存放路径信息 buf=mymalloc(SRAMIN,4096); //申请4K字节内存 用于辅助扇区擦除 fftemp=(FIL*)mymalloc(SRAMIN,sizeof(FIL)); //分配内存 存放相关文件的FIL结构体数据 [/mw_shl_code]

使用完以后分别释放内存
[mw_shl_code=c,true]myfree(SRAMIN,fftemp); myfree(SRAMIN,pname); myfree(SRAMIN,buf);[/mw_shl_code]

②在updata_fontx函数中
[mw_shl_code=c,true]fftemp=(FIL*)mymalloc(SRAMIN,sizeof(FIL)); //分配内存 同上 tempbuf=mymalloc(SRAMIN,4096); //分配4096个字节空间 拷贝数据缓冲区(4K)[/mw_shl_code]

使用完以后分别释放内存
[mw_shl_code=c,true] myfree(SRAMIN,fftemp); //释放内存 myfree(SRAMIN,tempbuf); //释放内存[/mw_shl_code]

总结:可见,在使用过程中,根据我们的需要内存量调用mymalloc(SRAMIN, XX);进行内存申请即可,调用完以后记得通过myfree(SRAMIN, XX);释放。

ps:本来主要想总结的内容在第10点,前面部分都是一些相关知识点引子,结果引子越写越多,计划今天更新汉字+图片内存方面总结,由于时间原因,只更新了汉字。
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

83

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1987
金钱
1987
注册时间
2014-7-1
在线时间
188 小时
发表于 2015-10-21 17:07:12 | 显示全部楼层
楼主毅力很厉害啊
做一个相信自己的人
回复 支持 反对

使用道具 举报

9

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2012-2-16
在线时间
11 小时
发表于 2015-10-21 17:20:29 | 显示全部楼层
楼主的毅力不是一般的强悍
佩服
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-10-21 17:30:13 | 显示全部楼层
回复【416楼】shenqihao:
---------------------------------
回复【417楼】tuzihog:
---------------------------------
我的坚持一部分来自坛友特别是原子老大鼓励支持,一部分来自帖子标题(自己吹的牛跪着也要实现,要不然打脸太疼)

共勉~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-10-21 20:56:55 | 显示全部楼层
回复【418楼】龙之谷:
---------------------------------
自己的努力才是最重要的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-10-21 21:58:13 | 显示全部楼层
第八六天  2015年10月21日  周三     主题:存储类应用总结(二)

一、图片显示实验

1.piclib.c文件中直接定义了两个函数将内存管理函数再次进行了封装(如下),由此也可见一般文件的内存管理直接申请SRAMIN内存即可
[mw_shl_code=c,true]//动态分配内存 void *pic_memalloc (u32 size) { return (void*)mymalloc(SRAMIN,size); } //释放内存 void pic_memfree (void* mf) { myfree(SRAMIN,mf); }[/mw_shl_code]
2.bmp.c文件中stdbmp_decode函数中则对内存管理的使用进行展示
[mw_shl_code=c,true]
[mw_shl_code=c,true]u8 *databuf; //数据读取存放地址① u16 readlen=BMP_DBUF_SIZE;//一次从SD卡读取的字节数长度[/mw_shl_code]
[/mw_shl_code]
[mw_shl_code=c,true]databuf=(u8*)pic_memalloc(readlen); //开辟readlen字节的内存区域② if(databuf==NULL)return PIC_MEM_ERR; //内存申请失败.[/mw_shl_code]
[mw_shl_code=c,true]f_read(f_bmp,databuf,readlen,(UINT*)&br); //读出readlen个字节 ③[/mw_shl_code]
[mw_shl_code=c,true]pic_memfree(databuf); //④[/mw_shl_code]

二、照相机实验

1.在第四十章,定义了一个很大数组jpeg_buf(124K)来存储JPEG图像数据,本章,由于要使用内存管理,且其他地方也要用到一些数组,所以,不能再定义这么大的数组。由于DCMI接口使用DMA直接传输JPEG数据到外部SRAM会出现数据丢失,所以只能使用内部SRAM。

2.DMA接收采取双缓冲机制,读取到其中一个缓冲区以后,再将缓冲区数据送入外部SRAM,如此循环。最后,再将外部SRAM数据保存到SD卡中。

3.
#define jpeg_dma_bufsize 5*1024 //定义JPEG DMA接收时数据缓存jpeg_buf0/1的大小(*4字节) (DMA寄存器32位)
[mw_shl_code=c,true]jpeg_buf0=mymalloc(SRAMIN,jpeg_dma_bufsize*4); //为jpeg dma接收申请内存 jpeg_buf1=mymalloc(SRAMIN,jpeg_dma_bufsize*4); //为jpeg dma接收申请内存 jpeg_data_buf=mymalloc(SRAMEX,300*1024); //为jpeg文件申请内存(最大300KB)[/mw_shl_code]
[mw_shl_code=c,true]//处理JPEG数据,将最后接收到的JPEG数据拷贝到外部SRAM(jpeg_data_buf) //当采集完一帧JPEG数据后,调用此函数,切换JPEG BUF.开始下一帧采集. void jpeg_data_process(void)[/mw_shl_code]
[mw_shl_code=c,true]//OV2640拍照jpg图片,拍照完成后将数据保存到SD卡 //返回值:0,成功 // 其他,错误代码 u8 ov2640_jpg_photo(u8 *pname)[/mw_shl_code]
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-10-22 23:17:54 | 显示全部楼层
第八七天  2015年10月22日  周四     主题:存储类应用(三)-----音乐播放器实验

1.设置了I2S2的DMA发送,使用双缓冲循环模式,发送给WM8978,并开启了发送完成中断。
2.在wav_play_song函数中
[mw_shl_code=c,true] audiodev.i2sbuf1=mymalloc(SRAMIN,WAV_I2S_TX_DMA_BUFSIZE); audiodev.i2sbuf2=mymalloc(SRAMIN,WAV_I2S_TX_DMA_BUFSIZE);[/mw_shl_code]
其中
[mw_shl_code=c,true]#define WAV_I2S_TX_DMA_BUFSIZE 8192 //定义WAV TX DMA 数组大小(播放192Kbps@24bit的时候,需要设置8192大才不会卡)[/mw_shl_code]
通过循环填充这两个缓冲区,并根据配置进行播放,最后释放内存
[mw_shl_code=c,true] myfree(SRAMIN,audiodev.i2sbuf1);//释放内存 myfree(SRAMIN,audiodev.i2sbuf2);//释放内存 [/mw_shl_code]

以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-10-22 23:23:06 | 显示全部楼层
今天就这么点吧,偷个懒,看程序看了一会才理出个大概,想总结的点却写不出啥东西~~~~~

早上九点接到工程师电话,问我今天上班吗,我还迷迷糊糊说照常上班,八点半的上班点,我去了,迟到一个多小时,下班后自己加班不到两个小时,迟到老板是知道的,加班是老板不知道的,囧~~~~~老板要是提这茬就有话稍稍垫一下了

这几天这休息,晚上回来八九点的时候巨困,必然睡一两个小时,然后十二点以后躺在床上睡不着了,简直无语,生物钟得赶紧调一下了~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-10-22 23:31:39 | 显示全部楼层
回复【422楼】龙之谷:
---------------------------------
还有三天....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-10-22 23:52:32 | 显示全部楼层
回复【423楼】正点原子:
---------------------------------
是啊,回头一想,这八十几天竟有一种一晃而过的赶脚,尽管其中的某些天是有些难熬的~~~~~

呼啦啦~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-10-23 22:52:58 | 显示全部楼层
第八八天  2015年10月23日  周五     例程:存储类应用(四)

一、录音机实验
录音函数wav_recorder()函数中
[mw_shl_code=c,true] i2srecbuf1=mymalloc(SRAMIN,I2S_RX_DMA_BUF_SIZE);//I2S录音内存1申请 i2srecbuf2=mymalloc(SRAMIN,I2S_RX_DMA_BUF_SIZE);//I2S录音内存2申请 [/mw_shl_code]
其中
[mw_shl_code=c,true]u8 *i2srecbuf1; u8 *i2srecbuf2; [/mw_shl_code]
[mw_shl_code=c,true]#define I2S_RX_DMA_BUF_SIZE 4096 //定义RX DMA 数组大小[/mw_shl_code]
录音时通过DMA将数据存入SD卡
[mw_shl_code=c,true]//录音 I2S_DMA接收中断服务函数.在中断里面写入数据 void rec_i2s_dma_rx_callback(void) { u16 bw; u8 res; if(rec_sta==0X80)//录音模式 { if(DMA1_Stream3->CR&(1<<19)) { res=f_write(f_rec,i2srecbuf1,I2S_RX_DMA_BUF_SIZE,(UINT*)&bw);//写入文件 if(res) { printf("write error:%d\r\n",res); } }else { res=f_write(f_rec,i2srecbuf2,I2S_RX_DMA_BUF_SIZE,(UINT*)&bw);//写入文件 if(res) { printf("write error:%d\r\n",res); } } wavsize+=I2S_RX_DMA_BUF_SIZE; } } [/mw_shl_code]
其中
[mw_shl_code=c,true]FIL* f_rec=0; //录音文件 [/mw_shl_code]
[mw_shl_code=c,true]f_rec=(FIL *)mymalloc(SRAMIN,sizeof(FIL)); //开辟FIL字节的内存区域 [/mw_shl_code]
最后,释放内存
[mw_shl_code=c,true] myfree(SRAMIN,i2srecbuf1); //释放内存 myfree(SRAMIN,i2srecbuf2); //释放内存 myfree(SRAMIN,f_rec); //释放内存[/mw_shl_code]

二、视频播放器实验
1.mjpeg.c文件中,解码过程内存申请
[mw_shl_code=c,true]struct jpeg_decompress_struct *cinfo; struct my_error_mgr *jerr; u8 *jpegbuf; //jpeg数据缓存指针[/mw_shl_code]
[mw_shl_code=c,true] cinfo=mymalloc(SRAMCCM,sizeof(struct jpeg_decompress_struct)); jerr=mymalloc(SRAMCCM,sizeof(struct my_error_mgr)); jmembuf=mymalloc(SRAMCCM,MJPEG_MAX_MALLOC_SIZE);//MJPEG解码内存池申请[/mw_shl_code]
其中
[mw_shl_code=c,true]//简单快速的内存分配,以提高速度 #define MJPEG_MAX_MALLOC_SIZE 38*1024 //最大可以分配38K字节[/mw_shl_code]
最后,释放内存
[mw_shl_code=c,true] myfree(SRAMCCM,cinfo); myfree(SRAMCCM,jerr); myfree(SRAMCCM,jmembuf);[/mw_shl_code]
2.videoplayer.c文件中,播放过程内存申请(为提高播放流畅度,使用4个buf)
[mw_shl_code=c,true]u8* i2sbuf[4]; //音频缓冲帧,共4帧,4*5K=20K[/mw_shl_code]
[mw_shl_code=c,true]#define AVI_AUDIO_BUF_SIZE 1024*5 //定义avi解码时,音频buf大小.[/mw_shl_code]
[mw_shl_code=c,true] i2sbuf[0]=mymalloc(SRAMIN,AVI_AUDIO_BUF_SIZE); //申请音频内存 i2sbuf[1]=mymalloc(SRAMIN,AVI_AUDIO_BUF_SIZE); //申请音频内存 i2sbuf[2]=mymalloc(SRAMIN,AVI_AUDIO_BUF_SIZE); //申请音频内存 i2sbuf[3]=mymalloc(SRAMIN,AVI_AUDIO_BUF_SIZE); //申请音频内存 [/mw_shl_code]
初始化
[mw_shl_code=c,true] memset(i2sbuf[0],0,AVI_AUDIO_BUF_SIZE); memset(i2sbuf[1],0,AVI_AUDIO_BUF_SIZE); memset(i2sbuf[2],0,AVI_AUDIO_BUF_SIZE); memset(i2sbuf[3],0,AVI_AUDIO_BUF_SIZE); [/mw_shl_code]
最后,释放内存
[mw_shl_code=c,true] myfree(SRAMIN,i2sbuf[0]); myfree(SRAMIN,i2sbuf[1]); myfree(SRAMIN,i2sbuf[2]); myfree(SRAMIN,i2sbuf[3]);[/mw_shl_code]
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-10-23 23:59:23 | 显示全部楼层
回复【425楼】龙之谷:
---------------------------------
非常不错,毅力可以,继续加油,期待原子哥的礼品喔,呵呵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-10-24 13:44:13 | 显示全部楼层
回复【426楼】八度空间:
---------------------------------
吼吼~~~~~哈哈
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-10-24 15:07:15 | 显示全部楼层
第八九天  2015年10月24日  周六     主题:DMA的那些事(一)

1.直接存储器访问(DMA)用于  外设<----->存储器、存储器<----->存储器  之间提供高速数据传输。

2.在无需任何CPU操作的情况下通过DMA快速移动数据。

3.STM32F4最多有2个DMA控制器(DMA1和DMA2),16个数据流(2*8),每个数据流总共可以有多达8个通道(或请求)。



通道(或请求)选择,每个数据流都与一个DMA请求相关联,此DMA请求可以从8个可能的通道请求中选出,此选择由DMA_SxCR寄存器中的CHSEL[2:0]位控制



仲裁器,每个通道都有一个仲裁器,用于处理DMA请求间的优先级,由DMA_SxCR寄存器中的PL[1:0]位控制(见下图)。优先级管理分为两个阶段:①软件,每个数据流优先级都可以在DMA_SxCR寄存器中配置,非为四个级别:非常高、高、中、低;②硬件,如果两个请求具有相同的软件优先级,则编号低的数据流优先于编号高的数据流,如数据流2>数据流4。

    



4.STM32F4的DMA有双AHB主总线架构,一个用于存储器访问,一个用于外设访问。DMA1控制器的AHB外设端口与DMA2控制器的情况不同,不连接到总线矩阵,因此,仅DMA2数据流能够执行存储器到存储器的传输(见下图,其中DMA2的两个AHB与DMA1的不同)。


其中,DMA1数据流通道映射表


结合APB1外设时钟寄存器(与DMA1相连)



DMA2数据流通道映射表


结合APB2外设时钟寄存器(与DMA2相连)



5.DMA事务,由给定的数据传输序列组成,每个DMA传输包含三项操作:
①通过DMA_SxPAR或DMA_SxM0AR寄存器寻址,从外设数据寄存器或存储器单元中加载数据;
②通过DMA_SxPAR或DMA_SxM0AR寄存器寻址,将加载的数据存储到外设数据寄存器或存储器单元;
③DMA_SxNDTR计数器在数据存储结束后递减,该计数器中包含仍需执行的事务数。
其中,
DMA_SxPAR为外设地址寄存器,用来存储STM32F4外设的地址,如使用串口1,则该寄存器必须写入0X40011004(即&USART1_DR)。

DMA_SxM0AR为存储器地址寄存器,用来存放存储器地址的,如使用Sendbuf【8200】数组来作为存储器,则写入&Sendbuf即可。另STM32F4的DMA支持双缓冲,所以存储器地址寄存器有两个:DMA_SxM0AR和DMA_SxM1AR(仅在双缓冲模式下有效)。
DMA_SxNDTR为数据流数据项数寄存器,控制数据流x的每次传输数据量【0,65535】。会随着传输的进行而减少,为0时代表传输完成。注,这里的数据项数并不是指字节数,如设置数据位宽16位,那么传输一次就是2个字节。

6.源、目标和传输模式,源输入和目标传输在整个4GB区域都可以寻址外设和存储器,传输方向使用DMA_SxCR寄存器中的DIR[1:0]位进行配置。


其中


注,使能某种模式(将DMA_SxCR寄存器中的EN置一)时,数据流会立即启动传输,而当DMA_SxCR寄存器中的EN位由软件清零,则传输立即停止。



7.双缓冲模式,可用于所有DMA1和DMA2数据流,通过将DMA_SxCR寄存器中的DBM位置1即可使能。
①除了有两个存储器指针之外,双缓冲去数据流的工作方式与常规(单缓冲区)数据流一样,使能双缓冲区模式时,将自动使能循环模式,并在每次事务结束时交换存储器指针;
②双缓冲区模式下,每次事务结束时,DMA控制器都会从一个存储器目标交换位另一个存储器目标,这样,软件在处理一个存储器区域时,DMA传输可以填充/使用第二个存储器区域;
③在双缓冲区模式下使能数据流时,可遵循下列条件实时更新AHB存储器基址:
当DMA_SxCR寄存器中CT位为0时,可以写入DMA_SxM1AR寄存器;
当DMA_SxCR寄存器中CT位为1时,可以写入DMA_SxM0AR寄存器。
④使用双缓冲区模式不支持存储器到存储器传输模式,因双缓冲区模式自动使能循环模式,与存储器到存储器的传输模式不兼容。

8.突发传输,是指两个设备之间不间断的连续数据传送,在此模式下,多个数据单元当做一个单元(相当于一个数据块)来传送,从而提高传输效率。(见百度百科:http://baike.baidu.com/view/1514668.htm)

DMA控制器可以产生单次传输或4个、8个、16个节拍的增量突发模式。其中
①突发大小通过软件针对两个AHB端口独立配置,使用DMA_SxCR寄存器中的MBURST[1:0]和PBURST[1:0]位;
②突发大小指示突发中的节拍数,而不是传输的字节数;
③在突发模式下,必须选择地址指针(DMA_SxPAR或DMA_SxM0AR),以确保一个突发块内的所有传输在等于传输大小的地址边界对齐。



⑤选择突发配置时必须遵守AHB协议,即突发传输不得超过1KB地址边界,因为可分配给单个从设备的最小地址空间时1KB,这意味着突发传输不应超过1KB地址边界,否则会产生一个AHB错误,且DMA寄存器不会报告这个错误。(不明白,待进一步学习)

9.FIFO,用于在源数据传输到目标之前临时存储这些数据。
①每个数据流都有一个独立的4字FIFO,阀值级别可通过软件配置DMA_SxFCR寄存器的FTH[1:0]来设置为1/4、1/2、3/4或满;
②为了使能FIFO阀值级别,必须通过将DMA_SxFCR寄存器中的DMDIS位置1来进制直接模式;
③当使用存储器到存储器传输模式时,不得使用直接模式;
④当复位DMA_SxCR寄存器中的EN位来禁止数据流,以及配置数据流(见STM32F4XX中文参考手册218页9.3.17流配置过程)来管理外设到存储器或存储器到存储器的传输时,可以刷新FIFO。
⑤FIFO结构



10.DMA中断,对于每个DMA数据流,可在发生以下事件时产生中断:达到半传输、传输完成、传输错误、FIFO错误、直接模式错误。


以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

2

主题

50

帖子

0

精华

高级会员

Rank: 4

积分
507
金钱
507
注册时间
2015-2-11
在线时间
121 小时
发表于 2015-10-24 16:25:11 | 显示全部楼层
来支持一下。。楼主真的很棒
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-10-24 16:56:44 | 显示全部楼层
回复【429楼】仙景:
---------------------------------
谢谢支持~~~~~

共勉~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-10-24 18:46:14 | 显示全部楼层
回复【428楼】龙之谷:
---------------------------------
不错,比较详细。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-10-24 22:01:16 | 显示全部楼层
回复【430楼】龙之谷:
---------------------------------
还有一天,原子哥的礼品即将揭晓,呵呵


期待ing。。。
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-10-24 23:50:50 | 显示全部楼层
回复【432楼】八度空间:
---------------------------------
哈哈,谢八度老师关注~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-10-25 11:21:26 | 显示全部楼层
第九十天  2015年10月25日  周日     主题:DMA的那些事(二)

一、DMA配置过程

1.使能DMA1/DMA2时钟,并等待数据流可配置。要进行配置,必须等待DMA_SxCR最低位为0才可进行配置。
2.设置目标地址。向DMA_SxPAR寄存器中写入外设端口寄存器地址或向DMA_SxMA0R寄存器中写入存储器地址。
3.设置源地址。向DMA_SxPAR寄存器中写入外设端口寄存器地址或向DMA_SxMA0R寄存器中写入存储器地址。
4.设置传输数据量。向DMA_SxNDTR寄存器中写入要传输的数据量即可。
5.设置DMA2数据流配置信息。通过配置DMAx_SxCR寄存器设置存储器和外设数据位宽、存储器与外设增量模式、是否使用双缓冲、数据流通道等。【注,MDK中DMAx_SxCR名称为DMAx_Streamx->CR
6.使能数据流,启动传输。通过使能DMAx_SxCR的最低位开启DMA传输(如果使用外设需先使能外设DMA传输位,例如使用串口1的DMA传输,需通过USART1->CR3来设置使能)。

二、DMA非双缓冲区使用(以第二十八章DMA实验串口1为例)

1.配置过程
[mw_shl_code=c,true]//DMAx的各通道配置 //这里的传输形式是固定的,这点要根据不同的情况来修改 //从存储器->外设模式/8位数据宽度/存储器增量模式 //DMA_StreamxMA数据流,DMA1_Stream0~7/DMA2_Stream0~7 //chxMA通道选择,范围:0~7 //par:外设地址 //mar:存储器地址 //ndtr:数据传输量 void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u8 chx,u32 par,u32 mar,u16 ndtr) { DMA_TypeDef *DMAx; u8 streamx; if((u32)DMA_Streamx>(u32)DMA2)//得到当前stream是属于DMA2还是DMA1 { DMAx=DMA2; RCC->AHB1ENR|=1<<22;//DMA2时钟使能 }else { DMAx=DMA1; RCC->AHB1ENR|=1<<21;//DMA1时钟使能 } while(DMA_Streamx->CR&0X01);//等待DMA可配置 streamx=(((u32)DMA_Streamx-(u32)DMAx)-0X10)/0X18; //得到stream通道号 if(streamx>=6)DMAx->HIFCR|=0X3D<<(6*(streamx-6)+16); //清空之前该stream上的所有中断标志 else if(streamx>=4)DMAx->HIFCR|=0X3D<<6*(streamx-4); //清空之前该stream上的所有中断标志 else if(streamx>=2)DMAx->LIFCR|=0X3D<<(6*(streamx-2)+16);//清空之前该stream上的所有中断标志 else DMAx->LIFCR|=0X3D<<6*streamx; //清空之前该stream上的所有中断标志 DMA_Streamx->AR=par; //DMA外设地址 DMA_Streamx->M0AR=mar; //DMA 存储器0地址 DMA_Streamx->NDTR=ndtr; //DMA 存储器0地址 DMA_Streamx->CR=0; //先全部复位CR寄存器值 DMA_Streamx->CR|=1<<6; //存储器到外设模式 DMA_Streamx->CR|=0<<8; //非循环模式(即使用普通模式) DMA_Streamx->CR|=0<<9; //外设非增量模式 DMA_Streamx->CR|=1<<10; //存储器增量模式 DMA_Streamx->CR|=0<<11; //外设数据长度:8位 DMA_Streamx->CR|=0<<13; //存储器数据长度:8位 DMA_Streamx->CR|=1<<16; //中等优先级 DMA_Streamx->CR|=0<<21; //外设突发单次传输 DMA_Streamx->CR|=0<<23; //存储器突发单次传输 DMA_Streamx->CR|=(u32)chx<<25;//通道选择 //DMA_Streamx->FCR=0X21; //FIFO控制寄存器 } [/mw_shl_code]
2.使能外设DMA位
[mw_shl_code=c,true]USART1->CR3=1<<7; //使能串口1的DMA发送 [/mw_shl_code]
3.开启传输函数
[mw_shl_code=c,true]//开启一次DMA传输 //DMA_StreamxMA数据流,DMA1_Stream0~7/DMA2_Stream0~7 //ndtr:数据传输量 void MYDMA_Enable(DMA_Stream_TypeDef *DMA_Streamx,u16 ndtr) { DMA_Streamx->CR&=~(1<<0); //关闭DMA传输 while(DMA_Streamx->CR&0X1); //确保DMA可以被设置 DMA_Streamx->NDTR=ndtr; //DMA 存储器0地址 DMA_Streamx->CR|=1<<0; //开启DMA传输 } [/mw_shl_code]

三、DMA双缓冲区使用(以第四十八章音乐播放器实验数据流4为例)

1.配置过程
[mw_shl_code=c,true]//I2S2ext RX DMA配置 //设置为双缓冲模式,并开启DMA传输完成中断 //buf0:M0AR地址. //buf1:M1AR地址. //num:每次传输数据量 void I2S2ext_RX_DMA_Init(u8* buf0,u8 *buf1,u16 num) { RCC->AHB1ENR|=1<<21; //DMA1时钟使能 while(DMA1_Stream3->CR&0X01);//等待DMA1_Stream3可配置 DMA1->LIFCR|=0X3D<<22; //清空通道3上所有中断标志 DMA1_Stream3->FCR=0X0000021;//设置为默认值 DMA1_Stream3->AR=(u32)&I2S2ext->DR; //外设地址为:I2S2ext->DR DMA1_Stream3->M0AR=(u32)buf0;//暂不设置 DMA1_Stream3->M1AR=(u32)buf1;//暂不设置 DMA1_Stream3->NDTR=num; //设置DMA传输长度 DMA1_Stream3->CR=0; //先全部复位CR寄存器值 DMA1_Stream3->CR|=0<<6; //外设到存储器模式 DMA1_Stream3->CR|=1<<8; //循环模式 DMA1_Stream3->CR|=0<<9; //外设非增量模式 DMA1_Stream3->CR|=1<<10; //存储器增量模式 DMA1_Stream3->CR|=1<<11; //外设数据长度:16位 DMA1_Stream3->CR|=1<<13; //存储器数据长度:16位 DMA1_Stream3->CR|=1<<16; //中等优先级 DMA1_Stream3->CR|=1<<18; //双缓冲模式 DMA1_Stream3->CR|=0<<21; //外设突发单次传输 DMA1_Stream3->CR|=0<<23; //存储器突发单次传输 DMA1_Stream3->CR|=3<<25; //选择通道3 I2S2ext_RX通道 DMA1_Stream3->FCR&=~(1<<2); //不使用FIFO模式 DMA1_Stream3->FCR&=~(3<<0); //无FIFO 设置 DMA1_Stream3->CR|=1<<4; //开启传输完成中断 MY_NVIC_Init(0,1,DMA1_Stream3_IRQn,2); //抢占1,子优先级1,组2 } [/mw_shl_code]
2.中断函数
[mw_shl_code=c,true]//录音 I2S_DMA接收中断服务函数.在中断里面写入数据 void rec_i2s_dma_rx_callback(void) { u16 bw; u8 res; if(rec_sta==0X80)//录音模式 { if(DMA1_Stream3->CR&(1<<19)) { res=f_write(f_rec,i2srecbuf1,I2S_RX_DMA_BUF_SIZE,(UINT*)&bw);//写入文件 if(res) { printf("write error:%d\r\n",res); } }else { res=f_write(f_rec,i2srecbuf2,I2S_RX_DMA_BUF_SIZE,(UINT*)&bw);//写入文件 if(res) { printf("write error:%d\r\n",res); } } wavsize+=I2S_RX_DMA_BUF_SIZE; } } [/mw_shl_code]
其中,i2s_rx_callback()为
[mw_shl_code=c,true]//录音 I2S_DMA接收中断服务函数.在中断里面写入数据 void rec_i2s_dma_rx_callback(void) { u16 bw; u8 res; if(rec_sta==0X80)//录音模式 { if(DMA1_Stream3->CR&(1<<19)) { res=f_write(f_rec,i2srecbuf1,I2S_RX_DMA_BUF_SIZE,(UINT*)&bw);//写入文件 if(res) { printf("write error:%d\r\n",res); } }else { res=f_write(f_rec,i2srecbuf2,I2S_RX_DMA_BUF_SIZE,(UINT*)&bw);//写入文件 if(res) { printf("write error:%d\r\n",res); } } wavsize+=I2S_RX_DMA_BUF_SIZE; } } [/mw_shl_code]
3.使能外设DMA位
[mw_shl_code=c,true]I2S2ext->CR2|=1<<0; //I2S2ext RX DMA请求使能.[/mw_shl_code]
4.开启、关闭DMA传输
[mw_shl_code=c,true]//I2S开始录音 void I2S_Rec_Start(void) { DMA1_Stream3->CR|=1<<0; //开启DMA RX传输 } //关闭I2S录音 void I2S_Rec_Stop(void) { DMA1_Stream3->CR&=~(1<<0); //结束录音 }[/mw_shl_code]

以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-10-25 11:31:45 | 显示全部楼层
OK,最后把存储相关的一些点和DMA的一些点进行了简单的总结,把对自己来说比较虚的这两部分补充一下,虽仍需要进一步掌握,但心里比较踏实一些了~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-10-25 12:12:45 | 显示全部楼层
申酷申酷.....

更新过程中虽存在很多问题:
1.更新内容既非原创,内容深度又不足;
2.更新内容长短参差不齐,受心情、当天内容影响,更新内容所用时长差异较大,一般在两个小时左右,一部分时长低于一个半小时;
3.更新顺序、整体环节不够顺畅、调理等等。
但仍希望置酷,觉得有个酷帖是蛮酷的一件事~~~~~

顺带希望原子哥帮忙在楼主位整理一下本帖目录,附件为目录excel和txt格式,如果方便,帮忙把txt格式内容直接粘贴到楼主位,方便查看,如果放不下直接将txt或excel格式直接附件到楼主位。

Thank you for your encouragement!

90天目录--2015年10月25日.xls

23 KB, 下载次数: 744

90天目录--2015年10月25日.txt

4.47 KB, 下载次数: 638

以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

3

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2015-9-22
在线时间
3 小时
发表于 2015-10-25 20:24:31 | 显示全部楼层
顶一下,楼主,学习的榜样呀!监督你,加油啊!
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-10-25 20:32:36 | 显示全部楼层
回复【437楼】月牙业务:
---------------------------------
九十天今天结束的~~~~~哈哈
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-10-25 21:45:02 | 显示全部楼层
回复【436楼】龙之谷:
---------------------------------
COOL....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-10-25 22:14:14 | 显示全部楼层
回复【439楼】正点原子:
---------------------------------
哈哈,前边贴个红红的酷看着是好看~~~~~

今天另开了两个帖子,是不定期更新的,原子哥平时如果恰好看到顺带手鼓励一下就好了,不要再经常鼓励了,个人水平不高,这个帖子原子哥还经常来顶,我有点不好意思,那两个帖子等到更新一定量以后,原子哥看着还可以,基本达到给酷的水平,给个酷就是对我最大的鼓励支持了~~~~~

希望我也能像原子哥一样能够以鼓励等正能量去影响帮助一些人~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-10-25 22:26:01 | 显示全部楼层

**********************************分********隔*******线******************************************

本帖进入第二阶段:不定期更新阶段

计划内容:液晶屏(TFTLCD)、存储(如SD卡等)、通信(如GPRS、Zigbee等)、操作系统(如UCOSII等)、UI(如EMWIN等),顺序不分先后,亦可穿插进行

开始时间:2015年10月25日

以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-10-29 23:10:29 | 显示全部楼层
续01-----UCOSII打包

UCOSII.rar

95.08 KB, 下载次数: 649

ASSIST.txt

1.29 KB, 下载次数: 626

以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2015-8-21
在线时间
0 小时
发表于 2015-10-31 19:34:59 | 显示全部楼层
好久不来支持楼主了,继续加油!
最近找工作终于结束了,今年经济形势很不好,从十一之前开始找,终于找到了。
最后签约华三通信了。楼主驾照考完了么
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-1 13:51:00 | 显示全部楼层
回复【443楼】neary:
---------------------------------
恭喜啊~~~~~

找的还挺快的,找的工作也挺好,nice

最近比较忙,一直没时间也没心思去报名,刚报上名,还有二十几天补考

共勉~~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2015-6-2
在线时间
0 小时
发表于 2015-11-1 21:09:30 | 显示全部楼层
回复【444楼】龙之谷:
---------------------------------
你好励志啊,争取向你学习,我现在有关定时器中断的地方不回来,你能帮我看看吗,我最近的那个帖子
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-11-1 21:21:12 | 显示全部楼层
回复【442楼】龙之谷:
---------------------------------
还在更新啊?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-1 22:08:46 | 显示全部楼层
回复【445楼】on the road:
---------------------------------
我用的寄存器,库函数不太熟哦

你注意一下使能那条语句,先测试感受一下使能和屏蔽掉使能有什么区别,再根据需要使用吧
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
 楼主| 发表于 2015-11-1 22:20:07 | 显示全部楼层
回复【446楼】正点原子:
---------------------------------
哈哈,愚公在此,关于F4的实验学习、总结还会更新下去,只是更新频率会变慢~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-11-1 23:43:52 | 显示全部楼层
回复【448楼】龙之谷:
---------------------------------
不错啊.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

22

主题

104

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2015-5-4
在线时间
34 小时
发表于 2015-11-2 16:51:45 | 显示全部楼层
楼主真有毅力,向你学习~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表