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

相关推荐
EVERSPIN2 小时前
分享国产32位单片机的电机控制方案
单片机·嵌入式硬件
芯橦5 小时前
【瑞昱RTL8763E】音频
单片机·嵌入式硬件·mcu·物联网·音视频·visual studio code·智能手表
夜间去看海9 小时前
基于单片机的智能浇花系统
单片机·嵌入式硬件·智能浇花
VirtuousLiu9 小时前
LM74912-Q1用作电源开关
单片机·嵌入式硬件·ti·电源设计·lm74912·电源开关
打地基的小白9 小时前
软件I2C-基于江科大源码进行的原理解析和改造升级
stm32·单片机·嵌入式硬件·通信模式·i2c
Echo_cy_10 小时前
STM32 DMA+AD多通道
stm32·单片机·嵌入式硬件
朴人10 小时前
【从零开始实现stm32无刷电机FOC】【实践】【7.2/7 完整代码编写】
stm32·单片机·嵌入式硬件·foc
追梦少年时10 小时前
STM32中断——外部中断
stm32·单片机·嵌入式硬件
bai_lan_ya10 小时前
stm32定时器中断和外部中断
stm32·单片机·嵌入式硬件
玄奕子10 小时前
GPT对话知识库——在STM32的平台下,通过SPI读取和写入Flash的步骤。
stm32·单片机·gpt·嵌入式·嵌入式驱动