历史上的今天

今天是: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灯(库函数)

推荐阅读

德国慕尼黑和波兰波兹南讯——英飞凌科技股份公司与位于波兰的录音技术开发商Zylia携手打造全球首个便携式录音棚。英飞凌领先的69dB信噪比 (SNR) 数字MEMS麦克风技术被集成于Zylia ZM-1麦克风阵列,实现了一种全新的音乐录制方法。19个麦克风胶囊组成的麦克风阵列具有高端24位录制分辨率,用户只需一个麦克风即可录制整个声音场景。该麦克风阵列配备XEN...
据消息报道,可口可乐欧洲合作伙伴(CCEP)正在英国一个主题公园配送服务,利用一款自动驾驶机器人配送饮料…… 黑科技,前瞻技术,自动驾驶,可口可乐英国公园,可口可乐自动驾驶,可口可乐自动驾驶配送,可口可乐自动驾驶送货机器人,汽车新技术 据消息报道,可口可乐欧洲合作伙伴(CCEP)旗下创新投资基金CCEP Ventures正与自动驾驶专家leRetail合...
今年早些时候,三星与纽约时尚设计师 Thom Browne 合作,促成了 Galaxy Z Flip Thom Browne 版的诞生。双方的合作似乎已经成功,因为三星在 Galaxy Unpacked 2020 上确认了第二款 Thom Browne 版本设备,即 Galaxy Z Fold 2 Thom Browne Edition。  具体的上市时间和价格细节仍然未知,但三星应该会在 9 月 1 日的...
8月30日,至纯科技发布半年度业绩报告称,2021年上半年,公司实现营业收入为9.20亿元,同比增长76.51%,归属于上市公司股东的净利润1.50亿元,同比增长395.51%。截至报告期末,至纯科技整体业务新增订单达到17.2亿元,达到去年全年新增订单的88%。报告期新增订单中,整个半导体板块新增订单14.2亿元,其中湿法设备新增订单4.3亿元,达到上一年度全年湿法设...

史海拾趣

问答坊 | AI 解惑

基于最新款飞思卡尔片子(MC9S08AC32)的实际应用代码

如题所说. 对于想使用这款飞思卡尔芯片,MC9S08AC32,FLASH有32K的同志位来说,我认为这个片子做得不错了,你们可以试着尝试一下,飞思卡尔是俺使用过的代码中,我觉得相对来说,抗干扰性较强的一款片子. 这里有一些代码,可以帮你迅速入门,迅速走入开发.…

查看全部问答∨

id卡读卡器ps2口怎么读不出卡号啊??也是和键盘输入一样的读卡器

id卡读卡器ps2口怎么读不出卡号啊??也是和键盘输入一样的读卡器…

查看全部问答∨

8255求救 引脚电平变化无法读取

8255引脚电平变化无法读取 #define PA8255 (*((unsigned char xdata *)0x1fff))//总线地址 #define PB8255 (*((unsigned char xdata *)0x3fff))//总线地址用16位表示 p0是低八位 p2是高八位    #define PC8255 (*((unsigned char xdat ...…

查看全部问答∨

PNG图片旋转任意角度

WinCE5.0下有什么好的方法实现啊?…

查看全部问答∨

导出的SDK要安装在VS2005的哪个目录下????

如题。   我自己定制了一个PB,编译好了后,把SDK导出了,但是这个SDK是要安装在VS2005的安装目录下吗??(我用的开发 工具是VS2005,但是是第一次使用)安装完了SDK,在启动VS2005,新建工程时,需要对它进行选择吗????…

查看全部问答∨

怎么用VS2005做wap网站

请详细说明怎么建工程,怎么部署?谢谢!能有图片最好!…

查看全部问答∨

c语言程序问题

#include<reg52.h>#define uchar unsigned char#define uint unsigned int sbit lcden=P2^7;sbit lcdrs=P2^6;sbit lcdrw=P3^6;uchar count,shi,fen ,miao;uchar code table[]=\"   2009-5-16\";uchar code table1[]=\"   0 ...…

查看全部问答∨

坛子里有使用ZUKEN CR5000的软件的么?

如题,欢迎使用的公司和个人跟贴,这款软件好像满偏门的,是么?…

查看全部问答∨

Getting Started with the MSP430 LaunchPad_Student Guide and Lab Manual

内容和大课堂的内容差不多,只不过是英文的。 大家看看!…

查看全部问答∨

AD器件大全

本帖最后由 paulhyde 于 2014-9-15 03:16 编辑 AD芯片大全,及其基本性能指标。供大家比赛参考!!    …

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

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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