打印
[STM32F1]

【转】以STM32F1读写Flash为例谈谈书写单片机程序的经验

[复制链接]
1286|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

最近一段时间在学习STM32F1,一开始接触时觉得比较难,后来间间断断用了几个星期熟悉后,发现使用STM32F1其实比51更加简单,主要表现在,STM32F1内置资源丰富,它的库函数十分齐全,直接调用即可,而51还需要自己配置寄存器(相信有经验的伙伴已经将51的程序整理成一个文件,以后直接调用);STM32F1支持在线调试,这个功能十分强大,很快就能将程序的问题找出并解决,而我印象中支持在线调试的51不多。

  说明一下,下面内容适合有一定单片机基础的伙伴,对于刚接触单片机的伙伴来说理解起来可能有点困难,对于大牛来说,小弟总结的内容真的是小儿科了。

  介绍内容:使用STM32F103VET6驱动Flash W25Q16;分享阅读元器件Datasheet的方法;分享写单片机程序的良好习惯。

  步骤:

  1:搜集资料,主要是开发板的原理图,元器件的Datasheet等等;

  2:打开元器件Datasheet,大致浏览一遍,形成对元器件的总体印象;

  3:回到元器件Datasheet目录处,对于写驱动程序来说,只需要看器件的特点,引脚;定义,寄存器情况,指令表,时序等等,不需要看封装等信息,按着需要看的内容顺序,浏览一次,将自己觉得重要的地方标记起来,并写上注释;

  4:开始写程序,一边对着Datasheet一边写程序,先写最简单的程序,每实现一个功能就应该验证一次程序的可行性。

  好,开始,打开Datasheet,按照步骤写程序。

  1.搜集资料就不多说了,芯片Datasheet可以轻易地在21IC或者淘宝商品页的链接下载获到。

  2.打开Datasheet,先简单浏览一次,写出关键词:

  截取芯片手册一部分(PS:小伙伴们不要看见英文就害怕,这些手册词汇都有一定的范围的,而且我们还有“有道”呢)

  

  可以轻易得到一些关于芯片的信息,以W25Q16为例,关键词:16Mb(2MB),SPI,2.7V-3.6V,256B/page,instruction,read,write,erase,protect,StatusRegister等等。

  这时有接触过单片机的伙伴都可以轻易想到:这个Flash芯片大小2MB,通过SPI总线写入特定指令完成读、写、擦除、保护Flash的操作,同时可通过读SR(状态寄存器)的某些位可以获取芯片的状态(操作完成?可以写入下一个指令?)。

  能到想到这些已经达到简单浏览Datasheet的效果了,这个很简单是不是?

  3.别急着写程序,第二次读Datasheet要稍微仔细一点,可以不求甚解,对于一些没见过的术语不要钻牛角尖,否则会浪费很多时间并且打击信心。(W25Q16的详细笔记和已经注释了的Datasheet在**最后提供)

  以Datasheet一段截屏为例,这是写Flash一页(page)的指令:(同上,小伙伴不要看见英文就害怕啊,看多了就熟练啦)

  这时候,可以记录:

  A:只能写在已经擦除过的空间(即不能写在已经有数据的地方)

  B:写入命令之前必须先执行“使能写”操作

  C:CS(片选)引脚在执行整个指令的过程都必须为低

  D:如果写入的地址越界,指针会上卷,页开始的数据会被覆盖

  (比如一页的地址范围是0x000000--0x0000ff,你在0x0000fe处开始写入3个字节的数据,那个第一个数据存放在0x0000fe,第二个0x0000ff,第三个0x000000,原先在0x000000的数据会被覆盖掉)

  E:数据写完后,CS必须拉高,指令才能被正确执行

  F:可以检查状态寄存器的Busy位判断该操作是否已经完成(即时候可以执行下一个操作)

  所以,写Flash的顺序自然就出来了,执行“使能写”操作→拉低CS引脚→SPI写入写操作指令(0x02)→SPI写入希望写入的地址→SPI写数据→拉高CS→判断操作是否完成。OK!!

  那如何执行“使能写”操作?Datasheet讲得很清楚的,拉低CS→写入指令0x06→拉高CS,OK了。

  

  按照这种方法,把Datasheet中几处重要的地方做好笔记(读操作,写操作,擦除操作,保护操作,引脚情况,状态寄存器)。

  4.好,写程序了,怎么写?SPI嘛,读写指令嘛,状态寄存器嘛,地址嘛,这时候头脑可能是乱七八糟的,怎么开始?再整理一下思路,SPI是与芯片通信的方法,读,写,擦除都是独立的功能,状态寄存器判断指令是否已经执行完毕。所以,SPI→读/写/擦除→读SR判断指令是否执行完毕。

  那么先搞定SPI啊,这个容易啊,百度“SPI”“STM32 SPI程序”,这里不讲SPI,理论知识网上多如牛毛。对于SPI,我只需记住几个关键字“全双工”“MISO/MOSI”“哪个边沿取样”,记住这几个关键词,我就能记得SPI大概是怎么样的。提醒一下,在STM32上和其他资源的初始化程序一样,写SPI程序得考虑几点,“时钟”“引脚”“中断”“DMA”,上图(原理图,步骤一已经准备好了),

  

  

  引脚有了,有几个引脚得用复用功能,不用中断,不用DMA,打开SPI和引脚的时钟就行。配置后,引出SPI读写函数接口(全双工,读写同时进行),SPI就这么愉快地搞掂啦。

  好,写Flash操作,刚才分析过,上图:

  

  你看一下,“使能写”操作→拉低CS引脚→SPI写入写操作指令(0x02)→SPI写入希望写入的地址→SPI写数据→拉高CS→判断操作是否完成。完全是按照Datasheet的步骤。

  对于,读Flash操作,擦除操作,保护操作,同一个套路,不过建议每写完一个操作函数,放在主函数运行一下,判断可行性(第一次通常不能正常运行的,哈哈哈哈)。

  轻易完成了啊,我使用STM32F1写W25Q16的程序大概用了1天,实现了读,写,擦除,保护功能,并且整理好了C文件和H文件,写好了注释,以后直接调用就行。

  W25Q16整理资料(带注释Datasheet,笔记,程序)下载链接:

  以下是分享写单片机程序的良好习惯:

  1:写程序前先收集资料,这会为你节省很多时间;

  2:来一波**汤,伙伴们一定不要害怕看英文资料啊,单片机你都会了,英文还算什么啊,咋们学习的过程就是:发现问题→1秒钟害怕→寻找解决方法→解决掉,对于英文也这样(失去英文,你会失去很多,呵呵呵);

  3:每写完一个函数或实现一个功能,做好注释,写上日期,功能,参数,返回值,注意的地方,使用函数的例程,一言不合,上图

  

  4:程序整理好,写成一个一个头文件,想怎么调用就怎么调用,功在当下,利在千秋的做法;

  

  5:多点看看高手们的程序是怎样写的,高手们有些思路真的会让你大开眼界,这种做**让新手进步很快;

  6:写单片机的程序的时候最后不要停下来做别的事情(比如2016年8月8号我写W25Q16的程序,2016年8月9号(七夕)我约女朋友去玩),这样真不行...好吧,我单身;

  7:程序写完,要整理程序笔记,Datasheet的笔记,好记性不如烂笔头,真理,无论时隔多久,只要打开笔记(电子文档),很快就能想起来,节省大量时间,我在这里吃个大亏呢;

  8:可以将笔记发到网上,资源共享,编写文档也是电子工程师们重要的技能。


8ac71e2a6efe45efb2fa9fccf950c36f_th.jpeg (88.67 KB )

8ac71e2a6efe45efb2fa9fccf950c36f_th.jpeg

b8c7c146d4b44144bf29bc0c96692212.png (13.53 KB )

b8c7c146d4b44144bf29bc0c96692212.png
沙发
叫我女王思密达|  楼主 | 2016-8-31 00:30 | 只看该作者

使用特权

评论回复
板凳
mmuuss586| | 2016-8-31 09:47 | 只看该作者
谢谢分享;

使用特权

评论回复
地板
叫我女王思密达|  楼主 | 2016-8-31 23:33 | 只看该作者

不客气!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

51

主题

81

帖子

1

粉丝