STM32F103ZET6之初体验——闪烁点亮led灯
前言
新手一枚,想记录一下自己用keil独立编写的第一个小程序,如有错误多多包容。
一、怎样在keil创建新项目以及配置相关编译环境?
步骤如下:
1.创建一个文件夹,用于存放工程项目文件
2.点击project->new.....
3.选择我们提前创建好的文件夹,给自己的文件创建一个名字,然后点击保存,即可成功创建一个新项目,然后选择开发板,这里我们选择系列
这个页面直接叉掉
4.开始配置
全部配置完以后一定要点击OK进行确认
5.在项目中添加文件
添加完成后文件就会全部出现在这里
二、开始项目
1.STM32F103ZET6开发板原理图
LED灯
实验中用到的LED0,LED1分别对应GPIOB5和GPIOE5,并且根据电路分析可以使用推挽输出或开漏输出(本次使用推挽输出),输出高电平,小灯灭,输出低电平,小灯亮。
2.编写代码
项目结构
stm32f10x.h
#ifndef __STM32F10X_H
#define __STM32F10X_H
typedef unsigned int uint32_t;
typedef unsigned short int uint16_t;
typedef enum{LED_ON,LED_OFF}LEDState;
#define LED0 0
#define LED1 1
typedef struct{
volatile uint32_t CRL;
volatile uint32_t CRH;
volatile uint32_t IDR;
volatile uint32_t ODR;
volatile uint32_t BSRR;
volatile uint32_t BRR;
volatile uint32_t LCKR;
}GPIOE_TypeDef;
#define PERIPH_BASE ((unsigned int)0x40000000)//外设基地址
#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000)//APB2基地址
#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800)//GPIOE基地址
#define GPIOE ((GPIOE_TypeDef*)GPIOE_BASE)
typedef struct{
volatile uint32_t CRL;
volatile uint32_t CRH;
volatile uint32_t IDR;
volatile uint32_t ODR;
volatile uint32_t BSRR;
volatile uint32_t BRR;
volatile uint32_t LCKR;
}GPIOB_TypeDef;
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)//GPIOB基地址
#define GPIOB ((GPIOB_TypeDef*)GPIOB_BASE)
#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)
#define RCC_BASE (AHBPERIPH_BASE + 0x1000)
#define RCC_APB2ENR *(unsigned int*)(RCC_BASE+0x18)
/*
#define RCC_BASE ((unsigned int)0x4002 1000)
#define RCC_APB2ENR *(unsigned int*)(RCC_BASE+0x18)
*/
#endif
led.h:
#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h"
void LedInit(void);
void LedEnable(uint16_t led_no,LEDState s);
#endif
led.c:
#include "led.h"
void LedInit(void){
//初始化LED0---->PB5
RCC_APB2ENR |= 1<<3;//使能PE
GPIOB->CRL &= ~( 0x0F<< (4*5));
GPIOB->CRL |= (3<<4*5);//推挽输出
GPIOB->BRR=(1<<5);//置位
//初始化LED1---->PE5
RCC_APB2ENR |= 1<<6;//使能PE
GPIOE->CRL &= ~( 0x0F<< (4*5));
GPIOE->CRL |= (3<<4*5);//推挽输出
GPIOE->BSRR=(1<<5);//置位
}
void LedEnable(uint16_t led_no,LEDState s){
switch(led_no){
case 0:
if(s == LED_ON)
GPIOB->BRR=(1<<5);
else
GPIOB->BSRR=(1<<5);
break;
case 1:
if(s == LED_ON)
GPIOE->BRR=(1<<5);
else
GPIOE->BSRR=(1<<5);
break;
default: break;
}
}
main.c
#include "stm32f10x.h"
#include "led.h"
//typedef unsigned int u32; //类型重定义 unsigned int -- u32
void SystemInit(void)
{
}
/*******************************************************************************
* 函数名 : delay
* 函数功能 : 延时函数,通过while循环占用CPU
* 输入 : i
* 输出 : 无
*******************************************************************************/
void delay(uint32_t i)
{
while(i--);
}
/*******************************************************************************
* 函数名 : main
* 函数功能 : 主函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
int main()
{
LedInit();
while(1)
{
//小灯闪烁
LedEnable(0,LED_ON);
LedEnable(1,LED_OFF);
delay(0xFFFFF);
LedEnable(1,LED_ON);
LedEnable(0,LED_OFF);
delay(0xFFFFF);
}
}
3.编译运行
点击rebuild进行编译
编译成功后,Obj文件夹里会出现.hex文件,这个文件就是可以烧录在我们的开发板里的啦。
总结
作为大部学习嵌入式的伙伴入门必写的一个小项目,总体来说这个项目的目的就在于让新手初步学会如何阅读开发板原理图和手册,并理解怎么样通过结合LED小灯的电路结构选择合适的GPIO工作方式,从而达到小灯闪烁的效果。