一、认识其本质
STM32在进入中国市场的时候,商家为了迎合中国市场,翻译了很多英文文献,所以STM32相对与其他单片机的资料是相对丰富的,这也是很多人推崇STM32的原因,这对于我们学习来说也是相当不错的,但是由于翻译版本很多,注意以官方版本为准,在看文档发现不对时应该参考官方文档
固件库其实是官方为了加快开发速度,帮助用户快速上手芯片,进行二次开发而研究出来的,它的出现大大缩短了芯片开发周期
二、为什么要使用固件库
(一)基于寄存器的编程(传统编程方式)
好处:开发者可以了解单片机较为底层的寄存器,了解程序在硬件上的具体实现方式,便于纠错。
不足:
移植性差:由于单片机通常由很多外设,而不同型号的的单片机的寄存器操作方式都有所不同,当进行移植是需要修改的内容很多,工作量大。
效率低下:由于单片机内部资源丰富,需要设置的寄存器非常多,需要花很长的时间查阅用户手册才能完成。
(二)基于固件库的编程
极大缩短了开发周期,从而减少了开发成本
不用深入底层底层便可以灵活规范地操作每一个外设,使编程思维更清晰,有利于开发人员将精力集中在顶层设计上
具有可重入性,便于移植,便于二次开发
固件库的C源代码只是用了最基本的C编程的知识,所有代码经过严格测试,易于理解和使用,并且配有完整的文档,非常方便进行二次开发和应用。
另外,STM32的固件库是开源的,它的源码可以供我们学习参考,参考其如何使用c语言去实现一些复杂的功能。
三、所需材料
获取STM32官方固件库,从网盘获取, 密码:8sgn
如何从ST官网获取芯片的相关文档手册,中文版 ,密码:wupy
四、模板创建
(一)工作区和工程的建立
File->New Workspace
Project->Create New Project
建立工程文件夹
File->Save Workspace
最后是这样
(二)STM32固件库的介绍
固件库的文件结构:下表简述了固件库文件内容及作用
固件库的文件结构
另一位博主的详解
(三)工程模板的建立及移植
1.复制工程源码
虽然STM32 固件库里面提供了很多例程给我们,但是都是基于ST 官方发行的一些评估板的,在实际应用当中,我们可能由于某些原因,不可能和官方评估板做的一模一样,因此需要在STM32 标准例程的基础上,进行移植和修改。
建立层叠的文件夹,便于源码的管理,在根文件夹里面建立“USER”,“CMSIS”,“FWLIB”,“DRIVER”几个文件夹,如下图所示。其中,“USER”文件夹,主要存放用户应用程序和中断文件,如main.c 等等;“CMSIS”主要存放内核和系统相关的代码;“FWLIB”主要存放STM32 标准外设的驱动代码,“DRIVER”主要存放用户的驱动代码
复制相关文件至建立的模板文件夹。需要复制的文件夹如下表(小技巧:同时打开固件库文件夹和模板文件夹,找到文件后直接ctrl+c、ctrl+v就OK了):
2.添加工程源码
我们最基本的源码文件已经复制到我们建立的工程文件夹里面,接下
来要做的就是在IAR 里面创造代码管理文件夹,以及将相关的代码添加到文件夹
里面。
在IAR中添加管理文件夹,打开建立好的工作区
右键工程名->Add->Add Group…输入文件夹名称->OK,需要建立的文件夹如下图所示
添加所需的文件,Add->Add File,需要添加的文件如下图
最后是这样
关于启动文件的选择
3.IDE的配置
第一次编译:Project->Make,然后是一堆错误,如下:
我们看到这些错误大多是 cannot open source file "stm32f10x_spi.h" ,编译器告诉为们找不到对应的头文件。解决方案是在option中添加对应的头文件,右键工程名->Option…->Category->C/C++ Compiler->Preprocessor->在“Additional include directories:”输入头文件的包含路径:
$PROJ_DIR$
$PROJ_DIR$CMSIS
$PROJ_DIR$FWLIBinc
$PROJ_DIR$USER
每一行里面用回车隔开,IAR是支持相对文件路径的,但是要使用$PROJ_DIR$,$PROJ_DIR$即代表根目录文件夹“STM32F10X Template”。
第二次编译,还是有很多错误,仔细观察可以发现,错误大多是 "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)" ,请选择芯片的型号
双击错误,条船到如图所示的地方
用Find功能找到其定义的地方
这其实是预编译处理,需要用户指定需要使用的芯片型号,解决方案是在Options中进行预编译处理,Options->Category->C/C++ compiler->Preprocessor->在“Defined Symbol”里面定义所需要的芯片容量,添加STM32F10X_MD,如下图:
第三次编译,编译器告诉我们没有包含“core_cm3.h”文件,解决方案是解决方式还是两种,一是为将库函数里面的core_cm3.h文件加入进工程。但是这样编译可能会出现其他错误,因此直接使用第二种方法,即使用IAR 自带的core_cm3.h文件。Option->General Option->Target里面选择芯片型号,接着在在Option->General Option->Library Configuration里面勾选“use
CMSIS”,点击“OK”,如下图所示:
第四次编译,编译器告诉我们缺少main.c文件,解决方案File->New File->File->Save->命名为main.c->右键USER->Add->Add “main.c”,打开main.c,添加如下代码
#include "stm32f10x.h"
int main()
{
return 0;
}
第五次编译,0错误
尽管错误已经没有了,但是当我们调用驱动库去操作外设的时候还是发现有问题,将以下代码添加到main.c文件中,Make,如下图
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
int main()
{
GPIO_SetBits(GPIOA,0);
return 0;
}
这是因为使用驱动库的宏没有打开,解决方案:Options->Category->C/C++ compiler->Preprocessor->Defined Symbol添加USE_STDPERIPH_DRIVER,如图
然后设置链接选项里面的flash 配置文件,Linker->Config->Linker Configuration file->,把“Override Default”选项勾选上,手动设置文件路径为$PROJ_DIR$stm32f10x_flash.icf
最后一次编译,如下(记住要先右键工程名->Clean然后再Make):
错误没有,但是还是会有警告,而且警告的数量始终是53个,这是使用了固件库的原因,但是不影响使用
到这里,一个基本的工程模板就建好了,以后的编程都可以基于这个模板开发,先复制一个副本,然后改成需要的名字,记住要保留模板文件
上一篇:嵌入式STM32建立工程的详细步骤
下一篇:STM32学习之旅① 开发环境搭建
推荐阅读
史海拾趣
Actel Corporation 是一家曾经在可编程逻辑器件(FPGA)领域有所建树的公司。以下是该公司发展的五个相关故事:
公司创立与初期发展: Actel Corporation成立于1985年,总部位于美国加利福尼亚州。公司创始人包括Bernard Vonderschmitt等人,致力于研发和生产可编程逻辑器件。最初,Actel专注于开发用于航空航天和国防应用的高可靠性FPGA芯片,以满足对于高度可靠性和耐辐射性的需求。
技术创新与产品推出: Actel在FPGA技术领域取得了一系列创新成果。公司引入了基于非挥发性技术(NVCM)的可编程逻辑器件,该技术使得FPGA芯片能够在断电后保持配置状态,具有低功耗、高可靠性等优点。Actel的产品涵盖了不同规模和功耗要求的市场,广泛应用于航空航天、通信、工业控制等领域。
市场拓展与国际化发展: 随着产品线的不断完善和市场认可度的提升,Actel逐步开拓了国内外市场。公司在美国设立了销售和技术支持中心,并与全球各地的合作伙伴建立了合作关系,进一步拓展了国际业务。Actel的产品远销至欧洲、亚洲等地区,赢得了广泛的市场认可。
并购与重组: 随着FPGA市场竞争的加剧和市场需求的变化,Actel在发展过程中进行了一系列并购和重组。其中最重要的一次是2010年,Actel被Microsemi Corporation收购,成为其子公司。这一并购使得Actel能够借助Microsemi的资源和实力,进一步提升产品竞争力和市场地位。
终止品牌: 尽管Actel曾经在FPGA市场取得一定成就,但随着时间的推移和市场竞争的加剧,Actel品牌逐渐退出市场。2012年,Microsemi宣布停止使用Actel品牌,并将其产品线整合到Microsemi旗下,标志着Actel品牌的终结。
随着全球化的加速发展,微芯生物也积极开展国际合作与交流。他们与国际知名医药企业、科研机构以及高校建立了紧密的合作关系,共同开展新药研发和技术创新。通过国际合作与交流,微芯生物不仅吸收了国际先进的研发理念和技术经验,还为公司的发展带来了更广阔的市场空间和合作机会。
随着业务的不断扩展和产品的不断创新,DEC在1966年决定公开上市。这次上市不仅为DEC带来了大量的资金,还提升了其在业界的知名度。借助资本市场的力量,DEC能够进一步扩大生产规模,加强研发能力,并推出更多具有竞争力的产品。在上市后的几年里,DEC的销售收入快速增长,成为计算机行业的重要参与者。
随着业务的不断发展,HEICO Corporation开始在全球范围内布局其电子业务。公司建立了完善的供应链管理体系,与全球供应商建立了长期稳定的合作关系。这种全球化布局不仅有助于HEICO获取更优质的原材料和零部件,还降低了生产成本和风险。同时,HEICO还注重本地化生产和服务,以满足不同地区客户的需求。通过优化供应链管理和提升本地化服务能力,HEICO在电子行业中保持了强劲的增长势头。
AK-Nord_GmbH深知人才是企业发展的核心。因此,公司注重人才培养和团队建设。公司定期举办内部培训和交流活动,提升员工的专业技能和团队协作能力。同时,公司还积极引进外部优秀人才,为公司的创新发展注入新的活力。这些举措使得AK-Nord_GmbH的团队逐渐壮大,为公司的发展提供了有力的人才保障。
Beta Dyne Inc最初是一家专注于研发新型半导体材料的小型创业公司。在创始人的带领下,公司成功研发出一种具有高效能、低功耗特性的新材料,这一技术突破迅速引起了业界的关注。随后,Beta Dyne积极与各大电子设备制造商合作,将其新材料应用于智能手机、平板电脑等消费电子产品中,成功开拓了新的市场。
好久没来了,感觉很对不起似的,心里有中失落感,坛子好酒,可我们是如何认真对待的呢。。。 我有所改变,应该,以后坚决为论坛多做事,欢迎大家提问… 查看全部问答∨ |
|
我想做一个电路,即软件配置成是232通信还是485通信。当然单片机端的输入/输出端口公用,通信接口端也管脚公用。 我想可以通过模拟开关实现,而且一定有人用过,有成熟的电路,所以特请教。 谢谢!… 查看全部问答∨ |
|
问题见红色注释 驱动中的函数:(驱动肯定没问题的,是教程上自带的) static ssize_t s3c2440_18b20_read(struct file *filp, char *buf, size_t len, loff_t *off) { DS18B20PRO(); *buf=sdata;  ...… 查看全部问答∨ |
#include<reg51.h> unsigned char code tab[]={0xco,0x9f,0xa4,0xb0,0x99,0x82,0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; sbit S1=P2^0; //这一段是什么意思?? void Delay() { unsigned int i,j;   ...… 查看全部问答∨ |
说说以下程序的意思 void IsrIRQ( ) { int count = 0; unsigned int isr_pending; unsigned int isr_mask = 0x00000001; ...… 查看全部问答∨ |