STM32初探.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
STM32初探

这两天在网上看STM32相关资料,了解到只由启动文件而不需其他库文件即可实现战舰开发板LED灯亮。于是动手在板子上试了试,果然成功了。。。 1、新建工程 在一个大文件夹下建立一下几个文件夹,如图所示(建文件夹的方式是个人喜好以及大众喜欢的方式) 在STARTUP文件夹下添加startup_stm32f10x_hd.s(一般的人都知道这个是什么,在什么地方能够找到),在USER文件夹里新建一个main.c文件,然后打开KEIL4软件新建工程,选取STM32F103ZE芯片,手动添加启动文件和main.c文件。工程文件保存在Project文件夹下。输出文件保存在OUTPUT文件夹,listing文件保存在Listing文件夹下。到此,工程建立完毕。 启动文件的功能: ①设置初始SP ②设置初始 PC Reset_Handler 设置向量表入口地址,并初始化向量表 调用库函数 SystemInit,把系统时钟配置成 72M,SystemInit 在库文件 system_stm32f10.c 定义跳转到标号_mian,最终来到C 的世界。 第行是定义了一个子程序:Reset_Handler。PROC 是子程序定义伪指令。其中 NEAR 和 FAR 是属性词。NEAR 属性 段内近调用 : 调用程序和子程序在同一代码段中,只能被相同代码段的其他程序调用。FAR 属性 段间远调用 : 调用程序和子程序不在同一代码段中,可以被相同或不同代码段的程序调用。 第行 EXPORT 表示 Reset_Handler 这个子程序可供其他模块调用。 关键字[WEAK] 表示弱定义,如果编译器发现在别处定义了同名的函数,则在链接时用别处的地址进行链接,如果其它地方没有定义,编译器也不报错,以此处地址进行链接。 第行和第行 IMPORT 说明SystemInit和__main这两个标号在其他文件,在链接的时候需要到其他文件去寻找。 SystemInit在库文件system_stm32f10x.c实现,用来初始化STM32的一系列时钟,把系统时钟设置为 72MHZ。__main 其实不是我们定义的,当编译器编译时,只要遇到这个标号就会定义这个函数,该函数的主要功能是:负责初始化栈、堆,配置系统环境,并在最后跳转到用户自定义的 main 函数,从此来到 C 的世界。 第行把 SystemInit 的地址加载到寄存器 R0。 第行程序跳转到 R0 中的地址执行程序,之后系统的时钟就被设置成 72MHZ。 第行把_main 的地址加载到寄存器 R0。 第行程序跳转到 R0 中的地址执行程序,执行完毕之后就去到我们熟知的 C 世界。 第行表示子程序的结束。 总结下就是,Reset_Handler 这个函数执行了两个函数调用,一个是 SystemInit,把系 统时钟设置成 72M,一个是__main,初始化好系统环境,最终调用 C 的 main,从此去到C 的世界。 等下我们点亮 LED 的时候采用最简单的方法,直接使用内部的 LSI 时钟(8MHZ)作 为主时钟即可,不使用外部时钟 LSE。 __main 函数由编译器生成,负责初始化栈、堆等,并在最后跳转到用户自定义的main 函数,来到 C 的世界。 现在我们就可以开始编写程序了,我们先编写一个 main 函数,里面啥都没有,暂时为 空。 错误提示说 SystemInit 没有定义。从分析启动文件时我们知道,Reset_Handler 调用了 该函数用来初始化系统时钟,而该函数是在库文件 system_stm32f10x.c 中实现的。 system_stm32f10x.c 。为了简单起见,我们在 main 文件里面定义一个 SystemInit 空函数,为的是骗过编译器,把这个错误去掉。 STM32 的 IO 口比较复杂,如果要输出 1 和 0,则要通过控制:端口输出数据寄存 器 ODR 来实现,ODR 是:Output data register 的简写,在 STM32 里面,其寄存器的命名名称都是英文的简写,很容易记住。从手册上我们知道 ODR 是一个 32 位的寄存器,低 16位有效,高 16 位保留。低 16 位对应着 IO0~IO1,只要往相应的位置写入 0 或者 1 就可以输出低或者高电平。 从手册中我们看到 ODR 寄存器的地址偏移是:0CH,这个偏移地址是基于端口的起始地址而言的。在 STM32 中,每个外设都有一个起始地址,叫做外设基地址,外设的寄存器就以这个基地址为标准按照顺序排列,跟结构体里面的成员差不多。 其中 GPIOB 的起始地址是:0X4001 0C00,这样就可以算出 GPIOB_ODR 寄存器的地址是:0X4001 0C00 + 0X0C 0X4001 0C0C。现在我

文档评论(0)

yanpan1 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档