使用STM32固件库编程实现LED小灯点亮功能

使用STM32固件库编程驱动led灯

第一步:打开keil5,创建工程文件


第二步:选择自己想要的路径(温馨提示,最好不要创建在C盘里面)然后点击保存

第三步:因为我们是使用STM32单片机所以选择Software Packs

因为我们使用的是stm32F1系列的芯片所以要选择如下

STM32F1系列有多种芯片,所以我们可以根据自己手上的单片机型号来选择(例如我手上的是F103RCT6芯片就选下面的)

这下我们就创建好了我们的工程文件


创建如下五个相关模块组

修改组名时,我们需要点击组一次然后再间隔一秒再次点击,就可以修改组名了

Start:添加Libraries——>CMSIS——>startup中的启动文件

Cmsis: 添加Libraries——>CMSIS文件夹中的如下文件

Fwlib:添加Libraries——>Fwlib——>src文件夹中所有的.c文件

最后再User中加入以下.h文件

新建main.c文件


双击如图的魔术棒

3.Define添加会调用到的代码 我们得宏定义加载一下

代码如下

STM32F10X_HD, USE_STDPERIPH_DRIVER

添加其他文件的.h路径

接下来编译代码

没有报错,说明我们的启动文件算是完美收官

接下来开始点灯:

在野火mini板中有两路led,且都是低电平点亮,高电平熄灭,所以我们要使能我们的引脚

第一步:新建功能模块组,把创建的led的.c和.h文件加入到里面

LED.c文件

#include "stm32f10x.h"                  // Device header
#include "led.h"

void LED_Init(void)
{
    //打开控制GPIOC的时钟(APB2)
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    //配置结构体
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//引脚配置PC2
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50hz
    
    //成员初始化
        GPIO_Init(GPIOC, &GPIO_InitStructure);
}

LED.h文件

#ifndef _LED_H_
#define _LED_H_

#include "stm32f10x.h"                  // Device header

void LED_Init(void);

#endif

方式一:
下面函数都能实现led灯的点亮和熄灭

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//输出高电平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//输出低电平

main.c文件

#include "stm32f10x.h"                  // Device header
#include "led.h"

int main(void)
{
     LED_Init(); //LED初始化
     while(1)
     {
        GPIO_ResetBits(GPIOC, GPIO_Pin_2);     //PC2引脚输出低电平    
     }
    
}

方式二:

void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);//前两个为指定需要的端口
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);//

代码实现

#include "stm32f10x.h"                  // Device header
#include "led.h"

int main(void)
{
        LED_Init(); //LED初始化
        while(1)
        {
        GPIO_WriteBit(GPIOC, GPIO_Pin_3,Bit_RESET);     //PC3引脚输出低电平-亮灯
        //GPIO_WriteBit(GPIOC, GPIO_Pin_3,Bit_SET);     //PC3引脚输出高电平-熄灯
        }    
}

编译文件:
无报错

下载到单片机
复位开关点亮成功

led小灯闪烁

首先我们需要加入delay延时函数
delay.c

#include "stm32f10x.h"

/**
  * @brief  微秒级延时
  * @param  xus 延时时长,范围:0~233015
  * @retval 无
  */
void Delay_us(uint32_t xus)
{
    SysTick->LOAD = 72 * xus;                //设置定时器重装值
    SysTick->VAL = 0x00;                    //清空当前计数值
    SysTick->CTRL = 0x00000005;                //设置时钟源为HCLK,启动定时器
    while(!(SysTick->CTRL & 0x00010000));    //等待计数到0
    SysTick->CTRL = 0x00000004;                //关闭定时器
}

/**
  * @brief  毫秒级延时
  * @param  xms 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_ms(uint32_t xms)
{
    while(xms--)
    {
        Delay_us(1000);
    }
}
 
/**
  * @brief  秒级延时
  * @param  xs 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_s(uint32_t xs)
{
    while(xs--)
    {
        Delay_ms(1000);
    }
} 

delay.h文件:

#ifndef __DELAY_H
#define __DELAY_H

void Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);

#endif

main.c
#include "stm32f10x.h"                  // Device header
#include "led.h"
#include "delay.h"
int main(void)
{
    LED_Init(); //LED初始化
    while(1)
    {
        GPIO_WriteBit(GPIOC, GPIO_Pin_3,Bit_RESET);     //PC3引脚输出高电平
        Delay_ms(1000);
        GPIO_WriteBit(GPIOC, GPIO_Pin_3,Bit_SET);     //PC3引脚输出低电平
        Delay_ms(1000);
    }
    
}

编译下载复位单片机led进行1s为周期的闪烁——-实验成功!!!

物联沃分享整理
物联沃-IOTWORD物联网 » 使用STM32固件库编程实现LED小灯点亮功能

发表回复