零、所需文件及环境:
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闪