高电平低电平都可以输出
只能输出低电平
VSS GND
配置工作模式:推挽 开漏 复用
控制GPIO:高低电平
立即数寻址方式主要用来给寄存器或存储单元赋值
stm32f10x.h
// 外设 peripheral
#define PERIPH_BASE ((unsigned int )0x40000000)
#define APB1_PERIPH_BASE PERIPH_BASE
#define APB2_PERIPH_BASE (PERIPH_BASE + 0x10000)
#define AHB_PERIPH_BASE (APB2_PERIPH_BASE + 0x10000)
#define RCC_BASE (AHB_PERIPH_BASE + 0x1000)
#define GPIOA_BASE (APB2_PERIPH_BASE + 0x0800)
#define RCC_APB2ENR *(unsigned int*)(RCC_BASE + 0x18)
#define GPIOA_CRL *(unsigned int*)(GPIOA_BASE + 0x00)
#define GPIOA_CRH *(unsigned int*)(GPIOA_BASE + 0x04)
#define GPIOA_ODR *(unsigned int*)(GPIOA_BASE + 0x0C)
main.c
#include "stm32f10x.h"
int main(void)
{
#if 0
//打开GPIOA端口的时钟
*(unsigned int *)0x40021018 |= ( (1) << 2);
//配置 IO口 为输出
*(unsigned int *)0x40010804 &= ~( (0c0f) << (4*0) ); //先清零
*(unsigned int *)0x40010804 |= ( (1) << (4*0) );
//控制 ODR 寄存器
*(unsigned int *)0x4001080C &= ~(1<<7);
#else
//打开GPIOA端口的时钟
RCC_APB2ENR |= ( (1) << 2);
//配置 IO口 为输出
GPIOA_CRH |= ( (1) << (4*0) );
//控制 ODR 寄存器
GPIOA_ODR &= ~(1<<7);
#endif
}
void SystemInit(void)
{
// 函数体为空 目的是骗过编译器不报错
}