找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 21880|回复: 22
打印 上一主题 下一主题
收起左侧

STM32固件库Keil5工程建立设置与Proteus仿真调试教程

  [复制链接]
跳转到指定楼层
楼主
STM32编程实例资料包内容:


KEIL新建stm32工程(即使不新建工程,也请读一下)

Keil5环境下的STM32v3.5库工程建立

软件:Keil5 for ARM

固件库:STM32F10x_StdPeriph_Lib_V3.5.0

一.文件准备

一个工程一般单独用一个文件夹,本例用Moban0作为文件夹名。里面包含本工程所有用到的源代码,及工程工作中生成的文件。其中大部分源代码要从固件库等地方复制过来,只有少部分源代码需要编写。

在Moban0下建子文件夹:

CORE

FWlib

USER

这些文件夹不是固定的,依据个人喜好建立和取名。

把一些文件从别处拷贝到这些文件夹下:

CORE

core_cm3.h                  (2)

core_cm3.c                  (2)

startup_stm32f10x_ld.s        (3)

FWlib

inc                  (4)

src                  (4)

USER

system_stm32f10x.h          (5)

system_stm32f10x.c          (5)

stm32f10x.h                 (5)

main.c                  (6)

stm32f10x_conf.h         (6)

stm32f10x_it.c            (6)

stm32f10x_it.h            (6)

根据上面各文件后面的数字拷贝文件

(2)这两个文件来自:

STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport这个就是 CMSIS 核心文件,提供进入 M3 内核接口,这是 ARM 公司提供,对所有 CM3 内核的芯片都一样。你永远都不需要修改这个文件。

(3)来自:STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\

STM32F10x\startup\arm ,这是一个汇编启动程序,启动程序需要按下面规则选择:

startup_stm32f10x_cl.s =>互联型的STM32F105xx、F107xx
startup_stm32f10x_hd.s =>大容量的STM32F101xx,F102xx,F103xx
startup_stm32f10x_hd_vl.s =>大容量的STM32F100xx
startup_stm32f10x_ld.s =>小容量的STM32F101xx,F102xx,F103xx
startup_stm32f10x_ld_vl.s =>小容量的STM32F100xx
startup_stm32f10x_md.s =>中容量的STM32F101xx,F102xx,F103xx
startup_stm32f10x_md_vl.s =>中容量的STM32F100xx
startup_stm32f10x_xl.s =>超大容量的STM32F101xx,F102xx,F103xx

由于proteus8.6里只有小容量的STM32,所以用ld型启动程序。

Flash<=32K为小容量,64K<=Flash<=128K为中容量,Flash>=256为大容量。

(4)是两个文件夹,来自:STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\ ,是外设固件库的所有C语言源代码。调用到固件库函数的就会参与编译,生成执行代码。

(5)来自:

STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x其中 system_stm32f10x.c 和对应的头文件system_stm32f10x.h 文件的功能是设置系统以及总线时钟,这个里面有一个非常重要的 SystemInit()函数,在启动时被自动调用。stm32f10x.h 这个文件很重要,只要你做 STM32 开发,你经常都要查看这个文件中相关的定义,这个文件里面主要是系统寄存器及其结构体、宏的定义申明以及包装内存操作。

(6)来自:

STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template\

其中stm32f10x_it.h 和stm32f10x_it.c这两个文件里面是一些系统中断服务程序函数,每个函数里面内容一般为空(直接中断返回)或死循环,用到时自己加内容。外设中断服务程序函数自己建立,中断服务函数名要和前文汇编启动程序startup_stm32f10x_xx.s中建立的中断向量表(即中断服务程序入口地址表)对应,除非你改中断向量表中的名称。默认名称都是Xxxx_IRQHandler()的形式。其实中断服务程序不一定放在stm32f10x_it.h文件里。 stm32f10x_conf.h中包含了所有外设的头文件。main.c是一个空的主程序,你要填写自己的内容,或者用自己的main.c把它替换掉。

  • 建立工程

到此为止,建工程前的准备工作已经做好,接下来就是打开Keil进行建立工程了,点击 MDK 的菜单:Project –>New Uvision Project ,然后将目录定位到刚才建立的文件夹Moban0 之下(有些人喜欢新建“Project”目录放在下面,这也是可以的,这个就看个人喜好了)子文件夹USER,我们的工程文件就都保存到 USER 里面,工程命名为My32,点击保存。

接下来会出现一个选择 CPU 的界面,就是选择我们的芯片型号。如下图所示,因为我们在proteus使用的STM32型号为STM32F103R6,所以在这里我们选择STMicroelectronics ->STM32F1 Series ->STM32F103 ->STM32F103R6,注意一定要安装过Keil.STM32F1xx_DFP.1.0.5.pack 这个安装包才会有这些型号选项,否则请关闭 MDK,然后安装此包。

点击 OK,MDK 会弹出 下图Manage Run-Time Environment 对话框:

这是 MDK5 新增的一种新建工程功能,利用这个功能,前文“文件准备”就不用做了,在这里可以直接添加自己需要的组件,构建工程开发环境,不过这里我们不用这种方法,直接点击 Cancel,窗口消失。软件界面左侧工程栏出现新建工程的雏形(下图)。

接下来点上图箭头所指图标,出现下图窗口,此窗口用于建立和修改工程的树状结构,层次依次是:Project --> tergets --> groups -->files,双击Source Group 1改名为CORE,再添加两个组USER、FWlib,在每个组下面按照下下图结构添加文件(都是前文“文件准备”复制过来的),.h文件可以不放进来。FWlib组中加入外设固件库文件,本例只用到GPIO和RCC两种外设,所以只加入了两个固件库文件,以后用到其它外设还可以再添文件。

点OK后窗口消失,界面左侧出现上图工程结构图。新建工程框架完成。

  • 设置工程

点魔法棒图标,或菜单Project -> Options for Terget,进入选项窗口。

1.预define 符号设置

将下面内容复制到下图Define框中。

STM32F10X_LD,USE_STDPERIPH_DRIVER

其中LD表示低密度器件,如果前面选的是高密度器件,则要把LD改为HD,中密度则改MD。逗号不能是中文符。

  • include路径设置。

点上图红圈建立3个include 路径。具体路径当然和你一开始建立的文件夹有关,凡是你放了头文件的文件夹都要加进来。

  • 设置优化等级。

  如果使用proteus仿真,上图紫圈里的优化等级必须等于Level 2,或大于Level 2。

  • C版本设置。

  上图勾选C99 Mode(棕色圈),这个设置不是必须的,如果没有勾选,有些按C99版本编写的代码会被判错,典型的情况:C99版允许在函数里任一地方定义变量(当然要在使用之前),而不必在函数开头。


  • 晶振频率设置(只做proteus仿真可不设)

  • 输出路径和文件设置。

输出文件的默认路径是项目文件所处文件夹(本例是USER)下面自动建的Objects文件夹,也可以点下图蓝圈修改,比如新建一个和USER平级的文件夹OBJ。

下图红圈里可设定输出文件名称,本例加上.elf扩展名,这是因为proteus里只接受.elf文件或.HEX文件,如果输出.HEX格式文件,把下图黑圈中的勾打上。elf文件含有调试信息,可以在proteus中源码级调试,但HEX文件不能调试,只能执行。

用elf文件,在proteus中可实现在C语言源码上设置断点、单步执行、执行到指定行等,暂停时可以在变量窗口(Variable Window)查看变量的值,运行时在watch窗口监视变量值的变化(需从变量窗口把要监视的变量拖入监视窗口),还可以在监视窗口监视片内外设的寄存器值:点右键->add item(by name)->选片内外设的寄存器,双击加入窗口。

  • 调试(Debug)选项设置(只用proteus仿真的不需此步)

只做proteus仿真不必做此设置,需要做Keil软件内仿真调试,或硬件调试的要设置,下图黑圈中内容要设置,且要和你用的具体STM32型号一致。

如果做Keil软件内仿真调试,要选择红圈Use Simulator。

如果连接硬件调试,要选择右边蓝色圈。

Keil软件内仿真调试在有些场合非常好用,它和proteus仿真的主要区别在于,Keil内仿真没有处理器以外的电路,很多仿真无法进行。

  • 硬件下载仿真器设置(只用proteus仿真的不需此步)

选上图右边蓝色圈,选择硬件仿真器型号,并点Settings设置,具体略。



  • 编程调试

可暂将下列代码复制到main.c中,点Build或rebuild图标就可以编译链接了。

  1. <font style="font-size: 12pt">#include "stm32f10x.h"

  2. u32  j=0,k=9;
  3. u16  m,i2;
  4. void Delay(u32 count)
  5. {
  6.               u32 i1;
  7.               for(i1=0;i1<count;i1++) i2+=i1;
  8. }
  9. int main(void)
  10. {
  11.               GPIO_InitTypeDef GPIO_InitStructure;            
  12.             
  13.               RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE);
  14.             
  15.               GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED0-->PA.8 端口配置
  16.               GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
  17.               GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO 口速度为 50MHz
  18.               GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化 GPIOA.8
  19.             
  20.               GPIO_SetBits(GPIOA,GPIO_Pin_8); //PA.8 输出高
  21.             
  22.               GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //LED1-->PD.2 端口配置, 推挽输出
  23.               GPIO_Init(GPIOD, &GPIO_InitStructure); //推挽输出 ,IO 口速度为 50MHz
  24.             
  25.               GPIO_SetBits(GPIOD,GPIO_Pin_2); //PD.2 输出高            
  26.             
  27.               while(1)
  28.               {
  29.                             j++; k--; // j,k,m 没什么用, 只为在proteus中看它们的值, 这几句可删除
  30.                             m+=k;
  31.                             if((j&0x0F)==0){
  32.                                           k=j;                             m=k+j;
  33.                             }               
  34.                                                       
  35.                             GPIO_ResetBits(GPIOA,GPIO_Pin_8);
  36.                             GPIO_SetBits(GPIOD,GPIO_Pin_2);
  37.                             Delay(300000);
  38.                            
  39.                             GPIO_SetBits(GPIOA,GPIO_Pin_8) ;
  40.                             GPIO_ResetBits(GPIOD,GPIO_Pin_2);
  41.                             Delay(300000);
  42.               }
  43. }</font>
复制代码


然后可打开proteus软件,点图标新建一个proteus工程,保存在USER文件夹下。画上电路,关联文件选My32.elf,时钟值一定要填,可以填常用的72M,想时间快的话可以填8M,设置好隐藏电源引脚,就能仿真了。


STM32编程类作业。
这些作业只需根据示例略作修改就能完成。主要参考资料是PPT课件。
1.    实现8个LED的流水灯,3个连续亮灯接2个连续灭灯循环移动。
2.    上题的延时用定时器定时中断实现。
3.    用定时器1的通道2产生PWM波,周期40μS,占空比20%、50%、80%三挡可调。
4.    用定时器2的通道3的捕获功能测一个信号的周期,进而算出频率。



全部资料51hei下载地址:

编程作业及示例.rar (3.16 MB, 下载次数: 626)



评分

参与人数 1黑币 +30 收起 理由
cc灿 + 30 赞一个!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏26 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:276118 发表于 2018-12-18 13:07 | 只看该作者
很好的指导作用
回复

使用道具 举报

板凳
ID:116773 发表于 2018-12-18 21:34 | 只看该作者
不错!就是最后的作业跨度太大,不是初学者立马能独立完成的。
回复

使用道具 举报

地板
ID:331281 发表于 2019-4-11 14:27 | 只看该作者
非常感谢,菜鸟学习了
回复

使用道具 举报

5#
ID:492068 发表于 2019-4-16 09:00 | 只看该作者
真的太感谢了!
回复

使用道具 举报

6#
ID:488831 发表于 2019-7-24 17:34 | 只看该作者
这个太麻烦了吧。直接双击Proteus的芯片就可以选择hex文件烧录进去就可以仿真了,跟使用st—link差不多,就是不能在线编程。
回复

使用道具 举报

7#
ID:690605 发表于 2020-2-22 15:58 | 只看该作者
用proteus7可以仿真stm32吗?
回复

使用道具 举报

8#
ID:100312 发表于 2020-2-22 19:22 | 只看该作者
怎么学会stm32 发表于 2020-2-22 15:58
用proteus7可以仿真stm32吗?

不能,只有proteus8支持stm32的
回复

使用道具 举报

9#
ID:690605 发表于 2020-2-23 20:21 | 只看该作者
s414545584 发表于 2020-2-22 19:22
不能,只有proteus8支持stm32的

好的,谢谢,下了一个8.6的
回复

使用道具 举报

10#
ID:720726 发表于 2020-4-5 18:32 | 只看该作者
sakuralap 发表于 2019-7-24 17:34
这个太麻烦了吧。直接双击Proteus的芯片就可以选择hex文件烧录进去就可以仿真了,跟使用st—link差不多,就 ...

请问下,我就是这样弄得,但是仿真出现了错误AVR: Program property is not defined.和Real Time Simulation failed to start.
是怎么回事
回复

使用道具 举报

11#
ID:759427 发表于 2020-5-24 07:29 | 只看该作者
感谢分享,学习了。
回复

使用道具 举报

12#
ID:764602 发表于 2020-6-2 23:07 | 只看该作者
我的就是使用proteus仿真,上图紫圈里的优化等级没有等于Level 2,或大于Level 2。仿真怎么都不行!看到楼主的帖子,改成level2,果然就成功了!太感谢这篇贴了!
回复

使用道具 举报

13#
ID:540270 发表于 2020-6-3 19:29 | 只看该作者
感谢楼主分享
回复

使用道具 举报

14#
ID:116487 发表于 2020-6-4 09:57 | 只看该作者
好好学习
回复

使用道具 举报

15#
ID:116487 发表于 2020-6-4 09:59 | 只看该作者
学习一下,一直不对
回复

使用道具 举报

16#
ID:789710 发表于 2020-6-27 14:19 | 只看该作者
挺好的。学习了。下载下来看看
回复

使用道具 举报

17#
ID:830028 发表于 2020-10-14 23:04 来自手机 | 只看该作者
keil和preteus中的晶振频率要一致吗
回复

使用道具 举报

18#
ID:473104 发表于 2020-10-30 08:46 | 只看该作者
这个不错,无硬件调试不错
回复

使用道具 举报

19#
ID:186696 发表于 2021-5-2 01:45 | 只看该作者
这个是有温度的学习笔记,感谢楼主
回复

使用道具 举报

20#
ID:604096 发表于 2023-1-3 22:06 | 只看该作者
这个帖子的作用太大了,感谢楼主分享
回复

使用道具 举报

21#
ID:604096 发表于 2023-1-3 22:07 | 只看该作者
太好了,纠结好几天了,终于找到这么使用的例程
回复

使用道具 举报

22#
ID:829222 发表于 2023-6-1 11:45 | 只看该作者
有空测试一下,看看效果,之前一直都不行,使用hex都不行,不知道为什么,一直都是直接硬件调试
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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