最近一段时间在学习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:可以将笔记发到网上,资源共享,编写文档也是电子工程师们重要的技能。
|