1.硬件电路
由硬件电路图可知,LED0对应端口PB5
通过此图可知,当PB5口清零时,LED0就会亮起。
2.地址操作
int main()
{
//打开GPIOB端口时钟
*(unsigned int*)0x40021018 |= (1<<3);
//配置PB5为输出模式
*(unsigned int*)0x40010C00 &= ~((0x0f)<<(5*4));
*(unsigned int*)0x40010C00 |= ((1)<<(5*4));
//使得PB5_ODR=0,PB5端口置为0
*(unsigned int*)0x40010C0C &= ~(1<<5);
}
PB5端口清零分为三步:
- 打开端口时钟RCC(挂在AHB总线上)
- 配置对应端口为输出模式
- 将端口输出为0
3.寄存器操作
#include "stm32f10x.h"
#define RCC_PB2ENR *(unsigned int*)(RCC_BASE + 0x18)
#define GPIOB_CRL *(unsigned int*)GPIOB_BASE
#define GPIOB_ODR *(unsigned int*)(GPIOB_BASE + 0x0C)
#define GPIOB_BSRR *(unsigned int*)(GPIOB_BASE + 0x10)
#define GPIOB_BRR *(unsigned int*)(GPIOB_BASE + 0x14)
#include "stm32f10x.h"
int main()
{
//打开GPIOB端口时钟
RCC_PB2ENR |= (1<<3);
//配置PB5为输出模式
GPIOB_CRL &= ~((0x0f)<<(5*4));
GPIOB_CRL |= ((1)<<(5*4));
//使得PB5_ODR=0,PB5端口置为0
GPIOB_ODR &= ~(1<<5);
//PB5端口置为0也可以使用位清零寄存器
//GPIOB_BRR |= (1<<5);
}
4.固件库编程
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
int main(void)
{
//开启GPIOB时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//GPIOB初始化
{
GPIO_InitTypeDef GPIOB_Struct;
GPIOB_Struct.GPIO_Pin = GPIO_Pin_5;
GPIOB_Struct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIOB_Struct.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOB, &GPIOB_Struct);
}
//点亮LED0
GPIO_ResetBits(GPIOB, GPIO_Pin_5);
}