使用keil5的固件库建立第一个STM32工程

这里小编使用STM32F103ZET6型号开发板为例,给大家介绍使用keil5的固件库建立一个LED灯闪烁的工程。这种方式简单直接易上手,特适合某些想偷懒或赶时间编程的朋友。

一、步骤:

第一步,选择正确的芯片型号。这个是基本的步骤,无论我们使用什么型号的开发板,我们在开发的时候都需要选择正确的开发板型号。否则,某一函数或引脚会报错。

编辑

第二步,选择完整的固件。这里我们需要的固件有LED、CODE、Startup、GPIO、RCC与Framework。此处需要注意,我们在建立某一个工程时一定需要完整选择固件,不然编译时会报找不到某个头文件;此外,假如我们在建立工程时,不知道具体需要哪些固件,可以看看我们在选择固件时固件库给的建议。这里我就是一开始没有选择GPIO,然后编译时就一直报错,哈哈哈哈啊哈哈。

​编辑

​编辑

第三步,建立一个main函数。我们需要注意的是在建立函数时一旦写完最后一行后没有空行,那编译的时候也会有奇怪的报错,哈哈哈哈啊啊哈哈。这里小编也不知道为什么,反正就是需要添加空行,大概添加2~3行就行了。哈哈哈哈啊哈哈哈。

scss 复制代码
#include "stm32f10x.h"                  // Device header

//LED的初始化函数 也就是初始化GPIO
void LEDInit()
{
	//定义一个结构体,结构体只有三个成员 类型为GPIO_InitTypeDef 名字是GPIO_InitStructure
	//用于初始化GPIO
	GPIO_InitTypeDef GPIO_InitStructure; 
	//系统硬件的相关配置 会初始化内部FALSH,PLL并且更新系统时钟
	SystemInit();
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE); 
	//给GPIO_InitStructure结构体赋值
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //选择所用的引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//设置GPIO的速度为10MHz
	//(此处需要注意的是GPIO一共有8钟工作模式)
	//GPIO的初始化 分别是GPIO_Mode_AIN(模拟输入)、GPIO_Mode_IN_FLOATING(输入浮空)
	//GPIO_Mode_IPD(输入下拉)、GPIO_Mode_IPU(输入上拉)、GPIO_Mode_Out_OD(开漏输出)
	//GPIO_Mode_Out_PP(推挽输出)、GPIO_Mode_AF_OD(开漏复用功能)、GPIO_Mode_AF_PP(推挽复用功能)。
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;//设置GPIO的工作模式 推挽输出模式
	//初试化GPIO 第一个参数代表要配置哪组GPIO 第二个参数是第1步定义的GPIO的初始化类型结构体
	GPIO_Init(GPIOC, &GPIO_InitStructure); 

}	

//LED闪烁函数
void LEDdisplay()
{ 
	u32 i;
	//到GPIOC组 让GPIO的所有引脚输出高电平
	GPIO_SetBits(GPIOC, GPIO_Pin_All);	
	//到GPIO组 使得GPIO的引脚3、4、6复位
	GPIO_ResetBits(GPIOC, GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_6); 
	//延时
	for(i=0;i<18000000;i++) ;
	while(1)
	{
		//给GPIOC组赋值为0x00 让所有的LED灯都点亮
		GPIO_Write(GPIOC, 0x00); 
		//延时
		for(i=0;i<6000000;i++) ;
		//给GPIOC组赋值为0x00 让所有的LED灯都熄灭
		GPIO_Write(GPIOC, 0xff); 
		//延时
		for(i=0;i<6000000;i++) ;
	}
}

//主函数
int main(){
	
	LEDInit();//LED的初始化化函数
	LEDdisplay();//LED工作函数
	
}

最后,编译下载就搞定我们的第一个STM32工程啦。

二、剖析第一个程序

1.大致思路

该程序首先需要配置GPIO,这里我们需要设置GPIO的模式、配置系统硬件与相关时钟等,在我们配置完后,我们才能够去设置点亮LED灯的相关步骤。

2.解释需要用到的函数与结构体

首先定义GPIO的初始化类型结构体:GPIO_InitTypeDef GPIO_InitStructure;此结构体的定义是在stm32f10x_gpio.h文件中,其中包括3个成员:

成员1,:uint16_t GPIO_Pin表示引脚,这里我们拥有16个引脚;

成员2:GPIOSpeed_TypeDef GPIO_Speed表示速度,一般速度有10HMz、2HMz与50HMz;

成员3:GPIOMode_TypeDef GPIO_Mode表示工作模式,GPIO拥有8种工作模式,即分别是GPIO_Mode_AIN(模拟输入)、GPIO_Mode_IN_FLOATING(输入浮空)、GPIO_Mode_IPD(输入下拉)、GPIO_Mode_IPU(输入上拉)、GPIO_Mode_Out_OD(开漏输出)、GPIO_Mode_Out_PP(推挽输出)、GPIO_Mode_AF_OD(开漏复用功能)、GPIO_Mode_AF_PP(推挽复用功能)。

php 复制代码
/** 
  * @brief  GPIO Init structure definition  
  */
 
typedef struct
{
  uint16_t GPIO_Pin;             /*!< Specifies the GPIO pins to be configured.
                                      This parameter can be any value of @ref GPIO_pins_define */
 
  GPIOSpeed_TypeDef GPIO_Speed;  /*!< Specifies the speed for the selected pins.
                                      This parameter can be a value of @ref GPIOSpeed_TypeDef */
 
  GPIOMode_TypeDef GPIO_Mode;    /*!< Specifies the operating mode for the selected pins.
                                      This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;

GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)函数就是置位GPIO,即让相应的GPIO输出高电平;对应的,void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)函数是让GPIO复位的。

总结

在我看来,假如之前有学过51单片机的朋友,建立STM32工程还是比较简单的。其实呢,这个固件库有点类似51单片机的头文件,都需要事先完整添加,不然就会报错。总的来说,使用keil5的固件库建立工程比我们自己导入文件简单多了,但是这样也会导致我们不熟悉固件的基本驱动代码。(本人也是第一次建立STM32工程,希望可以和大家一起学习。若有不合适之处,还请大家多多指正。)

相关推荐
NYFEA1 天前
徕飞 FCA系列全面上新,一站式I/O扩展国产替代方案
单片机·嵌入式硬件
XiHongShi20161 天前
STM32H7 FLASH和SRAM标准例程
stm32·单片机·嵌入式硬件
单片机杂货铺1 天前
【单片机毕业设计选题】基于单片机的智能牛奶保鲜箱设计
人工智能·stm32·单片机·物联网·毕业设计·课程设计
莫浅子2 天前
day01-USB架构与枚举
c++·单片机·嵌入式驱动
Hello_Damon_Nikola2 天前
INMP441从入门到精通
单片机·嵌入式硬件·物联网
ye150127774552 天前
12V转3V-5V2A电位器无极调光调速WT7027
stm32·单片机·嵌入式硬件
无损检测小白白2 天前
STM32F407 串口3 DMA收发-标准库
stm32·单片机·嵌入式硬件
greatriver0072 天前
e2studio R7FA6M5 卡死 rtc 需要如何配置时钟
单片机·瑞萨单片机
恒锐丰小瑞2 天前
率能SS6812T 40V/1A/双通道H桥驱动芯片,PWM电流控制与混合衰减模式(eTSSOP28),用于POS打印机/安防相机/机器人
单片机·嵌入式硬件·数码相机·机器人
嵌入式阿蔡2 天前
传感器_02:MPU6050 六轴 IMU 姿态入门——从一串看不懂的数,到一个不漂的角度
网络·stm32·单片机·嵌入式硬件·嵌入式实时数据库