学习STM32使用官方标准生成的固件库点流水灯。
- 我们首先要创建几个文件夹,这样有条理的分类,让代码看起来更清晰。
- 然后从官方下载固件库,或者从
STM32CubeMX 中生成固件库,这样从库里解析出需要的头文件。 - 把固件库中需要的库移植到我们建立好的文件夹中。
新建工程
把固件库的CMSIS 文件 <下图是CMSIS 文件夹包含的库> 和 STM32F10x_StdPeriph_Driver 文件 复制到我们新建工程文件夹里的->Libraries 文件夹
打开Keil5,新建工程,进入桌面建好的工程文件夹,建立工程 再工程里添加几个文件。用来存放需要用到的库文件。 CMSIS 文件夹里添加 core_cm3.c / system_stm32f10x.c 这两个文件名
STARTUP 文件夹里添加 startup_stm32f10x_hd.s
FWLB 文件夹里添加 Libraries 文件夹下 STM32F10x_StdPeriph_Driver 文件下的src 文件里全部的库文件。 USER 文件夹里 添加main.c 、stm32f10x_it.c 、stm32f10x_it.h 、stm32f10x_conf.h 文件。 再添加USER 文件下的led文件下的bsp_led.c 、bsp_led.h
整理好这些后。我们在keil5中指定默认宏
1.因为包含文件 “stem32f10x.h” 默认在keil_5安装包里。所以编译会出错误 去指定 在软件 《魔术棒》 C/C++ 里指定头文件(.h文件) 然后在stem32f10x.h中找到需要的宏,对应于 stm32f10x_conf.h 【这个头文件包含了所有外设驱动的头文件】把这个宏放入默认栏中 《形成一个只要使用这个模板就使用这个宏》
2.板载容量 名称也放入默认栏中
那么最后,我们开始对USER 目录下的文件进行编程。
bsp_led.h 文件下代码
#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h"
#define LED1_GPIO_PORT GPIOB
#define LED1_GPIO_CLK RCC_APB2Periph_GPIOB
#define LED1_GPIO_PIN GPIO_Pin_5
#define LED2_GPIO_PORT GPIOB
#define LED2_GPIO_CLK RCC_APB2Periph_GPIOB
#define LED2_GPIO_PIN GPIO_Pin_0
#define LED3_GPIO_PORT GPIOB
#define LED3_GPIO_CLK RCC_APB2Periph_GPIOB
#define LED3_GPIO_PIN GPIO_Pin_1
#define ON 0
#define OFF 1
#define LED1(a) if (a) \
GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);\
else \
GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);
#define LED2(a) if (a) \
GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);\
else \
GPIO_ResetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);
#define LED3(a) if (a) \
GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);\
else \
GPIO_ResetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);
#define digitalHi(p,i) {p->BSRR=i;}
#define digitalLo(p,i) {p->BRR=i;}
#define digitalToggle(p,i) {p->ORD ^=i}
#define LED1_TOGGLE digitalToggle(LED1_GPIO_PORT,LED2_GPIO_PIN)
#define LED1_OFF digitalHi(LED1_GPIO_PORT,LED2_GPIO_PIN)
#define LED1_ON digitalLo(LED1_GPIO_PORT,LED2_GPIO_PIN)
#define LED2_TOGGLE digitalToggle(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define LED2_OFF digitalHi(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define LED2_ON digitalLo(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define LED3_TOGGLE digitalToggle(LED3_GPIO_PORT,LED3_GPIO_PIN)
#define LED3_OFF digitalHi(LED3_GPIO_PORT,LED3_GPIO_PIN)
#define LED3_ON digitalLo(LED3_GPIO_PORT,LED3_GPIO_PIN)
#define LED_RED \
LED1_ON;\
LED2_OFF\
LED3_OFF
#define LED_GREEN \
LED1_OFF;\
LED2_ON\
LED3_OFF
#define LED_BLUE \
LED1_OFF;\
LED2_OFF\
LED3_ON
#define LED_YELLOW \
LED1_ON;\
LED2_ON\
LED3_OFF
#define LED_PURPLE \
LED1_ON;\
LED2_OFF\
LED3_ON
#define LED_CYAN \
LED1_OFF;\
LED2_ON\
LED3_ON
#define LED_WHITE \
LED1_ON;\
LED2_ON\
LED3_ON
#define LED_RGBOFF \
LED1_OFF;\
LED2_OFF\
LED3_OFF
void LED_GPIO_Config(void);
#endif
bsp_led.c 文件内代码
#include "bsp_led.h"
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(LED1_GPIO_CLK | LED2_GPIO_CLK | LED3_GPIO_CLK,ENABLE);
GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN;
GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = LED3_GPIO_PIN;
GPIO_Init(LED3_GPIO_PORT,&GPIO_InitStructure);
GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);
GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);
GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);
}
3.main.c 主文件内容
#include "stm32f10x.h"
#include "bsp_led.h"
#define SOFT_DELAY Delay(0xFFFFF);
void Delay(__IO u32 nCount);
int main(void)
{
LED_GPIO_Config();
while(1)
{
LED_RED;
SOFT_DELAY;
LED_GREEN;
SOFT_DELAY;
LED_BLUE;
SOFT_DELAY;
LED_YELLOW;
SOFT_DELAY;
LED_PURPLE;
SOFT_DELAY;
LED_CYAN;
SOFT_DELAY;
LED_WHITE;
SOFT_DELAY;
LED_RGBOFF;
SOFT_DELAY;
}
}
void Delay(__IO uint32_t nCount)
{
for(; nCount != 0; nCount--);
}
这里就可以让流水灯闪烁起来了。后续等学到PWM后可以得到更好的效果。
|