一、STM32F407VET6点亮一个LED灯

零、所需文件及环境:


        1、上一章新建好的工程模版

        2、编译环境MDK5(KEIL5)   

        3、一个STM32F07VET6硬件

        4、一个下载器j-link 或 st-link等

        5.一个原子的F4源码文件  也可以不要 我删减后代码已经在文中了 可以直接复制

        6.代码编辑器 Notepad++   (可以不要 用记事本也能编译  都是习惯的问题)

壹、复制工程模版

1.1 将新建好的工程模版复制一份并改一个自己喜欢的名字

1.2 进入USER/BSP文件夹下 创建一个LED文件夹

1.3 进入Project文件夹下 打开工程 如果没有修改过点.uvprojx结尾文件

1.4 打开工程后点两下新建文件

1.5 保存新建立的两个文件 注意文件保存路径 文件名添加前缀bsp后期文件太多方便管理

1.7 添加头文件路径 一定要点到根目录下  点两次ok 退出

贰、编写BSP_LED.c与BSP_LED.h代码

2.1 编写BSP_LED.h   所有自己写的.c和.h 记得多敲两行空行 不然会报警告

#ifndef __BSP_LED_H
 
#define __BSP_LED_H
 
    #include "stm32f4xx.h"
        
//定义一个宏 以后改起来方便只需要修改宏就可以
//根据实际情况选择哪一个口  我的硬件灯接的PB9
#define LED_PIN             GPIO_Pin_1
#define LED_GPIO_PORT       GPIOE                    
#define LED_GPIO_CLK        RCC_APB2Periph_GPIOE
 
 
//根据自己实际硬件定义  有的是输出高亮 有的是输出低亮
//GPIO_SetBits(LED_GPIO_PORT,LED_PIN);                               //输出高
//GPIO_ResetBits(LED_GPIO_PORT,LED_PIN);                               //输出低
 
#define CPU_LED_ON                  GPIO_ResetBits(LED_GPIO_PORT,LED_PIN)
#define CPU_LED_OFF                  GPIO_SetBits(LED_GPIO_PORT,LED_PIN)
    extern void BSP_LED_Init(void);
 
#endif
 

2.1 编写BSP_LED.c   所有自己写的.c和.h 记得多敲两行空行 不然会报警告

#include "BSP_LED.h"

void BSP_LED_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE); //使能GPIOD的时钟
    
    GPIO_InitStructure.GPIO_Pin= GPIO_Pin_1 ;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;//输出
    GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;  //推挽输出
    GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;  //上拉
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz; //高速GPIO
    GPIO_Init(GPIOE,&GPIO_InitStructure);
}

2.1 将BSP_LED.c文件添加至工程    点那个三个颜色的品字形图标

叁、编写BSP_DELAY.c与BSP_DELAY.h代码

3.1 进入USER/BSP文件夹下 复制LED文件夹改为DELAY   这是第二种操作流程  与新建BSP_LED.h 、BSP_LED.c 流程不一样  习惯哪一个用哪一个

3.2 进入USER/BSP/DELAY 文件夹下 修改文件名

3.3 打开BSP_DELAY.h  修改 BSP_DELAY.h为如下代码   所有自己写的.c和.h 记得多敲两行空行 不然会报警告

#ifndef __BSP_DELAY_H
#define __BSP_DELAY_H 
#include "stm32f4xx.h"

void BSP_DELAY_Init(uint8_t SYSCLK);
void BSP_DELAY_ms(uint16_t nms);
void BSP_DELAY_us(uint32_t nus);

#endif

3.4 打开BSP_DELAY.c  修改BSP_DELAY.c 为如下代码    复制的原子的delay代码 做了一些删减  里面为了适应实时操作系统越写越臃肿 并且他起的名字后期有其他模块的时候有的会重名(如lwip协议栈) 到那时还得重新修改 还不如刚开始做基础工程的时候规范命名     

所有自己写的.c和.h 记得多敲两行空行 不然会报警告

#include "BSP_DELAY.h"


static uint8_t   fac_us=0;                            //us延时倍乘数               
static uint16_t fac_ms=0;                            //ms延时倍乘数,在os下,代表每个节拍的ms数
    

//初始化延迟函数
//当使用OS的时候,此函数会初始化OS的时钟节拍
//SYSTICK的时钟固定为AHB时钟的1/8
//SYSCLK:系统时钟频率
void BSP_DELAY_Init(uint8_t SYSCLK)
{
     SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); 
    fac_us=SYSCLK/8;                        //不论是否使用OS,fac_us都需要使用
    fac_ms=(uint16_t)fac_us*1000;                //非OS下,代表每个ms需要的systick时钟数   

}                                    


//延时nus
//nus为要延时的us数.    
//注意:nus的值,不要大于798915us(最大值即2^24/fac_us@fac_us=21)
void BSP_DELAY_us(uint32_t  nus)
{        
    uint32_t  temp;             
    SysTick->LOAD=nus*fac_us;                 //时间加载               
    SysTick->VAL=0x00;                        //清空计数器
    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数      
    do
    {
        temp=SysTick->CTRL;
    }while((temp&0x01)&&!(temp&(1<<16)));    //等待时间到达   
    SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
    SysTick->VAL =0X00;                       //清空计数器 
}
//延时nms
//注意nms的范围
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对168M条件下,nms<=798ms 
void delay_xms(uint16_t nms)
{                     
    uint32_t  temp;           
    SysTick->LOAD=(uint32_t )nms*fac_ms;            //时间加载(SysTick->LOAD为24bit)
    SysTick->VAL =0x00;                       //清空计数器
    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //开始倒数 
    do
    {
        temp=SysTick->CTRL;
    }while((temp&0x01)&&!(temp&(1<<16)));    //等待时间到达   
    SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器
    SysTick->VAL =0X00;                       //清空计数器              

//延时nms 
//nms:0~65535
void BSP_DELAY_ms(uint16_t nms)
{          
    uint8_t repeat=nms/540;                        //这里用540,是考虑到某些客户可能超频使用,
                                            //比如超频到248M的时候,delay_xms最大只能延时541ms左右了
    uint16_t remain=nms%540;
    while(repeat)
    {
        delay_xms(540);
        repeat--;
    }
    if(remain)delay_xms(remain);

            

3.5 将BSP_DELAY.c文件添加至工程

3.6 添加BSP_DELAY.h 头文件路径  添加完记得点击两次ok

肆、编写main函数

#include "stm32f4xx.h"

#include "BSP_DELAY.h"
#include "BSP_LED.h"

int main(void)
{
    BSP_DELAY_Init(168);           //延时初始化
    BSP_LED_Init();              //LED初始化    

    while(1)
    {

        CPU_LED_ON;
        BSP_DELAY_ms(500);
        CPU_LED_OFF;
        BSP_DELAY_ms(500);
        
    
    }
}

伍、配置下载器

5.1 如果最开始的时候修改过工程名 则需要重新配置一下下载器 这也是我不爱修改工程名的原因

5.2 选择下载器没j-link   自己是啥选择自己的下载器 

 陆、编译

6.1 点击这俩都可以

柒、下载

7.1  下载运行 灯在哪里布林布林的每隔500ms闪

  • 18
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值