stm32寄存器点亮RGB LED灯

1. 项目:

   使用野火stm32指南者开发板寄存器点亮RGB LED灯。

2. 代码:

  main.c

  

#include "stm32f10x.h"
int main(void)
{
/*操作寄存器绝对地址*/
    *(unsigned int *)0x40021018 |= ((1)<<3);                    //打开GPIO端口时钟
    *(unsigned int *)0x40010c00 &= ~((0x0f)<<(4*0));    //将PB0口电平清零
    *(unsigned int *)0x40010c00 |= ((1)<<(4*0));            //配置PB0为通用推挽输出,速度为10MHz(即CRL最低四位设置为0001)
    *(unsigned int *)0x40010c0c &= ~(1<<0);                        //控制PB0输出低电平
}

void SystemInit(void)
{
    //函数体为空,目的是为了骗过编译器报错
}

 

stm32f10x.h

  新建即可,不需要添加代码

3. 执行结果:此代码只点亮绿灯

  stm32寄存器点亮RGB LED灯

 

 

 

 方法二

4. 代码:

  main.c

  

#include "stm32f10x.h"
int main(void)
{
    /*寄存器映射*/
    RCC_APB2ENR |= ((1)<<3);                    //打开GPIO端口时钟
    GPIOB_CRL &= ~((0x0f)<<(4*0));        //将PB0口电平清零
#if 1
    //点亮绿灯
    //配置PB0为通用推挽输出,速度为10MHz(即CRL最低四位设置为0001)
    GPIOB_CRL |= ((1)<<(4*0));
#elif 0
    //点亮蓝灯
    //配置PB1为通用推挽输出,速度为10MHz(即CRL的bit4/bit5/bit6/bit7四位设置为0001)
    GPIOB_CRL |= ((1)<<(4*1));
#else
    //点亮红灯
    //配置PB5为通用推挽输出,速度为10MHz(即CRL的bit16/bit17/bit18/bit19四位设置为0001)
    GPIOB_CRL |= ((1)<<(4*5));    
#endif
    GPIOB_ODR &= ~(1<<0);                            //控制PB0输出低电平
}



void SystemInit(void)
{
    //函数体为空,目的是为了骗过编译器报错
}

 

  stm32f10x.h

  

//外设 peripheral

#define PERIPH_BASE                                ((unsigned int)0x40000000)
#define APB1PERIPH_BASE                        PERIPH_BASE
#define APB2PERIPH_BASE                        (PERIPH_BASE + 0x10000)
#define AHBPERIPH_BASE                        (PERIPH_BASE + 0x20000)

#define RCC_BASE                            (AHBPERIPH_BASE + 0x1000)
#define GPIOB_BASE                        (APB2PERIPH_BASE + 0x0c00)

#define RCC_APB2ENR                        *(unsigned int *)(RCC_BASE + 0x18)
    
#define GPIOB_CRL                            *(unsigned int *)(GPIOB_BASE + 0x00)
#define GPIOB_CRH                            *(unsigned int *)(GPIOB_BASE + 0x04)
#define GPIOB_ODR                            *(unsigned int *)(GPIOB_BASE + 0x0c)

执行结果:

  设置if-else语句可以分别点亮红绿蓝三种颜色的灯。

点亮绿灯 点亮蓝灯 点亮红灯
if 1 if 0 if 0
elif 0 elif 1 elif 0
else else else
endif endif emdif

 

 

 

   

stm32寄存器点亮RGB LED灯

 

 

stm32寄存器点亮RGB LED灯

 

 

参考资料:

  1. 原理图

  stm32寄存器点亮RGB LED灯

 

   2. 这里的CRL只配置PB或者PA....PG等口的0到7口,8到15口由CRH控制。

    只有设置MODE[1:0]>00时才可以设置为输出口功能。

    每4位对应一个PB口,例如bit0,bit1,bit2,bit3控制PB0口,以此类推。

    控制GPIOB口的输出模式和速度主要靠设置CRL或CRH的位来控制。

  stm32寄存器点亮RGB LED灯

 

   3. 控制PB0输出低电平。

  stm32寄存器点亮RGB LED灯

 

上一篇:springboot使用拦截器


下一篇:【muduo/base】线程