STM32 | STM32使用固件库点亮LED
创始人
2025-05-31 00:24:04
0

STM32使用固件库点亮LED

时间:2023-03-13


文章目录

    • `STM32`使用固件库点亮`LED`
      • 1.参考和资料
        • 1-1.[新建工程—库函数版](https://doc.embedfire.com/mcu/stm32/f103mini/std/zh/latest/book/Newproject_lib.html)
        • 1-2.[`GPIO`输出—使用固件库点亮`LED`](https://doc.embedfire.com/mcu/stm32/f103mini/std/zh/latest/book/GPIO_output.html)
        • 1-3.[`STM32F10x` standard peripheral library](https://www.st.com/content/ccc/resource/technical/software/firmware/48/ab/e5/17/0d/79/43/74/stsw-stm32054.zip/files/stsw-stm32054.zip/jcr:content/translations/en.stsw-stm32054.zip)
        • 1-4.[`GPIO`输出—使用固件库点亮`LED`](https://doc.embedfire.com/mcu/stm32/f103mini/std/zh/latest/book/GPIO_output.html)
        • 1-5.[`gitee`代码](https://gitee.com/Embedfire-stm32f103-mini/ebf_stm32f103_mini_std_code/tree/master/12-GPIO%E8%BE%93%E5%87%BA%E2%80%94%E4%BD%BF%E7%94%A8%E5%9B%BA%E4%BB%B6%E5%BA%93%E7%82%B9%E4%BA%AELED%E7%81%AF)
      • 2.建立工程
        • 2-1.新建文件夹
        • 2-2.新建工程
          • 2-2-1.选择芯片
          • 2-2-2.在线添加库文件
        • 2-3.获取ST标准库
          • 2-3-1.`STM32F10x`固件库文件分析
          • 2-3-2.固件库工程参考模板
        • 2-4.添加组文件夹
          • 2-4-1.修改组文件夹的名字
        • 2-5.新建文件
        • 2-6.复制库文件到项目中
        • 2-7.添加文件到工程中
        • 2-8.配置魔术棒选项卡
      • 3.点亮LED
        • 3-1.硬件原理
        • 3-2.代码编写
          • 3-2-1.新建文件

1.参考和资料

1-1.新建工程—库函数版

1-2.GPIO输出—使用固件库点亮LED

1-3.STM32F10x standard peripheral library

1-4.GPIO输出—使用固件库点亮LED

1-5.gitee代码

2.建立工程

2-1.新建文件夹

$ mkdir Doc Libraries Listings Output Project User

2-2.新建工程

stm32f103-fwlib-led-01

2-2-1.选择芯片

stm32f103-fwlib-led-03

2-2-2.在线添加库文件

后续手动添加,这里直接关掉。

stm32f103-fwlib-led-04

2-3.获取ST标准库

下载主页:STM32标准外设软件库 - 意法半导体STMicroelectronics

stm32f103-fwlib-led-05

stm32f103-fwlib-led-06

2-3-1.STM32F10x固件库文件分析

在这里插入图片描述

1-汇编编写的启动文件
startup_stm32f10x_hd.s:设置堆栈指针、设置PC指针、初始化中断向量表、配置系统时钟、对用C库函数_main最终去到C的世界

2-时钟配置文件
system_stm32f10x.c:把外部时钟HSE=8M,经过PLL倍频为72M

3-外设相关的
stm32f10x.h:实现了内核之外的外设的寄存器映射
xxxGPIOUSRATI2CSPIFSMC
stm32f10x_xx.c:外设的驱动函数库文件
stm32f10x_xx.h:存放外设的初始化结构体,外设初始化结构体成员的参数列表,外设固件库函数的声明

4-内核相关的
CMSIS - Cortex 微控制器软件接口标准
core_cm3.h:实现了内核里面外设的寄存器映射
core_cm3.c:内核外设的驱动固件库

NVIC(嵌套向量中断控制器)、SysTick(系统滴答定时器)
misc.h
misc.c

5-头文件的配置文件
stm32f10x_conf.h:头文件的头文件
//stm32f10x_usart.h
//stm32f10x_i2c.h
//stm32f10x_spi.h
//stm32f10x_adc.h
//stm32f10x_fsmc.h

6-专门存放中断服务函数的C文件
stm32f10x_it.c
stm32f10x_it.h

中断服务函数你可以随意放在其他的地方,并不是一定要放在stm32f10x_it.c

#include "stm32f10x.h"   // 相当于51单片机中的  #include int main(void)
{// 来到这里的时候,系统的时钟已经被配置成72M。
}

在这里插入图片描述

2-3-2.固件库工程参考模板
[FLY@fly-vm Fwlib-Template]$ tree -d
.
├── Doc
├── Libraries
│   ├── CMSIS
│   │   └── startup
│   └── STM32F10x_StdPeriph_Driver
│       ├── inc
│       └── src
├── Project
│   └── Objects
└── User10 directories
[FLY@fly-vm Fwlib-Template]$ tree
.
├── Doc
│   └── readme.txt
├── Libraries
│   ├── CMSIS
│   │   ├── core_cm3.c
│   │   ├── core_cm3.h
│   │   ├── startup
│   │   │   ├── startup_stm32f10x_cl.s
│   │   │   ├── startup_stm32f10x_hd.s
│   │   │   ├── startup_stm32f10x_hd_vl.s
│   │   │   ├── startup_stm32f10x_ld.s
│   │   │   ├── startup_stm32f10x_ld_vl.s
│   │   │   ├── startup_stm32f10x_md.s
│   │   │   ├── startup_stm32f10x_md_vl.s
│   │   │   └── startup_stm32f10x_xl.s
│   │   ├── stm32f10x.h
│   │   ├── system_stm32f10x.c
│   │   └── system_stm32f10x.h
│   └── STM32F10x_StdPeriph_Driver
│       ├── inc
│       │   ├── misc.h
│       │   ├── stm32f10x_adc.h
│       │   ├── stm32f10x_bkp.h
│       │   ├── stm32f10x_can.h
│       │   ├── stm32f10x_cec.h
│       │   ├── stm32f10x_crc.h
│       │   ├── stm32f10x_dac.h
│       │   ├── stm32f10x_dbgmcu.h
│       │   ├── stm32f10x_dma.h
│       │   ├── stm32f10x_exti.h
│       │   ├── stm32f10x_flash.h
│       │   ├── stm32f10x_fsmc.h
│       │   ├── stm32f10x_gpio.h
│       │   ├── stm32f10x_i2c.h
│       │   ├── stm32f10x_iwdg.h
│       │   ├── stm32f10x_pwr.h
│       │   ├── stm32f10x_rcc.h
│       │   ├── stm32f10x_rtc.h
│       │   ├── stm32f10x_sdio.h
│       │   ├── stm32f10x_spi.h
│       │   ├── stm32f10x_tim.h
│       │   ├── stm32f10x_usart.h
│       │   └── stm32f10x_wwdg.h
│       └── src
│           ├── misc.c
│           ├── stm32f10x_adc.c
│           ├── stm32f10x_bkp.c
│           ├── stm32f10x_can.c
│           ├── stm32f10x_cec.c
│           ├── stm32f10x_crc.c
│           ├── stm32f10x_dac.c
│           ├── stm32f10x_dbgmcu.c
│           ├── stm32f10x_dma.c
│           ├── stm32f10x_exti.c
│           ├── stm32f10x_flash.c
│           ├── stm32f10x_fsmc.c
│           ├── stm32f10x_gpio.c
│           ├── stm32f10x_i2c.c
│           ├── stm32f10x_iwdg.c
│           ├── stm32f10x_pwr.c
│           ├── stm32f10x_rcc.c
│           ├── stm32f10x_rtc.c
│           ├── stm32f10x_sdio.c
│           ├── stm32f10x_spi.c
│           ├── stm32f10x_tim.c
│           ├── stm32f10x_usart.c
│           └── stm32f10x_wwdg.c
├── Project
│   ├── BH-F103.uvoptx
│   ├── BH-F103.uvprojx
│   └── Objects
│       └── BH-F103.sct
└── User├── main.c├── stm32f10x_conf.h├── stm32f10x_it.c└── stm32f10x_it.h10 directories, 67 files

2-4.添加组文件夹

stm32f103-fwlib-led-07

2-4-1.修改组文件夹的名字

stm32f103-fwlib-led-08

2-5.新建文件

flyer@ThinkPad-FLY MINGW64 /d/05_study/STM32/stm32-f103rct6-mini-prj/code/02-FWLib_LED/User (master)
$ vim main.cflyer@ThinkPad-FLY MINGW64 /d/05_study/STM32/stm32-f103rct6-mini-prj/code/02-FWLib_LED/User (master)
$ vim stm32f10x_it.cflyer@ThinkPad-FLY MINGW64 /d/05_study/STM32/stm32-f103rct6-mini-prj/code/02-FWLib_LED/User (master)
$ cp stm32f10x_it.c stm32f10x_it.hflyer@ThinkPad-FLY MINGW64 /d/05_study/STM32/stm32-f103rct6-mini-prj/code/02-FWLib_LED/User (master)
$ vim stm32f10x_it.hflyer@ThinkPad-FLY MINGW64 /d/05_study/STM32/stm32-f103rct6-mini-prj/code/02-FWLib_LED/User (master)
$ vim stm32f10x_conf.cflyer@ThinkPad-FLY MINGW64 /d/05_study/STM32/stm32-f103rct6-mini-prj/code/02-FWLib_LED/User (master)
$ mv stm32f10x_conf.c stm32f10x_conf.hflyer@ThinkPad-FLY MINGW64 /d/05_study/STM32/stm32-f103rct6-mini-prj/code/02-FWLib_LED/User (master)
$ ls
main.c  stm32f10x_conf.h  stm32f10x_it.c  stm32f10x_it.h

flyer@ThinkPad-FLY MINGW64 /d/05_study/STM32/stm32-f103rct6-mini-prj/code/02-FWLib_LED (master)
$ cd Libraries/flyer@ThinkPad-FLY MINGW64 /d/05_study/STM32/stm32-f103rct6-mini-prj/code/02-FWLib_LED/Libraries (master)
$ ls
STM32F10x_StdPeriph_Driver/flyer@ThinkPad-FLY MINGW64 /d/05_study/STM32/stm32-f103rct6-mini-prj/code/02-FWLib_LED/Libraries (master)
$ mkdir CMSISflyer@ThinkPad-FLY MINGW64 /d/05_study/STM32/stm32-f103rct6-mini-prj/code/02-FWLib_LED/Libraries (master)
$ cd CMSIS/flyer@ThinkPad-FLY MINGW64 /d/05_study/STM32/stm32-f103rct6-mini-prj/code/02-FWLib_LED/Libraries/CMSIS (master)
$ mkdir startup

2-6.复制库文件到项目中

stm32f103-fwlib-led-09

stm32f103-fwlib-led-10

stm32f103-fwlib-led-11

stm32f103-fwlib-led-12

2-7.添加文件到工程中

添加文件到工程中

stm32f103-fwlib-led-13

2-8.配置魔术棒选项卡

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这个选项中添加宏,就相当于我们在文件中使用“#define”语句定义宏一样。在编译器中添加宏的好处就是,只要用了这个模版,就不用源文件中修改代码。
STM32F10X_HD宏:为了告诉STM32标准库,我们使用的芯片类型是大容量的,使STM32标准库根据我们选定的芯片型号来配置。
USE_STDPERIPH_DRIVER宏:为了让stm32f10x.h包含stm32f10x_conf.h这个头文件。

在这里插入图片描述

3.点亮LED

3-1.硬件原理

LED

  1. 使能GPIO端口时钟;
  2. 初始化GPIO目标引脚为推挽输出模式;
  3. 编写简单测试程序,控制GPIO引脚输出高、低电平。

3-2.代码编写

3-2-1.新建文件
flyer@ThinkPad-FLY MINGW64 /d/05_study/STM32/stm32-f103rct6-mini-prj/code/02-FWLib_LED/User/Led (master)
$ ls
bsp_led.c  bsp_led.h

stm32-f103rct6-mini-prj\code\02-FWLib_LED\User\Led\bsp_led.h

#ifndef __BSP_LED_H__
#define __BSP_LED_H__#include "stm32f10x.h"#define ON 0
#define OFF 1#define LED1_GPIO_PORT      GPIOC
#define LED1_GPIO_CLK       RCC_APB2Periph_GPIOC
#define LED1_GPIO_PIN       GPIO_Pin_2#define LED2_GPIO_PORT      GPIOC
#define LED2_GPIO_CLK       RCC_APB2Periph_GPIOC
#define LED2_GPIO_PIN       GPIO_Pin_3#define LED1(a) if (a) \GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);\else \GPIO_ResetBits(LED1_GPIO_PORT, LED1_GPIO_PIN)#define LED2(a) if (a) \GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);\else \GPIO_ResetBits(LED2_GPIO_PORT, LED2_GPIO_PIN)extern void LED_GPIO_Config(void);#endif

stm32-f103rct6-mini-prj\code\02-FWLib_LED\User\Led\bsp_led.c

/********************************************************************   > File Name: bsp_led.c*   > Create Time: Sun Mar 19 17:29:23 2023******************************************************************/
#include "bsp_led.h"void LED_GPIO_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(LED1_GPIO_CLK | LED2_GPIO_CLK, ENABLE);GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN;GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);
}

stm32-f103rct6-mini-prj\code\02-FWLib_LED\User\main.c

/********************************************************************   > File Name: main.c*   > Create Time: Sun Mar 19 15:37:45 2023******************************************************************/#include "stm32f10x.h"   // �൱��51��Ƭ���е�  #include 
#include "bsp_led.h"#define SOFT_DELAY  Delay(0xFFFFF);void Delay(__IO uint32_t nCount)
{for(;nCount != 0; nCount --);
}int main(void)
{LED_GPIO_Config();while(1){LED1(ON);SOFT_DELAY;LED1(OFF);LED2(ON);SOFT_DELAY;LED2(OFF);}return 0;
}

相关内容

热门资讯

iPhone手机怎么玩安卓系统... 你有没有想过,你的iPhone手机竟然也能玩安卓系统?没错,就是那个一直以来让你觉得遥不可及的安卓世...
平板删安卓系统更新不了,原因及... 最近是不是你也遇到了这样的烦恼?平板电脑上的安卓系统更新不了,是不是让你头疼得要命?别急,今天就来给...
苹果组装机安卓系统卡,卡顿背后... 你有没有发现,最近用苹果手机的时候,有时候系统有点卡呢?这可真是让人头疼啊!你知道吗,其实这背后还有...
安卓系统原生浏览器,功能与体验... 你有没有发现,每次打开手机,那个小小的浏览器窗口总是默默无闻地在那里,陪你浏览网页、搜索信息、看视频...
安卓机如何上苹果系统,跨平台体... 你是不是也和我一样,对安卓机和苹果系统之间的切换充满了好奇?想象你的安卓手机里装满了各种应用,而苹果...
安卓导入系统证书失败,原因分析... 最近在使用安卓手机的时候,你是不是也遇到了一个让人头疼的问题——导入系统证书失败?别急,今天就来给你...
安卓原生系统有哪些手机,盘点搭... 你有没有想过,为什么有些手机用起来就是那么流畅,那么顺心呢?这背后可大有学问哦!今天,就让我带你一起...
安卓系统关机了怎么定位,安卓系... 手机突然关机了,是不是有点慌张呢?别担心,今天就来教你一招,让你的安卓手机即使关机了,也能轻松定位到...
安卓系统游戏加速器,畅享无延迟... 你有没有发现,手机游戏越来越好玩了?不过,有时候游戏体验可能并不那么顺畅,是不是因为手机性能不够强大...
安卓4系统天气功能,尽在掌握 安卓4系统天气功能大揭秘在当今这个数字化的世界里,手机已经不仅仅是一个通信工具,它更是一个集成了各种...
安卓系统如何玩碧蓝幻想,攻略与... 你有没有想过,在安卓系统上玩《碧蓝幻想》竟然可以这么酷炫?没错,就是那个让你沉迷其中的二次元大作!今...
安卓系统搜不到图朵,图朵生成之... 最近是不是你也遇到了这样的烦恼?手机里明明有那么多美美的图片,但是用安卓系统搜索的时候,却怎么也找不...
魁族8刷安卓系统,系统升级后的... 哇,你知道吗?最近在安卓系统圈子里,有一个话题可是引起了不小的轰动,那就是魁族8刷安卓系统。你是不是...
微信正版安装安卓系统,畅享沟通... 你有没有想过,你的微信是不是正版安装的安卓系统呢?这可不是一个小问题哦,它关系到你的微信使用体验和隐...
电视能刷安卓系统吗,电视也能刷... 电视能刷安卓系统吗?揭秘智能电视的无限可能想象你家的电视不再只是用来观看节目的工具,而是变成了一个功...
安卓系统开通通知功能,畅享智能... 你知道吗?最近安卓系统更新后,新增了一个超级实用的功能——开通通知功能!这可是个大喜事,让咱们的生活...
苹果系统安卓爱思助手,系统兼容... 你有没有发现,手机的世界里,苹果系统和安卓系统就像是一对欢喜冤家,总是各有各的粉丝,各有各的拥趸。而...
安卓系统占用很大内存,揭秘内存... 手机里的安卓系统是不是让你感觉内存不够用,就像你的房间堆满了杂物,总是找不到地方放新东西?别急,今天...
安卓系统p30,安卓系统下的摄... 你有没有发现,最近安卓系统P30在手机圈里可是火得一塌糊涂呢!这不,我就来给你好好扒一扒这款手机的那...
siri被安卓系统进入了,智能... 你知道吗?最近科技圈可是炸开了锅,因为一个大家伙——Siri,竟然悄悄地溜进了安卓系统!这可不是什么...