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