使用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工程,希望可以和大家一起学习。若有不合适之处,还请大家多多指正。)

相关推荐
就是蠢啊3 分钟前
51单片机——LCD1602液晶显示
单片机·嵌入式硬件·51单片机
love530love17 分钟前
【笔记】华硕 ROG MAXIMUS Z890 HERO 主板 BIOS 更新完整操作实录
运维·人工智能·windows·笔记·单片机·嵌入式硬件·bios
尼喃20 分钟前
3.7V升压5V 1A芯片精选推荐,高效率低功耗,满足工程需求
单片机·嵌入式硬件
小李做物联网25 分钟前
【单片机毕业设计】76.1基于单片机stm32智能浇灌系统毕业设计
stm32·单片机·嵌入式硬件·物联网
c106389151427 分钟前
stm32系列之编码器功能
stm32·单片机·嵌入式硬件
三品吉他手会点灯43 分钟前
STM32F103 学习笔记-20-通信的基本概念
笔记·stm32·单片机·嵌入式硬件·学习
悠哉悠哉愿意43 分钟前
【嵌入式学习笔记】GPIO与LED
笔记·单片机·嵌入式硬件·学习
v先v关v住v获v取1 小时前
3D打印机的定量铺粉器设计13张 +三维图+设计说明书
科技·单片机·51单片机
点灯小铭1 小时前
基于单片机的双机串口通信与数字串存储系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
chipsense1 小时前
霍尔电流传感器量程怎么确认,能覆盖实际电流监测需求么?
stm32·单片机·嵌入式硬件·霍尔电流传感器