本文主要基于库模板搭建跑马灯项目,最终实现led1与led2循环点亮、熄灭。
库模板搭建可以参考这篇:【STM32工程模板】库函数模板搭建
Step1:工程目录核对。 基于库模板的话,直接就是这样的目录。
Step2:在HAREWARD目录下创建led.c/led.h文件,打开keil,建立项目分组。(记得将新建的两个led文件导入工程)
Step3:编写led.c/led.h文件。
- 在h文件中define我们的头文件以及声明函数。这里我们用#ifndef… #define…#endif这样的范式。功能:如果已经定义就不再定义了,没有定义我们就进行定义。代码如下:
#ifndef __LED_H
#define __LED_H
void LedInit(void);
#endif
- c文件中编写led初始化的程序。两个led是用STM32的GPIOB5和GPIOE8进行控制的,我们首先要对这两个GPIO口进行初始化,包括GPIO的时钟初始化,引脚、模式、输出速度的设置。这里我们需要先介绍几个重要的函数:
GPIO初始化函数:
void GPIO_Init (GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
2个读取输入电平函数:
uint8_t GPIO_ReadInputDataBit (GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
2个读取输出电平函数:
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
4个设置输出电平函数:
void GPIO_SetBits (GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits (GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
我们在这里主要用到的是上面加粗的函数。关于GPIO相关函数的使用方法,在进行开发时我们往往是选中该函数然后进行"go to definition",查看使用方法,如图。
void GPIO_SetBits使用举例: 对于GPIO方法的使用,在GPIO的h文件最下方列出了几乎所有的GPIO相关函数。如图:
我们选中GPIO_SetBits函数进入"go to definition",会跳转到下图所示位置。
其中asserm_param
声明了参数的可用性,如选中IS_GPIO_ALL_PERIPH(GPIOx)
并进行"go to definition",会告诉我们可以用哪些值,如下图。
我们复制GPIOB到函数第一个参数的位置,对于第二个参数也是同样的方法。如GPIO_SetBits(GPIOB,GPIO_Pin_5);
其他函数的使用也是这样的方法。
led初始化c程序源码
下面是led初始化(GPIO初始化)的完整程序,在程序中先将GPIOB和GPIOE的时钟开启,用了RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE,ENABLE);
函数。后面就是GPIO相关的函数使用了。
#include "led.h"
#include "stm32f10x.h"
void LedInit(void){
GPIO_InitTypeDef GPIO_InitTypeStr;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE,ENABLE);
GPIO_InitTypeStr.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitTypeStr.GPIO_Pin=GPIO_Pin_5;
GPIO_InitTypeStr.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOB,&GPIO_InitTypeStr);
GPIO_SetBits(GPIOB,GPIO_Pin_5); //推挽输出默认高电平为灭
GPIO_InitTypeStr.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitTypeStr.GPIO_Pin=GPIO_Pin_8;
GPIO_InitTypeStr.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOE,&GPIO_InitTypeStr);
GPIO_SetBits(GPIOE,GPIO_Pin_8); //推挽输出默认高电平为灭
}
Step4:主程序的编写。 这里比较简单,我们就直接贴代码了。
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "sys.h"
int main(void){
delay_init();
LedInit();
while(1){
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_SetBits(GPIOE,GPIO_Pin_8);
delay_ms(1000);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOE,GPIO_Pin_8);
delay_ms(1000);
}
}
那本篇就先介绍到这里。