嵌入式学习

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工作方式,从而达到小灯闪烁的效果。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值