STM32寄存器点亮LED灯

本文介绍了STM32F10x系列微控制器中GPIO外设的基础配置,包括外设和总线基地址定义,以及GPIOB的寄存器基地址和相关操作。在`main`函数中展示了如何开启GPIOB时钟,设置GPIOB的输出模式及输出电平,通过修改GPIOB_CRL和GPIOB_ODR寄存器来控制引脚状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

stm32f10x.h

/* 外设基地址 */
#define PERIPH_BASE                ((unsigned int)0x40000000)

/*  总线基地址  */
#define APB1PERIPH_BASE            PERIPH_BASE
#define APB2PERIPH_BASE            (PERIPH_BASE + 0x10000)



///* GPIO 外设基地址 */
//#define GPIOA_BASE                 (APB2PERIPH_BASE + 0x0800)
 #define GPIOB_BASE                 (APB2PERIPH_BASE + 0x0C00)
//#define GPIOC_BASE                 (APB2PERIPH_BASE + 0x1000)
//#define GPIOD_BASE                 (APB2PERIPH_BASE + 0x1400)
//#define GPIOE_BASE                 (APB2PERIPH_BASE + 0x1800)
//#define GPIOF_BASE                 (APB2PERIPH_BASE + 0x1C00)
//#define GPIOG_BASE                 (APB2PERIPH_BASE + 0x2000)

/* 寄存器基地址,以GPIOB为例*/

#define GPIOB_CRL 	 	 *(unsigned int*)(GPIOB_BASE+0x00)
#define GPIOB_CRH 	 	 *(unsigned int*)(GPIOB_BASE+0x04)
#define GPIOB_IDR 	 	 *(unsigned int*)(GPIOB_BASE+0x08)
#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 AHBPERIPH_BASE            (PERIPH_BASE + 0X20000)
#define RCC_BASE                  (AHBPERIPH_BASE + 0x1000)
#define  RCC_APB2ENR               *(unsigned int*)(RCC_BASE+0X18)


mai.c

#include "stm32f10x.h"

void SystemInit()
{
	
}
int  main(void)

{
  RCC_APB2ENR|=1<<3; //开启RCC_APB2gpioB时钟  
  
//CRL控制低8位引脚输出模式
  GPIOB_CRL &= ~( 0x0F<< (4*5));//(4*5)设置要控制的引脚位为0000    通用推挽输出模式
  
	GPIOB_CRL |= (3<<4*5);   //设置3=11 输出最大速度50MHZ  4*5表示要控制哪个位
                           //GPIOB_CRL是控制低八位引脚,GPIOB_CRH是控制高八位引脚
//  GPIOB_BSRR=(1<<(16+5));  //控制哪个引脚,低16=1是高电平,高16=1是低电平
GPIOB_ODR&=~(1<<5);       //还有ODR是直接对哪个引脚置1或者0,1为高电平,0为低电平
//GPIOB_ODR|=(1<<5);
 
/* 其中
GPIOB_ODR 初始值为0x0000 0000

GPIOB_ODR &= ~(1<<5);   分三步
1. 左移 1 << 4 = 0001 0000
2. 取反 ~1 << 5= 1110 1111
3. 按位与,若GPIOB_ODR初值为0x1111 1111
   1111 1111
   1110 1111
——————————————
   1110 1111
 从而保留了其他位
 
GPIOB_ODR |= (1<<5);   
1. 左移 1 << 5 = 0001 0000
2. 按位或,若GPIOB_ODR初值为0x0000 0000
   0000 0000
   0001 0000
——————————————
   0001 0000
 从而保留了其他位
*/



}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值