STM32学习:用寄存器点亮一个LED

一、LED模块电路

LED灯模块 单片机部分.png
LED灯模块 LED部分.png

二、STM32启动文件

启动文件主要功能如下:

  • 初始化堆栈指针 SP;
  • 初始化程序计数器指针 PC;
  • 设置堆、栈的大小;
  • 设置中断向量表的入口地址;
  • 配置外部 SRAM 作为数据存储器(这个由用户配置,一般的开发板可没有外部SRAM);
  • 调用 SystemInit() 函数配置 STM32 的系统时钟;
  • 设置 C 库的分支入口“ __main”(最终用来调用 main 函数) 。

三、编写点亮一个LED程序

#define PERIPH_BASE      ((unsigned int)0x40000000) // block2基地址
#define APB2PERIPH_BASE  (PERIPH_BASE + 0x00010000) // APB2基地址
#define GPIOC_BASE       (APB2PERIPH_BASE + 0x1000) // GPIOC基地址
#define GPIOC_CRL        *(unsigned int*)(GPIOC_BASE+0x00)
#define GPIOC_CRH        *(unsigned int*)(GPIOC_BASE+0x04)
#define GPIOC_IDR        *(unsigned int*)(GPIOC_BASE+0x08)
#define GPIOC_ODR        *(unsigned int*)(GPIOC_BASE+0x0C)
#define GPIOC_BSRR       *(unsigned int*)(GPIOC_BASE+0x10)
#define GPIOC_BRR        *(unsigned int*)(GPIOC_BASE+0x14)
#define GPIOC_LCKR       *(unsigned int*)(GPIOC_BASE+0x18)
#define AHBPERIPH_BASE   (PERIPH_BASE + 0x20000)
#define RCC_BASE         (AHBPERIPH_BASE + 0x1000)
#define RCC_APB2ENR      *(unsigned int*)(RCC_BASE+0x18)    //外设时钟基地址

typedef unsigned int u32;

void SystemInit()
{   
}

void delay(u32 i)
{
    while(i--);
}

int main()
{
    RCC_APB2ENR|=1<<4;  // 开启GPIOC端口时钟
    GPIOC_CRL&=~(0x0F<<(4*0));
    GPIOC_CRL|=(0x03<<(4*0));
    GPIOC_BSRR=(1<<(16+0)); // 点亮LED
    while(1)
    {
        GPIOC_BSRR=(1<<(16+0)); // 点亮LED
        delay(0xFFFFF);
        GPIOC_BSRR=(1<<0);  // 熄灭LED
        delay(0xFFFFF);
    }
}

你可能感兴趣的:(STM32学习:用寄存器点亮一个LED)