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
从而保留了其他位
*/
}
|