您的位置 首页 硬件

根据STM32单片机对跑马灯的操控

基于STM32单片机对跑马灯的控制-首先要知道普通的IO就两种功能一个为输入,一个为输出。然后再以输入和输出细分为以哪种模式输出、以哪种模式输入。要设置IO的模式这时就要使用到寄存器进行设置,STM32的IO端口一般由7个寄存器来进行控制。

依据学习STM32有一段时刻了,特意写下一篇关于一个简略的跑马灯

的例程,整理思路,也期望我自己的了解能帮到一些学习STM32的初学者

//======================================================//

首要,GPIO的装备品种有8种。别离为模仿输入、浮空输入,上拉输入、下拉输入、开漏输出、推挽输出、复用开漏输出、复用推挽输出。

下面将以实例的方法解说GPIO的设置及完结进程。

案例1:跑马灯试验

跑马灯试验的功用:LED灯进行有规则闪耀。(下面的LED灯的数量都为2个,所以关于寄存器的装备也将以两组的方法进行解说)

首要要知道一般的IO就两种功用一个为输入,一个为输出。然后再以输入和输出细分为以哪种形式输出、以哪种形式输入。要设置IO的形式这时就要运用到寄存器进行设置,STM32的IO端口一般由7个寄存器来进行操控。

别离为

(1)装备形式的2个32位的端口装备寄存器 CRL 和 CRH;

(2)2 个 32 位的数据寄存器 IDR 和 ODR;

(3)1 个 32 位的置位/复位寄存器BSRR;

(4)1个 16 位的复位寄存器 BRR;

(5)1 个 32 位的锁存寄存器 LCKR;

而咱们常用的 IO 端口寄存器只要 4 个:CRL、CRH、IDR、ODR。

首要,一般一个程序的开端都会从进口main函数开端履行,而一个功用的完结之前都需求做一些准备作业,当然跑马灯也不破例,在程序履行前,IO需求初始化,而初始化要做的便是对程序需求用到的GPIO的寄存器进行装备。然后设定输出设备的初始状况,即跑马灯的初始状况。一般程序在履行前,输出设备都会是处于封闭状况。最终添加延时函数,让LED灯在亮与灭之间有一段时刻的状况保存,否则时刻过快,人类的视觉底子捕抓它的状况改变。

下面来讲一下完结跑马灯作用的IO要怎样装备。首要先说一下运用LED来进行跑马功用的话只需求用到RCC-》APB2ENR、GPIOX-》CRL、GPIOX-》ODR三个寄存器(GPIOX中的X表明为GPIO的组别,例如GPIOB表明在GPIO的B组上,由于一般单片机上的GPIO一般都会有很多组的,这样也仅仅为了区别这些IO算了)

CRL 和 CRH 操控着每个 IO 口的形式及输出速率。

这儿需求留意的是在装备GPIO前,都需求先使能该GPIO的时钟!(或许有人会问“为什么必定要是使能时钟呢?”答案是:GPIO也是外设的一种,然后外设是需求供给时钟信号作业,以便于设置GPIO的数据传输速度的高速/低速输出,所以有关数据的传输都是在时钟信号的基础上的。51单片的IO口也有时钟,仅仅为了便利,默许敞开的,ST的为了更好的操控功耗,电路上做的能够挑选开关时钟,下降功耗。弥补网友的答案:“寄存器是依据触发器的,触发器的赋值是必定需求时钟的,而寄存器的时钟是由总线时钟供给的,便是说没有总线时钟的话,你给寄存器值它是不会读入的”)

然后设置两个LED的GPIO的形式,由于LED是输出设备,所以GPIO将设置成输出形式,其间装备形式要用到的寄存器为装备寄存器CRL和CRH。其间CRH为高位寄存器,CRL为低位寄存器。(有人或许有疑问为什么用的是32位的寄存器为什么还要为两个寄存器来办理呢?莫非是32位还不行装备吗?答案是:是的,不行用。装备寄存器对一个GPIO的装备要用4个位来完结。一组GPIO有16个引脚,一个引脚要4位的话,那么16个引脚就要16*4=64,那么就要2个32位的寄存器来完结,所以就爽性把高八位给一个寄存器,低八位给别的一个寄存器,这就呈现了CRL和CRH。或许有人还会有疑问说为什么必定要用4位来对一个引脚的装备呢?答案是必定的,由于前面说了,对GPIO的装备首要装备为输入形式或许输出形式,然后再对输入、输出装备为哪种输出,哪种输入,是推挽输出呢,仍是开漏输入呢,这都是需求至少2个位来进行装备,并且输入、输出形式各有4种形式,共8中,这样要以最少的资源来完结的话,用00、01、10、11这种2个位来完结是最省资源的,所以2*2=4,所以关于1个GPIO的形式的装备至少也就要4位了。)

接着便是检查LED的GPIO的引脚接在IC哪个引脚上。怎样检查LED的引脚究竟接在哪呢?这个要看开发板的原理图,不同的板子来说或许关于不同的商家来说在GPIO的引脚接线上会有不同,以我的开发板的原理图能够发现LED灯的GPIO别离接在了GPIOB的pin5和GPIOE的pin5上,依据电路性质,一般会将LED设置为推挽输出形式(或许这时就会有人问了,为什么便是推挽呢?为什么不是开漏呢?我的了解是:这是有电路性质决议的,推挽望文生义便是灌电流与拉电流都能够输出,浅显地讲便是输出凹凸电平。而开漏是一向输出低电平,当你要输出高电平的时分需求加上拉)

经过查阅寄存器的数据手册可知,00位通用推挽形式,那么

//======================================================//

GPIOB-》CRL |= 3 《《 20;//设置模数数据传输速率

GPIOB-》CRL &=~(3 《《 22);//设置GPIO形式

//======================================================//

这样就把GPIOB组的pin5设置成了通用推挽形式,前面说了一个引脚需求4个位来装备,检查寄存器数据手册可看到,前面2个位是设置通用推挽形式的,后边2个位是依据这种形式的数据传输速率,在这儿咱们悬着的是“最大速度50MHz”,而GPIOB-》CRL|=3《《20;便是设置数据传输速率为最大速度50MHz,GPIOB-》CRL&=~(3《《22);为设置GPIOB的pin5为通用推挽形式。

最终便是设置LED的初始状况了,再说之前先说一下ODR寄存器。

ODR是一个端口输出数据寄存器,也只用了低16位。该寄存器为可读写,从该寄存器读出来的数据能够用于判别当时IO 口的输出状况。而向该寄存器写数据,则能够操控某个 IO 口的输出电平。

所以在装备LED初始化的时分就需求调用这个寄存器设置LED的初始状况。

//======================================================//

GPIOE-》ODR|=1《《5;//设置LED的初始化状况为1(1为到电平,亮灭有其电路决议,我的开发板由于接了上拉,使得低电平才是有用的,即0为LED灯亮,1为LED灯灭)

//======================================================//

这样初始化函数就完结了。

详细初始化代码如下:

//=======================led.c===============================//

#include “stm32f10x.h”

#include “led.h”

void led_Init(void)

{

RCC -》APB2ENR |= 1 《《 3;//使能 PORTB 时钟

RCC -》APB2ENR |= 1 《《 6;//使能 PORTE 时钟

GPIOB -》CRL |= 3 《《 20;

GPIOB -》CRL &=~ (3 《《 22);//PB.5 推挽输出

GPIOB -》ODR |= 1 《《 5;//PB.5 输出高

GPIOE -》CRL |= 3 《《 20;

GPIOE -》CRL &= ~(3 《《 22);//PE.5 推挽输出

GPIOE -》ODR |= 1 《《 5;//PE.5 输出高

}

//======================================================//

其头文件如下:

//=========================led.h=============================//

#ifndef __LED_H_

#define __LED_H_

extern void led_Init(void);

#endif

//======================================================//

接下来说一下初始化好了,主函数要怎样写。

榜首需求的是点亮LED的句子,在初始化中有说到,设置LED初始化状况即:GPIOB -》ODR |= 1 《《 5;//PB.5 输出高

那么一起也能运用这句来进行LED的亮灭操控。代码如下:

//==========================main.c============================//

#include “stm32f10x.h”

#include “led.h”

int main(void)

{

int i=0;

led_Init();//LED初始化

while(1)

{

GPIOB -》ODR &= ~ (1 《《 5);//PB.5输出低电平,即点亮LED

GPIOE -》ODR &= ~(1 《《 5);//PB.5输出低电平,即点亮LED

for(i=0;i《1000000;i++);//延时

GPIOB -》ODR |= 1 《《 5;//PE.5输出高电平,即灭掉LED

GPIOE -》ODR |= 1 《《 5;//PB.5输出高电平,即灭掉LED

for(i=0;i《1000000;i++);//延时

}

}

//======================================================//

整个跑马灯的工程就只需这三个文件,就能简略完结跑马的功用,假如你想要延时的时刻是规则的,那么你就要去运用守时器了。由于守时器守时的时刻是按时的,软件延时榜首耗费CPU的资源,然后时刻也不行准确,所以一般在对时刻要求没有很准确的要求是才会运用软件延时的做法。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/yingjian/347051.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部