前言
- 由于当初没有学好51单片机,导致现在学32困难重重。听老师讲课,感觉自己就在外太空。下面通过跑马灯的例子,串串知识点。
简单了解GPIO
-
战舰、精英版(stm32f103zet6)都是144脚芯片,有七组IO,GPIOA——GPIOG,每组IO有16个io,一共有16*7=112个io
-
迷你版(STM32F103RCT6),一共有四组IO口,一共有16*3+3个io
GPIOA0——GPIOA15
GPIOB0——GPIOB15
GPIOC0——GPIOC15
GPIOD0——GPIOD2 -
GPIO工作方式
四种输入模式
输入浮空
输入上拉
输入下拉
模拟输入
四种输出模式
开漏输出 (只可以输出强低电平,高电平得靠外部电阻拉高)
开漏复用功能
推挽式输出 (可以输出强高低电平,连接数字器件)
推挽式复用功能
三种最大翻转速度
-2MHZ
-10MHz
-50MHz
每组GPIO端口的寄存器包括:
两个32位配置寄存器(GPIOx-CRL,GPIOx-CRH),
两个32位数据寄存器(GPIOx-IDR,GPIO-ODR),(均用到低16位,高16位保留。控制16个io )一个32位置位/复位寄存器(GPIOx-BSRR), 主要是控制ODR寄存器
一个16位复位寄存器(GPIOx_BRR),
一个32位锁定寄存器(GPIOx-LCKR)。每个I/o端口位可以自由编程,然而I/o端口寄存器必须换32位字被访问
(不允许半字或字节访问)
stm32 引脚说明
STM32的大部分端口都具有复用功能。
所谓复用,就是一些端口不仅仅可以作为通用IO口,还可以复用一些
外设引脚,比如PA9,PA10可以复用为STM32的串口1引脚
作用:最大限度的利用端口资源端口重映射功能
就是可以把某些功能引脚映射到其他引脚。
比如串口1默认引脚是PA9,PA10可以通过配置重映射映射到PB6,PB7
作用:方便布线。所有的IO口都可以作为中断输入
跑马灯代码
- led.h头文件
#ifndef __LED_H
#define __LED_H
void LED_Init(void);
#endif
- led.c源文件
#include "led.h"
#include "stm32f10x.h"
void LED_Init(void){
RCC->APB2ENR|=1<<3; //A=A|B ,设置IO端口B的时钟开启
RCC->APB2ENR|=1<<6; //A=A|B ,设置IO端口E的时钟开启
//GPIOB.5
GPIOB->CRL&=0xFF0FFFFF; //先清零,与0
GPIOB->CRL|=0x00300000; //设置工作模式为推挽输出,50MHZ
GPIOB->ODR|=1<<5; //初始化PB5为高电平
GPIOE->CRL&=0xFF0FFFFF; //先清零,与0
GPIOE->CRL|=0x00300000; //设置工作模式为推挽输出,50MHZ
GPIOE->ODR|=1<<5; //初始化PE5为高电平
}
- main.c
#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
int main(void)
{
delay_init();
LED_Init();
while(1){
GPIOB->ODR|=1<<5; //设置PB5为高电平
GPIOE->ODR|=1<<5; //设置PE5为高电平
delay_ms(500);
GPIOB->ODR&=~(1<<5); //设置PB5为低电平
GPIOE->ODR&=~(1<<5); //设置PE5为低电平
delay_ms(500);
}
}