指南者 stm32f103VET6
GPIO输出初始化
1.选定具体的GPIO
2.配置GPIO的工作模式
3.控制GPIO输出高低电平(ODR,BRR,BSRR)
一. 查看原理图

确定点亮 绿灯PB0
即GPIOB0
二.查看相应寄存器

GPIOB 基地址为0X4001 0C00
复位时钟总线为0X40021000
三.寄存器配置
1.时钟使能

区别于51单片机,32要自行打开时钟控制,否则无法进行数据传输
//打开APB2的时钟使能
//时钟 0X4002 1000
//GPIOB在位3 置1
*(unsigned int *)0X40021018 |= (1<<3); //(1<<3)等同0X08
2.端口配置

首先继续端口配置低寄存器(GPIO(7-0)属于低寄存器;GPIO(15-8)属于高寄存器;)
选择推挽输出模式 ; 输出模式,最大速度10Mhz;即0001
因为低寄存器偏移地址为0x00 ,所以0x40010C00+0x00=0x40010C00
因为GPIOB0 ,所以置位偏移0(如果点亮红灯PB5,则需要偏移(1<<(5*4))CNF加MODE为4位)
//GPIOB0 0X40010C00
//端口配置低寄存器 偏移0 推挽输出 10M 0001
*(unsigned int*)0X40010C00 |= (1<<0); //(1<<0)等同0X01
3.端口输出数据配置
要使灯点亮,根据原理图可知要输出低电平
//端口输出数据寄存器 (输出低电平)
*(unsigned int*)0X40010C0C &= ~(1<<0);
三.demo.红灯绿灯交替闪烁
??效果正确,端口配置低寄存器,先配置绿灯,后配置红灯,并没有把配置的绿灯口覆盖,表示疑问,有待解决
#include "stm32f10x.h"
// &= ~ 置0
// |= 置1
void soft_delay(unsigned int count)
{
for(;count != 0;count--);
}
int main(void)
{
//打开APB2的时钟使能
//时钟 0X4002 1000
//GPIOB在位3 置1
*(unsigned int *)0X40021018 |= (1<<3); //(1<<3)等同0X08
//GPIOB0 0X40010C00 绿灯
//端口配置低寄存器 偏移0 推挽输出 10M 0001
*(unsigned int*)0X40010C00 |= (1<<0); //(1<<0)等同0X01
//GPIOB5 0X40010C00 红灯
//端口配置低寄存器 偏移5*4 推挽输出 10M 0001
*(unsigned int*)0X40010C00 |= (1<<(5*4)); //(1<<0)等同0X01
while(1){
//端口输出数据寄存器 (输出低电平)绿灯开
*(unsigned int*)0X40010C0C &= ~(1<<0);
soft_delay(0Xfffff);
//端口输出数据寄存器 (输出低电平)绿灯灭
*(unsigned int*)0X40010C0C |= (1<<0);
soft_delay(0Xfffff);
//端口输出数据寄存器 (输出低电平)红灯开
*(unsigned int*)0X40010C0C &= ~(1<<5);
soft_delay(0Xfffff);
//端口输出数据寄存器 (输出低电平)红灯灭
*(unsigned int*)0X40010C0C |= (1<<5);
soft_delay(0Xfffff);
}
}
void SystemInit(void) //此函数为固件库初始化函数 外部晶振为8M,
//通过此函数调内部锁相环倍频成72M
{
/* 函数体为空,目的不报错 */
}
三.直接操作寄存器控制IO---------------------------------
(为结合按键,翻转状态)
带参宏 ^ 异或

版权声明:本文为qq_44370382原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。