[toc] ### 1.晶元手冊中的LED電路圖 ![圖1](https://img-blog.csdnimg.cn/34c2a95aa89c4cbe8a7904429d889564.png) ### 2.官網手冊 ![圖2](https://img-blog.csdnimg.cn/e9b1131d ...
目錄
1.晶元手冊中的LED電路圖
2.官網手冊
3.代碼演示
3.1 stm32f10x.h
頭文件
#ifndef _STM32F10X_H
#define _STM32F10X_H
/*片上外設基地址 */
#define PERIPH_BASE ((unsigned int)0x40000000)
// APB1 匯流排基地址
#define APB1PERIPH_BASE PERIPH_BASE
// APB2 匯流排基地址
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
// AHB 匯流排基地址
#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)
/* GPIOB */
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)
// 埠配置低寄存器 PB0-PB7 配置是輸入還是輸出
#define GPIOB_CRL *(unsigned int*)(GPIOB_BASE+0x00)
// 埠配置高寄存器 PB8-PB15 配置是輸入還是輸出
#define GPIOB_CRH *(unsigned int*)(GPIOB_BASE+0x04)
#define GPIOB_IDR *(unsigned int*)(GPIOB_BASE+0x08)
// 埠輸出數據寄存器 配置PB0-PB15是高電平還是低電平
#define GPIOB_ODR *(unsigned int*)(GPIOB_BASE+0x0C)
#define GPIOB_BSRR *(unsigned int*)(GPIOB_BASE+0x10)
#define GPIOB_BRR *(unsigned int*)(GPIOB_BASE+0x14)
#define GPIOB_LCKR *(unsigned int*)(GPIOB_BASE+0x18)
/* 時鐘埠 */
#define RCC_BASE (AHBPERIPH_BASE + 0x1000)
// GPIOB所在的時鐘埠
#define RCC_APB2ENR (*(unsigned int *)(RCC_BASE + 0X18))
#endif
3.2 點亮綠燈
#include "stm32f10x.h"
void SystemInit(void){
}
int main(void){
// 打開 GPIOB 埠的時鐘
RCC_APB2ENR |= ( (1) << 3 );
// 配置IO口為推輓輸出,這裡將圖2中的CNF0和MODE0都置0
GPIOB_CRL &= ~( (0x0f) << (4*0) );
// 這裡將圖2中的MODE0變成01
GPIOB_CRL |= ( (1) << (4*0) );
// 控制 ODR 寄存器,這行代碼省略也可以使燈亮,這裡將圖3中的ODR0置0
GPIOB_ODR &= ~(1<<0);
while(1);
}
3.3 點亮藍燈
#include "stm32f10x.h"
void SystemInit(void){
}
int main(void){
// 打開 GPIOB 埠的時鐘
RCC_APB2ENR |= ( (1) << 3 );
// 配置IO口為推輓輸出,這裡將圖2中的CNF1和MODE1都置0
GPIOB_CRL &= ~( (0x0f) << (4*1) );
// 這裡將圖2中的MODE1變成01
GPIOB_CRL |= ( (1) << (4*1) );
// 控制 ODR 寄存器,這行代碼省略也可以使燈亮,這裡將圖3中的ODR1置0
GPIOB_ODR &= ~(1<<0);
while(1);
}
3.4 點亮紅燈
#include "stm32f10x.h"
void SystemInit(void){
}
int main(void){
// 打開 GPIOB 埠的時鐘
RCC_APB2ENR |= ( (1) << 3 );
// 配置IO口為推輓輸出,這裡將圖2中的CNF5和MODE5都置0
GPIOB_CRL &= ~( (0x0f) << (4*1) );
// 這裡將圖2中的MODE5變成01
GPIOB_CRL |= ( (1) << (4*1) );
// 控制 ODR 寄存器,這行代碼省略也可以使燈亮,這裡將圖3中的ODR5置0
GPIOB_ODR &= ~(1<<0);
while(1);
}
3.5 LED燈閃爍,綠燈閃爍 。
#include "stm32f10x.h"
typedef unsigned int uns32_t;
void SystemInit(void){
}
void delay(uns32_t count)
{
for( ; count !=0; count-- );
}
int main(void){
// 打開 GPIOB 埠的時鐘
RCC_APB2ENR |= ( (1) << 3 );
// 配置IO口為輸出
GPIOB_CRL &= ~( (0x0f) << (4*0) );
GPIOB_CRL |= ( (1) << (4*0) );
// 控制 ODR 寄存器
GPIOB_ODR &= ~(1<<0);
while(1){
GPIOB_ODR &= ~(1<<0);
delay(0xFFFFF);
GPIOB_ODR |= (1<<0);
delay(0xFFFFF);
}
}
3.6 紅綠藍三色LED燈切換閃爍
#include "stm32f10x.h"
// 綠燈對應的是PB0
#define GREEN_LED (0)
// 藍燈對應的是PB1
#define BLUE_LED (1)
// 紅燈對應的是PB5
#define RED_LED (5)
typedef unsigned int uns32_t;
void open_port(int n){
/* 配置埠輸出,PBn 0100 -> 0011 */
// MODEn[1:0]:00 -> 11
GPIOB_CRL |= ( 3 << (4*n) );
// CNFn[1:0]:01 -> 00
GPIOB_CRL &= ~( 3 << (4*n+2) );
}
void close_port(int n){
/* 複位埠,PBn 0011 -> 0100 */
// MODEn[1:0]:00 -> 11
GPIOB_CRL &= ~( 3 << (4*n) );
// CNFn[1:0]:01 -> 00
GPIOB_CRL |= ( 1 << (4*n+2) );
}
void SystemInit(void){
}
void delay(uns32_t count)
{
for( ; count !=0; count-- );
}
void blue(){
// 綠燈關
close_port(GREEN_LED);
// 藍燈開
open_port(BLUE_LED);
}
void green(){
// 紅燈關
close_port(RED_LED);
// 綠燈
open_port(GREEN_LED);
}
void red(){
// 藍燈關
close_port(BLUE_LED);
// 紅燈開
open_port(RED_LED);
}
int main(void){
/* 打開 GPIOB 埠的時鐘 */
RCC_APB2ENR |= ( (1) << 3 );
/* 配置埠輸出,PB5 0100 -> 0011 ,這裡配置的是紅燈開 */
// MODE5[1:0]:00 -> 11
GPIOB_CRL |= ( 3 << (4*5) );
// CNF5[1:0]:01 -> 00
GPIOB_CRL &= ~( 3 << (4*5+2) );
while(1){
delay(0xfffff);
green();
delay(0xfffff);
blue();
delay(0xfffff);
red();
}
}