使用STM32mini开发板(正点原子)
通过对GPIO口的控制达到跑马灯的实验要求
什么是跑马灯?
本实验中的跑马灯即两个设计在开发板上面的两个LED灯,在STM32mini开发板(正点原子)中接入的IO口为:
LED_0: PA8
LED_1: PD2
GPIO的相关复习
- 4种输入模式:
输入浮空
输入上拉
输入下拉
模拟输入 - 4种输出模式:
开漏输出(带上拉或下拉)
开漏复用(带上拉或下拉)
推挽式输出(带上拉或下拉)
推挽式复用功能(带上拉或下拉) - 3种最大输出速度:
-2MHz
-10MHz
-50MHz
每一组IO口含有10个寄存器,也就是说10个寄存器可以控制一组GPIO口,一组GPIO口有16个IO口。
- 2个32位配置寄存器:GPIOx_CRL, GPIOx_CRH
- 2个32位配置寄存器:GPIOx_IDR, GPIOx_ODR
- 一个32位置位/复位寄存器:GPIOx_BRSS
- 一个16位复位寄存器: GPIOx_BRR
- 一个32位锁存寄存器:GPIOx_LCKR
假设一个芯片有8个GPIO口,那么它就会有80个寄存器(8×10),128个 IO 口(8×16)
跑马灯硬件连接
GPIO的输出方式为:推挽输出(上拉)
实验步骤及程序
- 使能IO口时钟。配置相关寄存器:
RCC->APB2ENR
- 初始化IO口模式,配置四个配置寄存器:
GPIOx_CRH / GPIOx_CRL
- 操作IO口,输出高低电平。配置寄存器
GPIOx_ODR 或者 BSRRL / BSRRH
Tip:使用#ifndef #define #endif 格式条件编译,作用是避免头文件内容重复定义
程序:
主函数:main.c
#include "led.h"
#include "stm32f10x.h"
int main(void)
{
LED_Init();
}
头文件:led.h
#ifndef __LED_H
#define __LED_H
void LED_Init(void);
#endif
LED初始化文件:led.c
#include "led.h"
#include "stm32f10x.h"
void LED_Init(void)
{
//PA8
RCC->APB2ENR|=1<<2; //时钟使能
GPIOA->CRH &= ~(0x3); //清零
GPIOA->CRH |=0x3; //选择A的8口为推挽输出,且输出速度为50MHz
GPIOA->ODR |=1<<8; //关灯命令
GPIOA->ODR &=~(1<<8); //点灯命令
//PD2
RCC->APB2ENR|=1<<5;
GPIOD->CRL &= ~(0xF<<2*4);
GPIOD->CRL |=0x3<<2*4;
GPIOD->ODR |=1<<2;
GPIOD->ODR &=~(1<<2);
}