当前位置: 首页 > news >正文

【嵌入式开发工具】STM32+Keil实现软件工程搭建与开发调试

本篇文章介绍了使用Keil来对STM32F103C8芯片进行初始工程搭建,以及开发与工程调试的完整过程,帮助读者能够在实战中体会到Keil这个开发环境的使用方法,了解一个嵌入式工程从无到有的过程,并且具备快速搭建一个全新芯片对应最小软件工程的基本能力思路。文章首先介绍了基础工程搭建的过程,包括代码的组织以及Keil嵌软工程配置,然后讲述了一个简单功能的开发,最后介绍了Keil环境下提供的代码调试工具以及一些常用工具配置项。

目录

Keil概念

工程搭建

代码组织

Keil配置

开发与调试

下载调试准备

串口打印开发 

代码调试


Keil概念

Keil(全称Keil µVision IDE)是一款集成开发环境(IDE),主要用于嵌入式系统的开发。Arm Keil MDK(Microcontroller Development Kit)是面向基于Arm的微控制器的最全面的软件开发解决方案,包括创建、构建和调试嵌入式应用所需的所有组件。主要可以分为MDK(IDE以及芯片对应编译器等)、Softwarepacks(可以随时添加软件包,这使得新的设备支持和中间件更新独立于工具链)、Debug Probes(MDK 支持许多不同的调试和跟踪适配器)。

下面介绍一下后面工程搭建以及开发调试涉及的相关概念。

  • STM32F10x_StdPeriph_Lib_V3.6.0:芯片底层库文件,我们这里使用的是STM芯片F10系列,响应的库文件可以从ST官网找到,点击这里可直接跳转并下载。Libraries中主要包含CMSIS和STM32F10x_StdPeriph_Driver。Project中主要包含STM32F10x_StdPeriph_Template和STM32F10x_StdPeriph_Examples。,前者是,后者为不同芯片内部外设使用示例。
    • CMSIS:全称为Cortex Microcontroller Software Interface Standard,其中startup文件夹包含了对应芯片类型的启动代码core_cm3.c,包括复位处理程序和异常向量;CoreSupport文件夹中包含了STM32F10系列芯片使用的Cortex-M3内核外设接入层startup_stm32f10x_md.s(md表示芯片容量)
    • STM32F10x_StdPeriph_Driver:STM32F10系列标准的外设驱动库,提供诸如ADC,CAN,GPIO等芯片内外设驱动。
    • STM32F10x_StdPeriph_Template:工程必备的不同IDE文件以及相关代码源文件模板,其中stm32f10x_conf.h包含了外设库头文件以及参数检查宏定义,stm32f10x_it.c包含了所有的中断服务函数定义,system_stm32f10x.c包含了芯片时钟配置。
    • STM32F10x_StdPeriph_Examples:芯片内部外设不同的使用示例,可以根据实际项目使用参考终端服务函数以及main.c中的相关外设配置,例如您如果用到了3ADCs并使用DMA,则可以参考STM32F10x_StdPeriph_Examples\ADC\3ADCs_DMA下的代码进行配置。
  • JLink仿真器:德国SEGGER公司推出基于JTAG的仿真器。简单地说,是给一个JTAG协议转换盒,即一个小型USB到JTAG的转换盒,其连接到计算机用的是USB接口,而到目标板内部用的还是jtag协议。它完成了一个从软件到硬件转换的工作。我们使用它连接电脑与板卡实现程序烧录和在线调试。

工程搭建

代码组织

建立工程文件夹,在工程文件夹下建立以下目录结构,组织工程代码(可根据公司规定对工程目录结构进行统一修改)。

目录名称存放文件文件来源
Startupstartup_stm32f10x_md.s

STM32F10x_StdPeriph_Lib_V3.6.0\Libraries\CMSIS\CM3\

DeviceSupport\ST\STM32F10x\startup\arm

CMSIScore_cm3.c、core_cm3.h

STM32F10x_StdPeriph_Lib_V3.6.0\Libraries\CMSIS\CM3

\CoreSupport

Libraries芯片外设标准库文件

STM32F10x_StdPeriph_Lib_V3.6.0\Libraries\STM32F10x

_StdPeriph_Driver

App

1.用户编写的业务代码,可根据业务创建子目录。

2.main.c、stm32f10x_conf.h、stm32f10x_it.c、system_stm32f10x.c

1.用户编写/移植。

2.STM32F10x_StdPeriph_Lib_V3.6.0\Project\STM32F10x_

StdPeriph_Template

Bulid用来存放编译生成文件Keil编译生成。

Keil配置

首先打开Keil5,新建工程,芯片型号选择STM32F103C8。随后弹出在线添加库文件,关闭即可。如下图所示。

然后点击三色块用来添加工程目录,并添加相关目录,增加待编译源文件。如下图所示。

 最后,单击魔术棒进行配置,这部分的配置比较多,下面分步逐一进行介绍。

  1. 配置目标属性,晶振等信息,因为我现在用的单片机晶振为8M的,所以改为8M;下面调试需要用到printf函数,需要勾选MicroLIB库。

  2. 输出文件夹改到Bulid文件夹,勾选生成hex文件。

  3. 修改编译信息,包括添加条件编译宏定义和头文件路径等。

  4. 配置Flash类型。

最后,如果配置正确,相关的文件也都正确添加至工程内,编译之后就会在Build Output看到生成了可以下载执行的hex文件,如果没有需要我们根据错误信息来逐步解决。


开发与调试

下载调试准备

首先我们需要安装JLINK驱动(segger上或者百度),如果驱动安装成功,将设备usb接口插到电脑上后,绿灯转为常亮,电脑的设备管理在通用串行控制器中能够识别到仿真器。然后我们需要按照JTAG接口引脚定义正确将仿真器与板卡相连。

最后,我们需要在Keil中根据我们仿真器类型正确配置Debug信息如下,并选择相关仿真器窗口。

这是如果仿真器能够正常连接到板卡,绿灯会闪烁,点击Settings摁扭能看到识别到的芯片核心,如果不正常则会为空白。


串口打印开发 

我们开发一个串口打印的功能,因为只是一个demo,所以我们将串口初始化的部分也放到main.c里,下面是main.c的代码。

#include "stm32f10x.h" 
#include "usart.h"void uart_init(u32 bound){//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟//USART1_TX   GPIOA.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9//USART1_RX	  GPIOA.10初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  //Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//抢占优先级0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;		//子优先级1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器//USART 初始化设置USART_InitStructure.USART_BaudRate = bound;//串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式USART_Init(USART1, &USART_InitStructure); //初始化串口1USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断USART_Cmd(USART1, ENABLE);                    //使能串口1 }void USART1_IRQHandler(void)  
{u8 Data;if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET){Data = USART1->DR;}}///重定向c库函数printf到串口,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{/* 发送一个字节数据到串口 */USART_SendData(USART1, (uint8_t) ch);/* 等待发送完毕 */while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);		return (ch);}int main(void)
{	uart_init(9600);while(1){printf("STM32\n");}
}

然后点击编译,生成可执行文件之后点击下载到板卡。

最后正确连接板卡上的串口线到串口小板(TTL转USB),打开串口调试助手,就能看到板卡打印出来的串口信息。


代码调试 

点击红色那个上面有个红色字母d的小放大镜摁扭,就会下载程序并进入仿真模式,这个时候程序停在起始位置。

 按照上图的标号,我们介绍一下相关区域的作用。

  1. 重启执行摁扭:从左到右第一个为系统复位,程序回到起始位置并停止执行。第二个为全速执行摁扭,一般跟预先设置的断点配合使用。
  2. 单步调试摁扭:从左到右依次是进入执行(会进入调用函数),逐行执行(不进入调用函数),跳出执行(执行到跳出此函数),执行到光标处(执行到蓝色光标处)。代码走查常用。
  3. 寄存器窗口:这个串口可以看到ARM核心的一些特殊寄存器,不知道用法的可以移步到《【硬件】嵌入式电子设计基础之单片机》文章去了解一下。这个页签中还有很多别的功能可供发掘,诸如可以通过system中的系统变量sec来查看程序运行所用时间,将两个地方的所用时间相减,即可得到所间隔的时长。
  4. 汇编代码窗口:当前运行程序对应的汇编代码行,可以在更细的层面调试程序。
  5. C代码窗口:黄色光标指向当前运行到行,在左侧深灰处双击即可添加断点,可以看到红色小圆点​。
  6. 命令窗口:Keil提供命令窗口可以在调试过程中执行命令,诸如SAVE E:\Debug\DATA.txt 0x20004A18,0x20004A3A这段命令即可将0x20004A18~0x20004A3A这段内存区存储到文件中。
  7. 调用栈:调用栈信息显示了当前代码处的完整调用关系,有的时候当在中断服务函数中时,无法看到进入中断之前的调用栈信息,需要结合其他寄存器信息直接从栈空间中查找相关调用信息。

还有一些比较常用的调试窗口。memory窗口可以看指定区域的存储器数值,正如上面提到的存储指令,我们也可以通过memory窗口看到对应的内容。

还有就是Watch窗口,可以添加一些变量,在调试过程中观察变量的变化。

最后一个常用的就是系统外设窗口,在调试过程中可以看到具体对应外设的寄存器值。


Keil环境补充说明

keil默认无法显示中文,输入中文时,出现的是问号。可以将Edit-->Configuration中的编码改成GB2312解决这个问题,同时在这个页签中可以将Tab设置为4个空格。在Configuration还有更多诸如字体等环境配置,读者可以根据自己的喜好来进行调整。


十六宿舍 原创作品,转载必须标注原文链接。

©2023 Yang Li. All rights reserved.

欢迎关注 『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。

相关文章:

【嵌入式开发工具】STM32+Keil实现软件工程搭建与开发调试

本篇文章介绍了使用Keil来对STM32F103C8芯片进行初始工程搭建,以及开发与工程调试的完整过程,帮助读者能够在实战中体会到Keil这个开发环境的使用方法,了解一个嵌入式工程从无到有的过程,并且具备快速搭建一个全新芯片对应最小软件…...

python 去除图像中的框

最近在做图像标注,会出现以下的图片,需要去除其中的边框。 1.思路 人工标注画框的范围P,并使用标注工具在画框上画一个点A。获取点A的坐标和颜色。在范围P内,将与点A颜色相似的每一个点x的颜色,替换为点x上下&#…...

企业邀约媒体的方式方法?-(快速精准)

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 快速而精确地邀约媒体通常需要有计划和策略性的方法。以下是一些方法,可以帮助企业有效地邀请媒体: 1. 媒体列表构建:首先,建立一个精心筛…...

旅游业为什么要选择VR全景,VR全景在景区旅游上有哪些应用

引言: VR全景技术的引入为旅游业带来了一场变革。这项先进技术不仅提供了前所未有的互动体验,还为景区旅游文化注入了新的生机。 一.VR全景技术:革新旅游体验 1.什么是VR全景技术? VR全景技术是一种虚拟现实技术&am…...

搭建第一个区块链网络与一键部署WeBASE步骤

官网 搭建第一个区块链网络 — FISCO BCOS v2 v2.9.0 文档 (fisco-bcos-documentation.readthedocs.io) 一键部署 — WeBASE v1.5.5 文档 (webasedoc.readthedocs.io) 步骤 默认如MySQL、Python、java等依赖已经引入 1.创建操作目录, 下载安装脚本 创建操作目录 cd ~ &a…...

MTK联发科、高通、紫光展锐手机SOC平台型号汇总(含详细参数)

MediaTek联发科手机平台汇总: Qualcomm高通SOC平台汇总: 紫光展锐SOC平台汇总: 新移科技已成功研发手机SOC平台: 联发科平台: MTK6739、MTK6761、MTK6762、MTK6765、MTK8788、MTK6853、MTK6873、MTK6833、MTK6877、…...

【ARM AMBA AXI 入门 12 -- AXI协议中的 WLAST 与 RLAST】

文章目录 AXI协议中的 WLAST 与 RLAST AXI协议中的 WLAST 与 RLAST AMBA AXI协议是由ARM公司定义的一种高性能,高频率的总线协议。总线协议中的 WLAST 信号是一个重要的信号,它在 AXI 协议中用来标识一个突发(Burst)传输的最后一…...

11.6 知识总结(筛选器方法、操作标签、事件)

一、 筛选器方法 document.getElementById()------>标签对象------------>直接就是标签 $(document.getElementById()) -------> jQuery对象-------->可以使用jQuery提供的方法 jQuery(document.getElementById()) -------> jQuery对象-------->可以使用jQue…...

Devchat插件:AI智能编程助手,让你告别脏活累活。

文章目录 前言注册登录DevChat的安装和配置DevChat插件安装DevChat插件配置 DevChat的简单使用后记 前言 随着人工智能技术的不断发展和普及,它正在深刻影响着各行各业,并逐渐成为改变世界的重要力量。在软件开发领域,人工智能技术也给开发者…...

0-1矩阵列互斥问题——回溯法 Python实现

三、 0-1 矩阵的列集互斥问题。给定一个 m n m \times n mn 的 0-1 矩阵 A \mathrm{A} A 。定义列互斥为: 对于矩阵 A A A 中的任意两列 i i i 和 j j j, 如果在对应的每一行上, i i i 和 j j j 不存在同时为 1 的情况, 则称列 i \mathrm{i} i 和 j \mathrm{j} j 互斥…...

wandb 安装本地部署使用教程

1、官网注册 wandb.ai是一个为机器学习开发者提供的开发工具平台,可以帮助用户跟踪实验,管理和版本数据,以及与团队协作,从而更专注于构建最佳模型。 wandb官网: https://wandb.ai 首先我们打开官网注册号自己的账号并…...

飞桨平台搭建PP-YOLOE模型

一、创建项目 此博客仅是运行PP-YOLOE源码,这里以变压器渗漏数据集为例COCO数据集太大了,跑不动,V100训练预估计得7天左右,即便是A100也得4天半,变压器渗漏油数据集跑一个小时左右,还可以接受,…...

Js重点内容

一,什么是js javascript是运行在客户端(浏览器,可预览)的编程语言 二,主要的功能 用来给静态页(html网页)增加一些动态功能(比如轮播图、tab切换) 三,应用…...

图形化ping工具gping

一、介绍 gping能够以折线图的方式,实时展示 ping 的结果,支持 Windows、Linux 和 macOS 操作系统。并且支持多个目标同时Ping同时展示折线图方便对比。下面扩展一下ICMP及ICMP隧道。 ICMP消息结构: ICMP消息是由一个类型字段、一个代码字段、…...

快速安装虚拟机centos7.5

vbox 快速导入安装centos7.5 环境准备 vbox安装(下载地址) ova镜像(下载地址)(默认是192.168.56.10 加nat网卡) 链接:https://pan.baidu.com/s/164Iprh_80HCQmKCU6V-RTw 提取码:if…...

2023.11.4 Idea 配置国内 Maven 源

目录 配置国内 Maven 源 重新下载 jar 包 配置国内 Maven 源 <mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf> …...

DAY11 字符串处理函数

1.测字符串长度函数 头文件&#xff1a; #include <string.h> 函数定义&#xff1a; size_t strlen(const char *s); 函数功能&#xff1a; 测字符指针 s 指向的字符串中字符的个数&#xff0c;不包括 ’\0’ void fun01() {char *num "hello";int len …...

Web自动化测试 —— PageObject设计模式!

一、page object 模式简介 1.1、传统 UI 自动化的问题 无法适应 UI 频繁变化无法清晰表达业务用例场景大量的样板代码 driver/find/click 二、page object 设计原则 2.1、POM 模式的优势 降低 UI 变化导致的测试用例脆弱性问题让用例清晰明朗&#xff0c;与具体实现无关 2.…...

七月论文审稿GPT第2版:从Meta Nougat、GPT4审稿到Mistral、LongLora

前言 如此前这篇文章《学术论文GPT的源码解读与微调&#xff1a;从chatpaper、gpt_academic到七月论文审稿GPT》中的第三部分所述&#xff0c;对于论文的摘要/总结、对话、翻译、语法检查而言&#xff0c;市面上的学术论文GPT的效果虽暂未有多好&#xff0c;可至少还过得去&am…...

Unreal Engine 学习笔记 (1)—— 日夜交替

1.创建关卡 文件新建关卡空白关卡保存关卡&#xff08;命名为NewWorld&#xff09; 2.创建蓝图类 创建蓝图类&#xff08;继承自Actor&#xff09; 命名为SunAndMoon 3.编辑SunAndMoon蓝图类 添加SkyAtmosphere添加SkyLight添加DirectionalLight将DirectionalLight重命名为…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁

赛门铁克威胁猎手团队最新报告披露&#xff0c;数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据&#xff0c;严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能&#xff0c;但SEMR…...

基于stm32F10x 系列微控制器的智能电子琴(附完整项目源码、详细接线及讲解视频)

注&#xff1a;文章末尾网盘链接中自取成品使用演示视频、项目源码、项目文档 所用硬件&#xff1a;STM32F103C8T6、无源蜂鸣器、44矩阵键盘、flash存储模块、OLED显示屏、RGB三色灯、面包板、杜邦线、usb转ttl串口 stm32f103c8t6 面包板 …...

RabbitMQ 各类交换机

为什么要用交换机&#xff1f; 交换机用来路由消息。如果直发队列&#xff0c;这个消息就被处理消失了&#xff0c;那别的队列也需要这个消息怎么办&#xff1f;那就要用到交换机 交换机类型 1&#xff0c;fanout&#xff1a;广播 特点 广播所有消息​​&#xff1a;将消息…...