【转载】【连载】奋斗stm32开发板学习日记3——GPIO点灯深究

[复制链接]
少校哈哈哈
2015-3-8 11:42:08 显示全部楼层

马上注册,玩转Robomaster!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

GPIO操作之点亮LED:

准备工具:

  • 带有led的开发板,
  • Jlink仿真器,
  • 开发板原理图,
  • stm32参考手册,
  • stm32固件库手册

上一篇例程中的结尾,我只是把点亮了led灯, 但是具体的如何是它点亮,并没有说到,那么这一期教程就来探究探究其中的原理。

其实让led亮灭的原理无非就是使控制该led灯pin口输出高低电压,51是这样, stm32亦是这样,但是因为后者内核架构比前者复杂许多, 所以就不能像51那样单单用一句话就能搞定,但是万变不离其宗,stm32点亮led的步骤一般如下:

  • 选定需要控制的引脚
  • 配置需要的特定功能
  • 设置GPIO口输出电压的高低。

首先咱们先来分析他的电路原理图,

打开后找到控制led部分 ,清注意红框圈出来的部分,这就是对应的pin脚。

了解完后他的硬件链接后,接下来我们就可以对这个pin口进行编程了,打开利器keil5 ,新建led工程,如何搭建开发环境,请参考我上一篇教程。

关键代码如下:

[size=12.8000001907349px]查看原代码

  • /* Includes ------------------------------------------------------------------*/

  • #include "stm32f10x.h"

  • GPIO_InitTypeDef GPIO_InitStructure; //定义一个GPIO类型的结构体。

  • void RCC_Configuration(void);

  • void LED_Config(void);

  • void Delay(__IO uint32_t nCount);

  • void LED_Config(void){

  • RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//开启GPIOB的外部时钟

  • GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//选择要控制的GPIOB的pin脚

  • GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置引脚模式为推挽输出

  • GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz /设置引脚的速率为50MHz

  • GPIO_Init(GPIOB, &GPIO_InitStructure); //调用库函数初始化GPIOB

  • }

  • void RCC_Configuration(void)

  • {

  • SystemInit();

  • }

  • int main(void)

  • {

  • RCC_Configuration(); //初始化系统时钟,设置为72MHz

  • LED_Config(); //配置led电灯参数

  • while (1)

  • {

  • GPIO_SetBits(GPIOB, GPIO_Pin_5); 设置PB5 为高电平 点亮

  • }

  • }


程序分析: 众所周知, c程序是从main函数开始执行的, main函数里面首先的执行的是RCC_Configuration这个函数,

该函数的里面是systemInit这个函数,这个函数的作用是设置系统时钟频率为最大72mHz,();

接着继续看, 程序执行LED_Confi()函数,程序首先执行这句RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); 使能GPIO外部时钟的, 为什么要使能呢 , 因为 stm32外设时钟默认是处于关闭的, 所以我们要在初始化阶段设置为开启。

继续看这三句;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5

PIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStruture这是什么结构? 此时我们可以查询 st官方库说明文档。 如图所示:

该结构体里面含有Pin, Speed ,Mode这三个参数。 LED对应的pin脚上面的电路原理图已经给出, 由于一端接地, 所以我们选用推挽输出的方式。  这里补充一点,  选用什么输出输入方式, 输出速率,ST官方都已经在代码中给出定义,都可以查询到。

GPIO_init()函数主要功能就是将刚才输入的结构体参数写入到GPIO相关的寄存器中, 这里主要用到了GPIOx_CRL, GPIOx_CRL,, 简单的解释下GPIOx_CRL,GPIOx_CRL是什么, 查询stm32参考手册,如图:

CRL寄存器就是配置pin口的输出或者输入速度, 什么模式。从图上可以发现 一个引脚口由2bit的mode(模式)和2bit的cnf(频率)控制。 又因为每个GPIO结构组分有16个pin脚, 这就解释了为什么会有CRL与CRH这两个寄存器了。 到这里的话, 点亮led就已经全部待续了。

接着我们看SetBits函数的实现部分, 由图可知:

GPIOx用了BSRR这个寄存器,如图:

这个寄存器设置相关端口为1 或者 0。 相当于设置端口输出高低电平。 这样的话, 就点亮了。


跳转到指定楼层

【转载】【连载】奋斗stm32开发板学习日记3——GPIO点灯深究

[复制链接]
上士u0uuuu
2016-11-15 20:52:54 显示全部楼层
学习了,好东西。。。。

【转载】【连载】奋斗stm32开发板学习日记3——GPIO点灯深究

[复制链接]
中士小花火
2018-12-22 20:18:09 来自手机 显示全部楼层
66666666666

本版积分规则

触屏版 | 电脑版

Copyright © 2019 RoboMasters 版权所有

快速回复 返回顶部 返回列表