keil构建STM32工程并使用proteus仿真led点灯实验

    STM32单片机与51单片机有很大区别,不仅结构上有很大差异,STM32更复杂一些,在操作上来说,STM32也要复杂很多,51单片机上手写代码,可以很直接操作引脚,但是STM32单片机在操作引脚之前需要作很多初始化工作,比如开启时钟使能,GPIO管脚初始化。

    下面就入门STM32单片机开发做一个简单的介绍,本文是仿真,不需要真实的STM32单片机,只需要电脑安装开发相关的软件即可,主要是keil-mdk,proteus。

    keil这里安装的是支持STM32单片机的版本,这个需要安装mdk那个版本。这里提供一个支持mdk的keil下载链接,提取码:1234。它的安装和破解和keil-51类似,破解也是使用keygen.exe来生成注册码,安装之后,还需要安装支持STM32单片机的包:Keil.STM32F1xx_DFP.1.0.5.pack,将上面链接下载的包离线安装即可,如下所示:

    选择keil工具栏上的Pack Install按钮,在弹出框中选择File->Import,弹出选择文件对话框,选中下载的pack包,即可离线安装。

    我们要构造STM32工程,还需要一个标准库,同样的,在刚才的下载链接里面自带了:STM32F10x_StdPeriph_Lib_V3.5.0.rar,解压之后,结构如下所示:

 

    我们这里使用标准库来构建STM32工程,这里面有我们工程需要的头文件和源文件,以及启动文件。我们新建STM工程之前,先准备一个这样的工程文件结构:

    这里Core,也可以起名CMSIS,根据个人习惯,字面意思就是核心文件,这里我们要将标准库中core_cm3.h , core_cm3.c文件拷贝进来。路径是STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport

   Fwlib是固件库firmware library的意思,这里我们把标准库中STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\src的inc和src文件夹都拷贝过来。

    Project 是用来存放keil工程的,后面在keil中新建工程,我们把保存位置指定到这里。

    User,这里是用户文件,拷贝STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x下的stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h文件 和

STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template 下的stm32f10x_conf.h,stm32f10x_it.c,stm32f10x_it.h,system_stm32f10x.h(重复)。

 

    Startup启动文件存放的文件夹,这里我们把STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm下的s结尾的文件都拷贝过来(实际只用到一个)。

   这样,我们除了Project文件夹中没有文件之外,其他四个目录都有了文件。

   keil新建工程

   打开keil-mdk,新建工程,位置选择刚才准备的Project文件夹。

     

    在接下来的向导,为构建目标选择设备,我们选择STM32F103C8,其他也可以,根据仿真需要选择。

 

这个新工程是没有任何内容的,我们要重新设置。点击工具栏的"管理工程项目"按钮(三色块):

Project Targets 修改为工程名称,

Groups这里添加四个Group,分别是Core,Fwlib,Startup,User,他们里面的文件,我们通过选择之前放到文件夹Core,Fwlib,Startup,User里面的文件,结构如下所示:

我们还需要手动在User目录中添加main.c文件,然后通过在User这个Group上右键选择:添加已有文件到组中。

最终的工程文件结构:

    我们可以在main.c中增加部分代码,让他可以作为一个空工程编译。

#include "stm32f10x.h"

int main()
{

}

这个时候直接编译项目会报错,我们需要作设置,设置头文件查找范围,具体操作是点击工具栏魔法棒(Options for Targets),弹出框中选择c/c++,Define处输入USE_STDPERIPH_DRIVER,下方的Include Paths选择我们的文件夹Core,Fwlib/inc,User三个目录,手动选择:

    最后可以编译成功:

 

  因为仿真最后需要的是hex文件,所以还需要一个设置,点击Options for Targets,切换到output,然后勾选Create HEX File:

    STM32单片机点灯的代码有一些复杂,主要需要开启时钟,并设置管脚电平。

#include "stm32f10x.h"

void Delay()
{
	unsigned int i, j;
    for(i = 0; i < 2000; i++)
	  for(j = 0; j < 110; j++);
}

void LED_Config()
{
      GPIO_InitTypeDef GPIO_InitStructure;                  // GPIO初始化结构体
	
	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //APB2时钟使能,这里单片机开启的是B口,所以对应RCC_APB2Periph_GPIOB,如果开启A口,这里对应RCC_APB2Periph_GPIOA
	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      // 推挽模式
	  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;             // 管脚B5作为输出
	  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //时钟频率
      GPIO_Init(GPIOB, &GPIO_InitStructure);                // GPIO初始化,开启GPIOB,如果要开启A或者C,改变这里的GPIOA或者GPIOC
}

int main()
{
    LED_Config();
	  while(1)
	  {
			GPIO_SetBits(GPIOB, GPIO_Pin_5);
			Delay();
			GPIO_ResetBits(GPIOB, GPIO_Pin_5);
			Delay();
	 }
}

    编译不报错,就可以开始进行仿真了,在proteus中,我们搭建如下所示的led设计图:

 

   选择芯片STM32F103C8,然后找到发光二极管LED-GREEN,再加上电阻,接地。简单的连线,STM32单片机好像和51单片机有些不一样,这里还需要对连线作处理,在菜单栏Design选择Power Rail Configuration,把GND和VCC/VDD左侧列出的部分都通过中间的Add(右移)箭头添加到右边:

    还有一个地方很重要,需要设置,就是单片机的晶振频率,如果不设置,将会报错:

Access to register of unclocked peripheral at 0x40010C00 cause BUS_FAULT [U1_CM3CORE]
 

    这个问题只有在仿真的时候可能会报错,有的地方说需要在代码里面设置开启时钟使能,但是我们的代码里面明显设置了,就是 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);   这句代码。这个问题很折腾人,我开始以为是代码没有执行到main.c文件中的内容,其实不是的,而是晶振频率问题,但是同样不设置频率,我使用STM32CubeMX生成的代码执行就没有问题,这也很奇怪。

    

    这里的50MHz就是代码中设置的时钟频率GPIO_Speed_50MHz。 

    最后仿真不报错的情况: 

     这里是使用标准库建立STM32工程,所以加入了一些标准库的头文件和源文件,这里根据项目特点新建了Core,Fwlib,Project,Startup,User文件夹,并加入了相关文件,最后在keil工程的目标中建立的组Core,Fwlib,Startup,User并不是一个意思,只是名字相同而已,最后还需要手动添加文件到这些组中。

    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/77320.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构——栈(C语言)

需求&#xff1a;无 栈的概念&#xff1a; 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端为栈底。栈中的数据元素遵守后进先出&#xff08;LIFO&#xff09;原则。压栈&…

分类预测 | MATLAB实现MTBO-CNN多输入分类预测

分类预测 | MATLAB实现MTBO-CNN多输入分类预测 目录 分类预测 | MATLAB实现MTBO-CNN多输入分类预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现MTBO-CNN多输入分类预测 2.代码说明&#xff1a;基于登山队优化算法&#xff08;MTBO&#xff09;、卷积神经…

ABAP: SQL 多值查询

基础查数据 问题举例&#xff1a;例如查物料类型为ZFRT、ZROH和ZRSA的物料编码。 1、直接查询&#xff0c;三种不同类型的物料类型是或的关系。 SELECT DISTINCT ma~matnr ma~mtartFROM mara AS maINNER JOIN mbewh AS mbON ma~matnr mb~matnrINTO CORRESPONDING FIELDS OF…

EmbedPress Pro 在WordPress网站中嵌入任何内容

EmbedPress Pro可让您通过高级自定义、自定义品牌、延迟加载和更多惊人功能嵌入源。为古腾堡块和Elementor编辑器提供支持的一体化 WordPress 嵌入解决方案。使用 EmbedPress 在古腾堡创建交互式内容。使用 EmbedPress 的古腾堡块立即将任何内容嵌入到您的网站。 网址: EmbedP…

最强自动化测试框架Playwright(29)-文件选择对象

FileChooser对象通过page.on("filechoose")事件监听。 如下代码实现点击百度搜图按钮&#xff0c;上传文件进行搜索。 from playwright.sync_api import Playwright, sync_playwright, expectdef run(playwright: Playwright) -> None:browser playwright.chro…

linux 学习————LNMP之分布式部署

目录 一、概述 二、LNMP环境部署 三、配置nginx 四、 配置php使nginx能够解析.php 五、配置mysql 六、配置discuz进行登录论坛访问测试 一、概述 LNMP代表 Linux、Nginx、MySQL、PHP&#xff0c;是一种常用的服务器架构。它由以下组件组成&#xff1a; Linux&#xff1a;作…

docker的数据管理

目录 一.如何管理docker容器中的数据 二.数据卷 2.1数据卷原理 2.2数据卷作用 2.3数据卷案例 三.数据卷容器 3.1数据卷容器的作用 3.2端口映射 一.如何管理docker容器中的数据 管理Docker 容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器( DataVolumes Contain…

查看 Linux 内核版本的几种方法

uname -a uname -srm uname -r 分拆&#xff1a;Linux 5.13.0-19-generic x86 64 5-内核版本 13-主修订版本 0-19 -次要修订版本 过查看 /proc/version 文件确认 /proc 目录包含虚拟文件&#xff0c;其中包含有关系统内存&#xff0c;CPU内核&#xff0c;已安装文件系统等的信…

详解零售行业供应链管理核心KPI指标(四)

现在零售行业的供应链管理越来越复杂了&#xff0c;复杂的原因是因为市场的变化、商业模式、销售模式的变化。 比如在以往传统的线上电商平台、线下渠道&#xff0c;现在线上电商还增加直播带货&#xff0c;线下渠道又增加了O2O模式。从一线城市的供应链还是做到供应链下沉到二…

开源数据库Mysql_DBA运维实战 (修改root密码)

MySQL——修改root密码的4种方法 本文以windows为例为大家详细介绍下MySQL修改root密码的4种方法&#xff0c;大家可以可以根据的自己的情况自由选择&#xff0c;希望对大家有所帮助 方法1&#xff1a; 用SET PASSWORD命令 首先登录MySQL。 格式&#xff1a;mysql> set pass…

Linux命令200例:ps用于查看当前系统中运行的进程信息(常用)

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…

Linux安装Nginx

Linux安装Nginx 下载Nginx上传文件至服务器编译启动 下载Nginx 官网下载地址&#xff1a;https://nginx.org/en/download.html 或者关注wx公众号&#xff1a;一颗星宇宙&#xff0c;发送&#xff1a;Linux服务部署获取下载地址 上传文件至服务器 使用rz命令进行选择文件上传…

拉丁方设计资料的方差分析(SPSS版+SAS版)

拉丁方设计&#xff08;Latin square design&#xff09;&#xff1a;实验研究中涉及一个处理因素和两个控制因素&#xff0c;每个因素的类别数或水平数相等&#xff0c;此时可采用拉丁方设计&#xff0c;将两个控制因素分别安排在拉丁方设计的行和列上。该设计类型仍为单因素方…

爬虫逆向实战(十五)--阿某某营登录

一、数据接口分析 主页地址&#xff1a;阿某某营 1、抓包 通过抓包可以发现登录接口是Users/Login 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以发现有一个s加密参数 请求头是否加密&#xff1f; 无响应是否加密&#xff1f; 无cookie是…

工程项目管理系统源码+功能清单+项目模块+spring cloud +spring boot em

​ 工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…

APP内嵌小游戏,全面提升用户活跃、留存

开发者想要提高APP的用户活跃度可以通过拉新的方式完成&#xff0c;但目前拉新的成本较高&#xff0c;而且新的目标用户一般很难留住&#xff0c;流失率也比较高。 此时&#xff0c;可以通过植入小游戏的方式来提高用户活跃度&#xff0c;游戏的优势在于可以快速吸引用户&…

Stephen Wolfram:那么…ChatGPT 在做什么,为什么它有效呢?

So … What Is ChatGPT Doing, and Why Does It Work? 那么…ChatGPT在做什么&#xff0c;为什么它有效呢&#xff1f; The basic concept of ChatGPT is at some level rather simple. Start from a huge sample of human-created text from the web, books, etc. Then train…

时序预测 | MATLAB实现EEMD-GRU、GRU集合经验模态分解结合门控循环单元时间序列预测对比

时序预测 | MATLAB实现EEMD-GRU、GRU集合经验模态分解结合门控循环单元时间序列预测对比 目录 时序预测 | MATLAB实现EEMD-GRU、GRU集合经验模态分解结合门控循环单元时间序列预测对比效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 1.MATLAB实现EEMD-GRU、GRU时…

Linux系统的历史记录添加时间和IP信息

1 系统history记录优化 默认情况下&#xff0c;系统是不会记录我们执行命令的时间等相关信息的。 1.1 HISTCONTROL 介绍 使用HISTCONTROL变量&#xff0c;您可以控制 bash 如何存储您的命令历史记录。您可以告诉它忽略重复的命令和/或忽略具有前导空格的命令。 在命令行工作…

2023国考(地市级)判断推理

题目 黑白块 例题 例题 例题 例题