历史上的今天

今天是:2024年08月31日(星期六)

2020年08月31日 | STM32学习笔记——控制GPIO输出点亮LED灯(直接操作存储器)

发布者:huanran 来源: eefocus关键字:STM32  GPIO输出  点亮LED灯  直接操作存储器 手机看文章 扫描二维码
随时随地手机看文章

一.预备知识

使用51单片机控制IO口相对来说要简单得多,最小系统搭建完毕后直接通过软件往各IO口写“1”或者写“0”即可。但使用STM32控制IO口输入输出却远没有这么容易,经过一个下午的查阅文献及探索后,略微有了头绪。

个人所使用的STM32F103VBT6有100个引脚,其中有五组GPIO(GPIOA…GPIOE),每组有16个GPIO端口(GPIOx_Pin0…GPIOx_Pin15)共80个,每个GPIO端口都有:

两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH);

两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR);

一个32位置位/复位寄存器(GPIOx_BSRR);

一个16位复位寄存器(GPIOx_BRR);

和一个32位锁定寄存器(GPIOx_LCKR)。

其中各个寄存器的作用:

名称

寄存器

意义

端口配置寄存器

GPIOx_CRL

GPIOx_CRH

配置GPIO工作模式

端口输入数据寄存器

GPIOx_IDR

读取GPIO输入状态

端口输出数据寄存器

GPIOx_ODR

控制GPIO输出状态

端口位设置/复位寄存器

GPIOx_BSRR

用于位操作GPIO的输出状态的:设置端口为0或1

端口位复位寄存器

GPIOx_BRR

用于位操作GPIO的输出状态的:设置端口为0

端口配置锁定寄存器

GPIOx_LCKR

端口锁定后下次系统复位之前将不能再更改端口位的配置


每个I/O端口位可以自由编程,然而I/0端口寄存器必须按32位字被访问(不允许半字或字节访问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器的读/更改的独立访问;这样,在读和更改访问之间产生IRQ时不会发生危险。

输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据。因此,要控制GPIOC端口,必须先使能APB2时钟。此外,STM32初始化外设第一步就是开启APB时钟。(时钟部分知识暂时知道该如此,往后再学习。)

关于GPIO各寄存器的描述:

端口配置低寄存器(GPIOx_CRL)(x=A..E):

STM32学习笔记——控制GPIO输出点亮LED灯(直接操作存储器)



端口配置高寄存器(GPIOx_CRH)(x=A..E):



端口输入数据寄存器(GPIOx_IDR)(x=A..E):


端口输出数据寄存器(GPIOx_ODR)(x=A..E):


端口位设置/复位寄存器(GPIOx_BSRR)(x=A..E):


端口位复位寄存器(GPIOx_BRR)(x=A..E):

端口配置锁定寄存器(GPIOx_LCKR)(x=A..E):

当执行正确的写序列设置了位16(LCKK)时,该寄存器用来锁定端口位的配置。位[15:0]用于锁定GPIO端口的配置。在规定的写入操作期间,不能改变LCKP[15:0]。当对相应的端口位执行了LOCK序列后,在下次系统复位之前将不能再更改端口位的配置。

每个锁定位锁定控制寄存器(CRL, CRH)中相应的4个位。




各寄存器地址:
GPIOC_CRL:0x40011000
GPIOC_CRH:0x40011004
GPIOC_ODR:0x4001100C
GPIOC_BSRR:0x40011010
GPIOC_BRR:0x40011014

RCC_APB2ENR:0x40021018

二.点亮LED灯

外部LED灯原理图:


编程思路:

1.    定义各寄存器地址

2.    使能APB2时钟

3.    配置GPIOC各端口输出模式

4.    利用BRR、BSRR、ODR寄存器点亮LED灯并循环流水灯

具体编程:

新建工程并设置好环境,添加c文件,键入如下程序:



//**********************************************

//* 通过直接操作存储器控制GPIO输出点亮LED灯    *

//* LED1=GPIOC_Pin6;                           *

//* LED2=GPIOC_Pin7;                           *

//* LED3=GPIOC_Pin8;                           *

//* LED4=GPIOC_Pin9;                           *

//* ------------------Sah_Pah----------------- *

//**********************************************

#include

 

//定义各寄存器地址

#define GPIOC_CRL  (* (volatile unsigned long *)(0x40011000))

#define GPIOC_CRH  (* (volatile unsigned long *)(0x40011004))

#define GPIOC_ODR  (* (volatile unsigned long *)(0x4001100C))

#define GPIOC_BSRR (* (volatile unsigned long *)(0x40011010))

#define GPIOC_BRR  (* (volatile unsigned long *)(0x40011014))

#define RCC_APB2ENR (*(volatile unsigned long *)(0x40021018))

 

//设置GPIOC_Pin6,Pin7,Pin8,Pin9为推挽输出模式,最大速度50MHz

#define _GPIOC_CRL 0x33000000

#define _GPIOC_CRH 0x00000033

void delay(void);

 

void main(void)

{

  volatile int i;

  //使能APB2的PORTC时钟

  RCC_APB2ENR |=(1<<4);

//设置GPIOC_Pin6,Pin7,Pin8,Pin9为推挽输出模式,最大速度50MHz

  GPIOC_CRL = _GPIOC_CRL;

  GPIOC_CRH = _GPIOC_CRH;

 

  while(1)

  {

    delay();

    //利用端口位复位寄存器BRR清除GPIOC各端口的ODR位为0

    GPIOC_BRR=0xFFFF;

    delay();

    //利用端口位设置/复位寄存器BSRR将P6、P7、P8、P9口置1,点亮LED灯

    GPIOC_BSRR=0x000003C0;

    delay();

    //重复三次,偷懒就不写循环了

    GPIOC_BRR=0xFFFF;

    delay();

    GPIOC_BSRR=0x000003C0;

    delay();

    GPIOC_BRR=0xFFFF;

    delay();

    GPIOC_BSRR=0x000003C0;

    delay();

    GPIOC_BRR=0xFFFF;

    //利用端口输出数据寄存器ODR进行流水灯循环

    for(i=0;i<3;i++)

    {

      //P6脚置1

      GPIOC_ODR=0x0040;

      delay();

      //清0

      GPIOC_ODR=0x0000;

      //P7脚置1

      GPIOC_ODR=0x0080;

      delay();

      GPIOC_ODR=0x0000;

      //P8脚置1

      GPIOC_ODR=0x0100;

      delay();

      GPIOC_ODR=0x0000;

      //P9脚置1

      GPIOC_ODR=0x0200;

      delay();

    }

  }

}

 

//定义延迟函数

void delay(void)

{

 unsigned long j,n=100000;

 while(n--)

 {

  j=12;

  while(j--);

 }

}


最终结果:


保存编译后,将程序烧写到开发板上,板上四个LED等闪烁三次后以流水灯形式循环三次。


三.参考文献


[1]半壶水,《STM32菜鸟学习手册-罗嗦版》, http://wenku.baidu.com/view/fc7c7d20ccbff121dd3683da.html,2012-08-19.


[2]电脑圈圈.自己动手创建一个基于万利STM32板的IAR工程[EB/OL].http://blog.21ic.com/user1/2198/archives/2008/48929.html,2008-07-02/2012-08-19.


[3]Changing.用stm32点个灯[操作寄存器+库函数][EB/OL].http://www.ichanging.org/stm32_gpio_led.html, 2012-06-29/2012-08-19.


关键字:STM32  GPIO输出  点亮LED灯  直接操作存储器 引用地址:STM32学习笔记——控制GPIO输出点亮LED灯(直接操作存储器)

上一篇:STM32 (3) GPIO口功能讲解 GPIO 口输入输出 寄存器配置
下一篇:使用STM32GPIO端口点亮LED灯(库函数)

推荐阅读

伴随着填补国内空白、具有国际领先水平的罕王微电子8英寸纯MEMS传感器芯片规模化量产线落户沈阳沈抚新区,将促进沈抚新区在传感器、物联网产业领域开疆拓土,罕王微电子产品应用广泛,可用于消费电子、汽车电子、工业控制、无人机、机器人、5G通讯甚至生物医药、航空航天、物联网、智能电网等领域,市场前景广阔。 沈抚新区举全力推进罕王微电子的MEMS项目...
  跨越1300公里,从江南水乡到西北塞外,太阳能路灯和巨型的输变电网不断从窗外闪过,提醒我古老的敦煌在新时代焕发着更加夺目的光彩。 自2009年以来,首批光伏特许权项目在敦煌荒凉的戈壁滩上落成,太阳能光伏这种极为充沛而独特的资源逐渐走入大众视野,一再打破长期以来内陆戈壁在人们心中“荒凉、干枯、死亡”的形象。  这次入塞,我把目的地定在...
新的力控制传感器使机器人能够在最终装饰装配过程中准确地执行装配任务,从而提高生产率,人体工程学和质量。ABB的新型动态装配套件用于实时装配,旨在提供快速,准确和安全的自动化解决方案,以安装从车身内部的座椅,仪表板和地毯到车辆外部的门,保险杠和车轮的所有部件。机器人抓具和手臂上的视觉摄像头带有集成的力控制传感器,可让机器人在进入工作...
eSOL和RTI合作支持汽车和工业自动化市场快速开发RTI Connext DDS和eSOL RTOS高性能梦幻组合为多核应用开发提供强劲动力领先的实时嵌入式软件解决方案提供商eSOL和最大的自主系统软件框架提供商RTI公司近日宣布建立合作伙伴关系,支持汽车和工业应用高性能多核安全嵌入式应用系统开发。 RTI和eSOL都是各自领域的开拓者。RTI公司开发了数据分发服务(DDS...

史海拾趣

问答坊 | AI 解惑

时间同步网络

在通信领域,“同步”概念是指频率的同步,即网络各个节点的时钟频率和相位同步,其误差应符合标准的规定。目前,在通信网中,频率和相位同步问题已经基本解决,而时间的同步还没有得到很好的解决。时间同步是指网络各个节点时钟以及通过网络连接的 ...…

查看全部问答∨

VHDL中arith程序包和除法问题

1. 在vhdl代码中为什么有时要使用arith程序包呢? 2. msb_sum: INTEGER :=15;   那么msb_sum /2应该等于7还是等于8呢?为什么? …

查看全部问答∨

开5元GPRS套餐(仅含cmwap)能不能做数据传输啊?

用gprs模块传输数据连cmnet,但是一般的套餐仅含cmwap的哦,请问各位用这个是不是也行啊?…

查看全部问答∨

两个Bulk in Endpoint,在Read函数中怎样区分?---DS

NTSTATUS UCANDevice::Read(KIrp I) { t << "Entering UCANDevice::Read, " << I << EOL; // TODO: Check the incoming request. Replace "FALSE" in the following // line with a check that returns TRUE if the re ...…

查看全部问答∨

STM8SXXX系列MCU指令系统

                                 请问是否STM8SXXX系列所有MCU的指令系统全是一样的, 是否有单独特殊指令用与特殊型号? 另外是否有STM8S反汇编软件?…

查看全部问答∨

请教如何判断bootloader出现问题的原因?

本帖最后由 dontium 于 2015-1-23 13:21 编辑 用贵公司的仿真器,自制5509小系统, 硬件仿真正常,可以出现预期结果, 但烧到串行flash里面后无法自举, 怎么检查出现问题的原因? 我用的是mcbspo口接串行flash, GPIO的配置没有问题, flas ...…

查看全部问答∨

如何看懂电路图

如何看懂电路图…

查看全部问答∨

测试程序

急需数据芯片检测仪的测试程序…

查看全部问答∨

MSP-EXP430FR5969开发板energyTrace问题

新买的MSP-EXP430FR5969开发板,试了一下energyTrace,遇到一些问题。 请教大牛,顺便和大家讨论。 energyTrace测功耗的功能准吗? 跑了一下LPM4的例程energyTrace结果如图,140uA是不是有点高啊(还没具体看手册和程序),之前用过一个FR5728 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved