STM32学习笔记2——GPIO点灯

发布者:数字狂舞最新更新时间:2019-03-29 来源: eefocus关键字:STM32  GPIO点灯 手机看文章 扫描二维码
随时随地手机看文章

学会了建立建立工程,接下来一定是迫不及待的想用自己的开发板大显身手了吧。别急,慢慢来。在C语言学习时,你最先编译的一定是那条永恒经典的代码,对,就是Hello World——简单、明了,而且能直观的看见现象。在STM32上也有一个简单、明了,而且能直观的看见现象的程序——点灯。这就是我们现在的hello world,让我们从他开始学习吧!!!


学习

点灯我们要用到的就是控制我们需要的I/O口,所以,让我们先来看一下STM32F的GPIO端口。在STM32F0系列微控制器的每个GPIO端口有:两个32位配置寄存器(GPIOx_OTYPER和GPIOx_MODER)、两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR)、一个32位置位/复位寄存器(GPIOx_BSRR)、一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。根据数据手册中列出的每个I/O口的特定硬件特性,GPIO的端口的每个位可以软件分别配置成:输入浮空、输入上拉、输入下拉、模拟输入、开漏输出、推挽输出、推挽复用和开漏复用功能等多种模式。具体见表 


这里写图片描述
这里写图片描述


每个I/O口可以自由编程,然而I/O口的寄存器必须按32位字节进行访问。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器的读/写的独立访问; 


由此,我们可以编程对寄存器进行操作,使I/O口产生方波对灯进行亮灭控制。但首先我们要找到开发板上的LED在哪个I/O口上:找到开发板的原理图你会发现 


这里写图片描述


LED接在PA5端口,高电平点亮。(由于板子不一样,大家自行寻找自己的LED挂在哪个口上,是在找不到,可外接) 

下面就开始对我们的开发板进行点灯的编程了


按照昨天的工程建立一个工程,Lib组里继续添加gpio.c和rcc.c。

来到main.c下进行程序的编写。

程序

1.包含头文件


#include"stm32f0xx.h"


2.延时函数


void Delay(volatile unsigned int ncount)

{

    while(ncount--);

}


3.定义GPIO初始化结构体


GPIO_InitTypeDef        GPIO_InitStructure;


4.进入主函数


int main(void)

{

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //enable the clock

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

  GPIO_InitStructure.GPIO_OType = GPIO_OType_P;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

  GPIO_Init(GPIOA, &GPIO_InitStructure);


  while (1)

  {

     GPIO_SetBits(GPIOA,GPIO_Pin_5);

     Delay(0xfffff);

     GPIO_ResetBits(GPIOA,GPIO_Pin_5);

     Delay(0xfffff);

  }

}


接下来把程序按照昨天写的下到开发板上,看到LED灯开始闪烁,好了。一切都完工了没?早着呢,这才开始,下面我们开始分析为什么这么写。知其然,还要知其所以然。


分析

延时函数没问题(但还要注意volatile的应用,在KEIL中无所谓,但如果你使用GCC进行编程,没有volatile的地方就会被优化掉,从而使延时函数无意义)

那么接下来的GPIO_InitTypeDef GPIO_InitStructure;是什么意思呢?

在GPIO.h中还有如下代码


typedef struct

{

  uint32_t GPIO_Pin;              /*!< Specifies the GPIO pins to be configured.

                                       This parameter can be any value of @ref GPIO_pins_define */


  GPIOMode_TypeDef GPIO_Mode;     /*!< Specifies the operating mode for the selected pins.

                                       This parameter can be a value of @ref GPIOMode_TypeDef   */


  GPIOSpeed_TypeDef GPIO_Speed;   /*!< Specifies the speed for the selected pins.

                                       This parameter can be a value of @ref GPIOSpeed_TypeDef  */


  GPIOOType_TypeDef GPIO_OType;   /*!< Specifies the operating output type for the selected pins.

                                       This parameter can be a value of @ref GPIOOType_TypeDef  */


  GPIOPuPd_TypeDef GPIO_PuPd;     /*!< Specifies the operating Pull-up/Pull down for the selected pins.

                                       This parameter can be a value of @ref GPIOPuPd_TypeDef   */

}GPIO_InitTypeDef;


两段代码合起来就是我们要找的了,先定义GPIO_InitTypeDef,然后根据这个结构定义了GPIO_InitStructure,这个结构体在后面的GPIO的设置中会用到。


主函数中的第一句RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);又是什么呢?我不是配置GPIO么,这是什么东西? 

在STM32中,上电后默认所有的时钟都是关的,需要手动打开,所以这一部是先进行时钟打开,在M0内核中控制GPIOPA的时钟在AHB上 

这里写图片描述

所以要打开PA5上的时钟,必须对AHB使能,在函数中

void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState)

{

  /* Check the parameters */

  assert_param(IS_RCC_AHB_PERIPH(RCC_AHBPeriph));

  assert_param(IS_FUNCTIONAL_STATE(NewState));


  if (NewState != DISABLE)

  {

    RCC->AHBENR |= RCC_AHBPeriph;

  }

  else

  {

    RCC->AHBENR &= ~RCC_AHBPeriph;

  }

}


变量uint32_t RCC_AHBPeriph在库中有如下定义#define RCC_AHBPeriph_GPIOA RCC_AHBENR_GPIOAEN #define RCC_AHBENR_GPIOAEN ((uint32_t)0x00020000)将0x00020000与寄存器按位或后进行赋值正好对应GPIOA进行使能。


GPIO设置 

先对结构体内的变量赋值,设置PA5口,设置端口为输出、推挽输出(模电的知识,我也是一知半解),设置输出速度为50MHz. 

然后进入让LED亮灭的程序,对GPIO_SetBits(GPIOA,GPIO_Pin_5);我们看他的原函数:

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

{

  /* Check the parameters */

  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

  assert_param(IS_GPIO_PIN(GPIO_Pin));


  GPIOx->BSRR = GPIO_Pin;

}


他传递了两个参数:*GPIOx,GPIO_Pin。在stm32f0xx.h中有


typedef struct

{

  __IO uint32_t MODER;        

  __IO uint16_t OTYPER;       

  uint16_t RESERVED0;       

  __IO uint32_t OSPEEDR;     

  __IO uint32_t PUPDR;       

  __IO uint16_t IDR;         

  uint16_t RESERVED1;      

  __IO uint16_t ODR;          

  uint16_t RESERVED2;         

  __IO uint32_t BSRR;        

  __IO uint32_t LCKR;         

  __IO uint32_t AFR[2];       

  __IO uint16_t BRR;         

  uint16_t RESERVED3;       

}GPIO_TypeDef;


对__IO的定义volatile,大家可以去看这篇文章这里写链接内容谢谢作者。通过这个结构体大家也该明白为什么能对BSRR寄存器进行操作了吧。在BSRR寄存器 


这里写图片描述

#define GPIO_Pin_5                 ((uint16_t)0x0020) 


所以该函数就是对第五位ODR置位。之后延时,GPIO_ResetBits(GPIOA,GPIO_Pin_5);和上面的差不多,就不一一讲了。 

至此点灯程序就差不多了,做出来不一定能写出来,写的过程是一个升华提升的过程,能扎实自己的能力,再把自己的想一想,把以前认为理所当然的过一遍,能收获很多。。。 

PS:库里的*.c文件添加后,如编译时提示找不到头文件,要去stm32f0xx_cof.h中使能相应的.h 文件(就是把前面的注释去掉)。

关键字:STM32  GPIO点灯 引用地址:STM32学习笔记2——GPIO点灯

上一篇:stm32的KEY控制LED
下一篇:STM32蜂鸣器-库函数

推荐阅读最新更新时间:2024-03-16 16:26

STM32的flash进行操作的一些要点
说到STM32的flash,我们的第一反应是用来装程序的,实际上,STM32的片内FLASH不仅用来装程序,还用来装芯片配置、芯片ID、自举程序等等。当然, FLASH还可以用来装数据。 FLASH分类 根据用途,STM32片内的FLASH分成两部分:主存储块、信息块。 主存储块用于存储程序,我们写的程序一般存储在这里。 信息块又分成两部分:系统存储器、选项字节。 系统存储器存储用于存放在系统存储器自举模式下的启动程序(BootLoader),当使用ISP方式加载程序时,就是由这个程序执行。这个区域由芯片厂写入BootLoader,然后锁死,用户是无法改变这个区域的。 选项字节存储芯片的配置信息及对主存储块的保护信息。
[单片机]
STM32时钟初始化函数SystemInit()详解
花了一天的时间,总算是了解了SystemInit()函数实现了哪些功能,初学STM32,,现记录如下(有理解错误的地方还请大侠指出): 使用的是3.5的库,用的是STM32F107VC,开发环境RVMDK4.23 我已经定义了STM32F10X_CL,SYSCLK_FREQ_72MHz 函数调用顺序: startup_stm32f10x_cl.s(启动文件) → SystemInit() → SetSysClock () → SetSysClockTo72() 初始化时钟用到的RCC寄存器复位值: RCC_CR = 0x0000 xx83; RCC_CFGR = 0x0000 0000;RCC_CIR = 0x0000 0000;
[单片机]
<font color='red'>STM32</font>时钟初始化函数SystemInit()详解
基于 ARM Cortex-M3内核的STM32系列处理器解决方案
STM32简单介绍 一、背景 如果你正为项目的处理器而进行艰难的选择:一方面抱怨16位 单片机 有限的指令和性能,另一方面又抱怨32位处理器的高成本和高功耗,那么,基于 ARM Cortex-M3内核的STM32系列处理器也许能帮你解决这个问题。使你不必在性能、成本、功耗等因素之间做出取舍和折衷。 即使你还没有看完STM32的产品手册,但对于这样一款融合ARM和ST技术的“新生儿”相信你和我一样不会担心这款针对16位MCU应用领域 的32位处理器的性能,但是从工程的角度来讲,除了芯片本身的性能和成本之外,你或许还会考虑到开发工具的成本和广泛度; 存储器 的种类、规模、性能和容 量;以及各种软件获得的难易,我相信
[单片机]
基于 ARM Cortex-M3内核的<font color='red'>STM32</font>系列处理器解决方案
STM32笔记--使用ST-Link下载hex文件
嵌入式产品开发过程中,日常使用ST-Link下载程序时都是在MDK编译器中下载源代码,但ST-Link其实也可以直接下载hex文件,STM32官方就有提供一个ST-Link下载程序的工具STM32 ST-LINK Utility,只需三步,就能将hex文件下载到单片机中,相比使用串口下载hex文件繁琐的步骤操作,真香 1 ST-LINK Utility下载安装 1.1 下载ST-LINK Utility ST-LINK Utility是意法半导体提供的开源工具,直接在意法半导体官网即可下载 下载链接:https://www.st.com/en/development-tools/stsw-link004.html 下载界面
[单片机]
<font color='red'>STM32</font>笔记--使用ST-Link下载hex文件
stm32 串口的printf函数重定向
串口的printf函数重定向分为2种情况:使用MicroLIB库与不使用MicroLIB库,具体实现代码见下: #if 1 /*****************不使用MicroLIB库需加上该部分****************************/ // 取消ARM的半主机工作模式 //#pragma import(__use_no_semihosting) // 确保没有从C库链接使用半主机的函数 // //struct __FILE // 标准库需要的支持函数 //{ // int handle; //}; //FILE __stdout; // FILE is typ
[单片机]
STM32 ILI9325 驱动代码 学习总结
为了更好,更深入学习了解ILI9325系列TFT的驱动原理,自己做了一块TFT板子。为了方便测试,在上面集成了STM32芯片,到时候做实验的时候就焊接STM32测试,如果只是使用,就直接焊接TFT就行了。板子还在做,先上原理图与PCB。 -------------------------等板子回来,再测试,总结继续------------- --------板子回来了,焊接好了,简单测试了一下!----------- ---------第二部分---------------ili9320.h------------------代码简单分析------ #ifndef _ILI9320_H_ #defin
[单片机]
<font color='red'>STM32</font> ILI9325 驱动代码 学习总结
PS2无线遥控手柄与STM32单片机通信
PS2无线遥控手柄 接下来要做一个小车玩玩,在网上淘了一个PS2无线遥控手柄,用于控制小车的前进、后退等功能。 实物图如下: 其中有两个PS2游戏摇杆,对应的驱动原理参见下文: PS2游戏摇杆原理及控制实现 接收器 与这个手柄配套的还有一个接收器,用于接收PS2无线遥控手柄发送过来的数据 该接收器一共有六个引脚,分别定义如下: 注意: 当接收器上的绿灯常亮时,证明手柄和接收器配对成功,可以正常进行数据通讯。如果手柄和接收器断开了,按手柄上的 START 键即可恢复配对; 当手柄上的MODE指示灯没有点亮的时候,游戏摇杆四个方向输出按键键码值;当点击 MODE 按键后,手柄上的MODE指示灯变亮(红色),
[单片机]
怎么使用C语言控制硬件
C语言的应用编程在单片机的领域占了很大一部分,使用的比较多的51单片机和STM32单片机都可以使用MDK软件编写固件。 单片机烧写了固件后可以点亮LED灯,可以驱动ADC检测电压,也可以驱动蜂鸣器发声,这就是简单地控制硬件。稍微复杂一点的,可以驱动NRF2401进行无线的连接,也可以使用ESP8266这类wifi芯片连接网络。 接下来,简单地讲讲如何使用C语言控制硬件。 1、电路连接 简单的模块可以直接使用高低电平来控制,比如红外线发射模块,当你在驱动引脚上的电压达到3.3v,就能发出红外线;然后将电平设置为0v,红外线发射就停止了。 一般而言,单片机的引脚输出电压能够达到3.3v,也是可以点亮红外线LED,但是可能会导致
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

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

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

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved