stm32之keil开发环境搭建
只要按照下面的一步步来,绝对能从0开始建立一个STM32工程。不仅包括工程建立过程,还有Jlink设置方法。本文使用芯片为STM32F103CB。
1 下载stm32F10x的官方库
http://www.st.com/web/en/catalog/tools/PF257890
2 新建工程
工程名设为stm32_demo,选择芯片型号为STM32F103B,如图,

因为下载的stm32库中有启动代码,所以这里选择"否",不拷贝启动代码。

在工程文件下,新建Startup 、Headers、User、Libraries、CMSIS、Lists、Output文件夹。
|
文件夹 |
用途 |
|
Startup |
启动文件,Flash在16~32Kb小容量,64~128Kb中容量,256~512Kb大容量 |
|
CMSIS |
Cortex微控制器软件接口标准文件,该目录下文件适用所有Cortex系列 |
|
Libraries |
存放stm32的驱动库文件 |
|
Headers |
自定义的全局头文件 |
|
User |
用户文件,我们把main.c放在该目录下 |
|
Lists |
编译过程中产生的文件 |
|
Output |
编译后输出文件,hex/bin等可执行属性的文件将保存在该目录下 |
至此,stm32的工程文件结构如下

3 库文件拷贝
把下载stm32库中文件拷贝到新建工程中
|
stm32F10x的官方库 |
工程 |
|
Libraries\STM32F10x_StdPeriph_Driver\inc 库头文件 Libraries\STM32F10x_StdPeriph_Driver\src 库源文件 |
Libraries |
|
Project\STM32F10x_StdPeriph_Template\main.c Project\STM32F10x_StdPeriph_Template\stm32f10x_it.c 中断函数文件 |
User |
|
Project\STM32F10x_StdPeriph_Template\stm32f10x_it.h 中断函数头文件 Project\STM32F10x_StdPeriph_Template\stm32f10x_conf.h 配置文件 |
Headers |
|
Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm\* 启动文件 |
Startup |
|
Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\stm32f10x.h Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\ system_stm32f10x.c Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\system_stm32f10x.h |
CMSIS |
|
Libraries\CMSIS\CM3\CoreSupport\core_cm3.c Cortex-M3系统文件 Libraries\CMSIS\CM3\CoreSupport\core_cm3.h |
CMSIS |
文件拷贝完成后的工程文件目录结构如下:

4 将文件添加到工程
点击Keil右上角的工程分组按钮,在Group一列添加分组,分组和工程的文件名可以一一对应。





5 工程配置
点击右上角的工程配置按钮,弹出对话框,有多个选项卡,按照下面截图逐一配置。




6 编译链接
原来的main.c从库文件中拷贝过来的,把其中的内容都删除,添加最简单的main函数:
- #include "stm32f10x.h"
- int main(void)
- {
- while(1) {
- }
- }
修改配置文件stm32f10x_conf.h,通过注释添加或取消注释删除需要的功能模块,这里根据自己需要配置。

编译

7 Jlink调试配置
接上Jlink及开发板,




至此,STM32的工程搭建和Jlink调试配置都设置好了。为了方便,在工程成中添加了includes.h、types.h、gpio_bits.h等提供基本功能。
8 测试程序——LED流水灯程序
在工程文件目录下新建Drivers与Devices文件夹,
|
Drivers |
存放stm32相关的驱动,比如:延时函数等 |
|
Devices |
存放开发板上涉及的硬件设备相关代码 |
工程中File->New,新建下面的一些文件。
|
Drivers/delay.h |
延时函数头文件 |
|
Drivers/delay.c |
延时函数源文件 |
|
Devices/led.h |
LED流水灯头文件 |
|
Devices/led.c |
LED流水灯源文件 |
注:作为一种好的习惯,每个.c文件都应该有一个对应的.h文件。
添加代码:
led.c
- /*
- * LED example
- * Author : xiahouzuoxin
- * Date : 2013.08
- */
- #include "LED.h"
- GPIO_InitTypeDef LED_InitStructure;
- /********************************************************************
- Function Name: Init_LED
- Author : 夏侯佐鑫
- Date : 2011-09-28
- Description :
- Inputs : None
- Outputs : None
- Notes :
- Revision :
- ********************************************************************/
- void InitLED(void)
- {
- //使能PA端口时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- //端口配置推挽输出
- LED_InitStructure.GPIO_Pin = LED1 | LED2 | LED3 | LED4;
- LED_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- LED_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOA, &LED_InitStructure);
- //初始输出高电平
- GPIO_SetBits(GPIOA, LED1 | LED2 | LED3 | LED4);
- }
- /********************************************************************
- Function Name: Flash_LED
- Author : xiahouzuoxin
- Date : 2011-09-28
- Description :
- Inputs : None
- Outputs : None
- Notes :
- Revision :
- ********************************************************************/
- void FlashLED(void)
- {
- GPIO_SetBits(GPIOA, LED2 | LED3 | LED4);
- GPIO_ResetBits(GPIOA, LED1);
- delay_ms(500);
- GPIO_SetBits(GPIOA, LED1 | LED3 | LED4);
- GPIO_ResetBits(GPIOA, LED2);
- delay_ms(500);
- GPIO_SetBits(GPIOA, LED1 | LED2 | LED4);
- GPIO_ResetBits(GPIOA, LED3);
- delay_ms(500);
- GPIO_SetBits(GPIOA, LED1 | LED2 | LED3);
- GPIO_ResetBits(GPIOA, LED4);
- delay_ms(500);
- }
led.h
- /*
- * LED example
- * Author : xiahouzuoxin
- * Date : 2013.08
- */
- #ifndef __LED_H__
- #define __LED_H__
- #include "../Headers/includes.h"
- #define LED1 GPIO_Pin_4
- #define LED2 GPIO_Pin_5
- #define LED3 GPIO_Pin_6
- #define LED4 GPIO_Pin_7
- extern void InitLED(void);
- extern void FlashLED(void);
- #endif
delay.h
- #ifndef _DELAY_H
- #define _DELAY_H
- #include "includes.h"
- extern void delay_ms(UINT32 ms);
- #endif
delay.c
- #include "delay.h"
- /********************************************************************* DELAY_MS
- * Discription : delay for 1 ms if ms=1, not accurate
- * Author : xiahouzuoxin
- * data : 2012-08-01
- * inputs : ms -- ms number
- * outputs :
- * Modified :
- ********************************************************************/
- void delay_ms(UINT32 ms)
- {
- int i = 0;
- int j = 0;
- for(i = 0; i < ms; i++)
- {
- for(j = 0; j < 8040; j++)
- {
- // Delay n ms
- }
- }
- }
includes.h
- #include "../Devices/LED.h"
main.c
- #include "includes.h"
- int main(void)
- {
- InitLED();
- while(1) {
- FlashLED();
- }
- }
编译下载,运行,OK!
stm32之keil开发环境搭建的更多相关文章
- Eclipse + CDT + YAGARTO + J-Link,STM32开源开发环境搭建与调试
Eclipse+CDT+YAGARTO+J-Li:开源开发环境搭建与调试:作者:Chongqing:邮箱:ycq.no1@163.com:文档版本:V1.0:发布日期:2014-08-04:前言:此文 ...
- 【STM32H7教程】第2章 STM32H7的开发环境搭建
完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第2章 STM32H7的开发环境搭建 本章主要为大 ...
- Nordic nRF51/nRF52开发环境搭建
本文将详述Nordic nRF51系列(包括nRF51822/nRF51802/nRF51422等)和nRF52系列(包括nRF52832/nRF52810/nRF52840)开发环境搭建. 1. 强 ...
- SLAM+语音机器人DIY系列:(五)树莓派3开发环境搭建——1.安装系统ubuntu_mate_16.04
摘要 通过前面一系列的铺垫,相信大家对整个miiboo机器人的DIY有了一个清晰整体的认识.接下来就正式进入机器人大脑(嵌入式主板:树莓派3)的开发.本章将从树莓派3的开发环境搭建入手,为后续ros开 ...
- 痞子衡嵌入式:把玩i.MXRT1062 TencentOS Tiny EVB_AIoT开发板(1) - 开发环境搭建与点灯
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1062 TencentOS Tiny EVB_AIoT开发板环境搭建与点灯. 腾讯 TencentOS 团队于2021年1 ...
- python开发环境搭建
虽然网上有很多python开发环境搭建的文章,不过重复造轮子还是要的,记录一下过程,方便自己以后配置,也方便正在学习中的同事配置他们的环境. 1.准备好安装包 1)上python官网下载python运 ...
- IntelliJ IDEA安装及jsp开发环境搭建
一.前言 现在.net国内市场不怎么好,公司整个.net组技术转型,就个人来说还是更喜欢.net,毕竟不是什么公司都像微软一样财大气粗开发出VS这样的宇宙级IDE供开发者使用,双击sln即可打开项目, ...
- Qt for Android开发环境搭建及测试过程记录
最近学习了Qt的QML编程技术,感觉相较于以前的QtGUI来说更方便一些,使用QML可以将界面与业务逻辑解耦,便于开发. QML支持跨平台,包括支持Android平台,因此可以使用Qt的QML进行An ...
- node.js之开发环境搭建
一.安装linux系统 (已安装linux可跳此步骤) 虚拟机推荐选择:VirtualBox 或者 Vmware (专业版永久激活码:5A02H-AU243-TZJ49-GTC7K-3C61N) 我这 ...
随机推荐
- JAVA中的数据存储空间简述
在 JAVA 中,有六个不同的地方可以存储数据: 1. 寄存器( register ): 最快的存储区,因为它位于不同于其他存储区——处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据需求进 ...
- 解决spring-boot启动中碰到的问题:Cannot determine embedded database driver class for database type NONE
问题 如下: 2017-07-16 08:50:57.436 INFO 13524 --- [ main] c.p.p.web.PointshopWebApplication ...
- 高通HAL层之bmp18x.cpp
继续上一个链接内容所讲:http://www.cnblogs.com/linhaostudy/p/8430583.html 下面bmp18x sensor为例进行分析. BMP18x Sensor: ...
- 《深入理解Java虚拟机》学习笔记(二)
垃圾回收的前提是判断对象是否存活,对象不再存活时将会被回收,下面是2种判断的方法. 引用计数法: 主流的Java虚拟机并没有使用引用计数法来管理内存,重要的原因就是循环引用的问题难以解决. 可达性分析 ...
- HDU [1529] || POJ [P1275] Cashier Employment
经典的差分约束+二分答案. 本题的难点在于如何建图. 设x[i] 表示第i个小时可以开始工作的有多少个人. num[i] 表示第i个小时最少需雇佣多少人. s[i] 表示1...i小时实际开始工作的有 ...
- selenium2 python自动化测试实战(回归测试)
selenium2 python自动化测试实战 最近接手商城的项目,针对后台测试,功能比较简单,但是流程比较繁多,涉及到前后台的交叉测试.在对整个项目进行第一轮测试完成之后,考虑以后回归测试任务比较重 ...
- 当inline元素包裹block元素时会发生什么
经常有图片链接写法如下: <a href="www.baidu.com"><img src="baidu.jpg" /></a&g ...
- [php]通过http post发送json数据
function http_post_data($url, $data_string) { $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, 1); ...
- maven配置全局的jdk和配置局部的jdk
配置全局的jdk需要修改maven的setting.xml文件 <profile> <id>jdk17</id> <activation> <ac ...
- CEF小白人系列1-认识CEF
手头上有个项目需要做浏览器的相关功能,评估了几个嵌入式方案最后选定CEF作为开发基础. 在入坑新技术的时候第一选择是去官网学习,这是一个非常好的习惯. CEF官网(请科学上网) https://bit ...