STM32
直播中

李红

7年用户 1211经验值
私信 关注
[问答]

如何使用寄存器点亮第一个LED?

如何使用寄存器点亮第一个LED?

回帖(1)

王燕

2021-11-30 15:07:36
一、LED模块电路
  所使用的的LED模块为共阳极
        
  

  
      LED模块电路图      
  二、STM32启动文件
  对于启动文件这部分我们主要总结它的功能,不详细讲解里面的代码,其功能如下:
  1、初始化堆栈指针SP;
  2、初始化程序计数器指针PC;
  3、设置堆、栈的大小;
  4、设置中断向量表的入口地址;
  5、配置外部SRAM作为数据存储器(这个由用户配置,一般的开发板可没有外部SRAM) ;
  6、调用SystemInit () 函数配置STM32的系统时钟。设置C库的分支入口“_main”(最终用来调用main函数);
启动文件startup_stm32f10x_hd.s在安装目录中有,可以手动查找,添加到工程目录中。启动文件都是用汇编语言编写的。
  三、编写点亮一个LED程序
  我们所要实现的功能是:点亮第一个LED,即D1指示灯亮要操作STM32寄存器,我们就需要使用C语言对其封装,这部分程序我们都放在stm32f10x.h中。
  由电路图可知LED1连接的是PC0端口,我们要将PC0端口置零,则导通,LED灯亮起
首先找到GPIO是挂载到那一条总线上,即Block2总线,所有的片内外设都在Block2上面
  
#define PERIPH_BASE ((unsigned int)0x40000000)
#define APB2PERIPH_BASE (PERIPH_BASE +0x00010000)
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
#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*)(GPTOC_BASE+0x14)
#define GPIOC_LCKR *(uunsigned int*)(GPIOC_BASE+0x18)
#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)
#define RCC_BASE (AHBPERIPH_BASE + 0x1000)
#define RCC_APB2ENR *(unsigned int*)(RCC_BASE+0x18)
  在对任何外设进行操作前,一定要开启对应外设的时钟,只有开启了时钟,才能对外设进行设置。
  如果编码时,Keil5写注释汉字显示为??,可以百度https://jingyan.baidu.com/article/7082dc1c281faee40a89bda1.html进行更改设置

#include "stm32f10x.h"

void SystemInit()
{
       
}

int main()
{
        //1.开启GPIOC的端口时钟
        RCC_APB2ENR |=1<<4;//或运算是为了防止对其它位的干扰
       
        //2.设置工作模式
        //推挽输出
        GPIOC_CRL&=~(unsigned)(0x0f<<(4*0));//4*0表示第0个管脚,第一个管脚就是4*1,每四位控制一个引脚
        GPIOC_CRL|=(0x03<<(4*0));//设置输出模式为50MHz
       
        //3.设置引脚输出为0,点亮LED
        GPIOC_BSRR=(0x1<<(16+0));
        while(1)
        {
               
        }       
}
注意在输出中可以查看编译文件的大小:
  
  
举报

更多回帖

发帖
×
20
完善资料,
赚取积分