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. 执行结果:此代码只点亮绿灯
方法二
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 |
参考资料:
1. 原理图
2. 这里的CRL只配置PB或者PA....PG等口的0到7口,8到15口由CRH控制。
只有设置MODE[1:0]>00时才可以设置为输出口功能。
每4位对应一个PB口,例如bit0,bit1,bit2,bit3控制PB0口,以此类推。
控制GPIOB口的输出模式和速度主要靠设置CRL或CRH的位来控制。
3. 控制PB0输出低电平。