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輸出低電平。