一、实验目的
控制开发板上的两个LED实现类似跑马灯的效果;
通过该实验,可以初步掌握STM32基本I/O口的使用。
二、STM32的I/O口可以由软件配置成8种模式:输入浮空、输入上拉、输入下拉、模拟输入、开漏输出、推挽输出、推挽式复用功能、开漏复用功能。
三、STM32的I/O端口寄存器
1、每个端口I/O端口都有7个寄存器
分别是:配置模式的2个32位的端口配置寄存器CRL和CRH;
一个32位的置位/复位寄存器BSRR;
一个16位的复位寄存器BRR;
一个32位的锁存寄存器LCKR;
主要学习一些常用的寄存器,即CRL、CRH、IDR、ODR。
2、CRH和CRL作用完全一样,只是CRL控制的是低8位输出口,而CRH控制的是高8位输出口。
实例:比如我们要设置 PORTC 的 11 位为上拉输入, 12 位为推挽输出。代码如下:
GPIOC->CRH&=0XFFF00FFF; //清掉这 2 个位原来的设置,同时也不影响其他位的设置 GPIOC->CRH|=0X00038000; //PC11 输入, PC12 输出 GPIOC->ODR=1<<11; //PC11 上拉
通过这三句话,设置了PC11为上拉输入,PC12为推挽输出。
3、IDR是一个端口输入数据寄存器,只用了低16位。
4、ODR是一个端口输出数据寄存器,也只用了低16位。
5、led.c文件代码:
#include "led.h" //初始化 PB5 和 PE5 为输出口.并使能这两个口的时钟 //LED IO 初始化 void LED_Init(void) { RCC->APB2ENR|=1<<3; //使能 PORTB 时钟 RCC->APB2ENR|=1<<6; //使能 PORTE 时钟 GPIOB->CRL&=0XFF0FFFFF; GPIOB->CRL|=0X00300000;//PB.5 推挽输出 GPIOB->ODR|=1<<5; //PB.5 输出高 GPIOE->CRL&=0XFF0FFFFF; GPIOE->CRL|=0X00300000;//PE.5 推挽输出 GPIOE->ODR|=1<<5; //PE.5 输出高 }
6、led.h文件代码:
#ifndef __LED_H#define __LED_H#include "sys.h"//LED 端口定义#define LED0 PAout(8) // PA8#define LED1 PDout(2) // PD2void LED_Init(void); //初始化#endif
7、main函数代码:
#include "sys.h" #include "delay.h" #include "led.h" int main(void) { Stm32_Clock_Init(9); //系统时钟设置 delay_init(72); //延时初始化 LED_Init(); //初始化与 LED 连接的硬件接口 while(1) { LED0=0; LED1=1; delay_ms(300); LED0=1; LED1=0; delay_ms(300); } }