板子使用的是洋桃电子的开发板,核心板上面的两个led灯连接的是PB0和PB1两个引脚,如下图所示

可以看到这个电路图,如果将PB0的引脚的信号设置为高电平,则电流会从LED灯的左边流向右边,即点亮LED灯。
对stm32的操作有两种方法,一种是使用固件库函数,另一种是直接使用寄存器的方法。使PB0引脚变成高电平的方法

一、使用固件库函数

1、使能时钟


从上图的STM32的结构图可以看出,GPIOB是在APB2上面的外设,所以使能时钟应该选择APB2。
在固件库中的stm32f10x_rcc.c文件中有库函数void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
{/* Check the parameters */assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));assert_param(IS_FUNCTIONAL_STATE(NewState));if (NewState != DISABLE){RCC->APB2ENR |= RCC_APB2Periph;}else{RCC->APB2ENR &= ~RCC_APB2Periph;}
}```
函数的第一个参数RCC_APB2Periph是一个32位的无符号整型数据,用来指定需要激活的哪一个时钟线对对应的外设,我们此处需要激活的是APB2的外设。在这个文件中也给我们指出了对应参数的选择。```c
/*** @brief  Enables or disables the High Speed APB (APB2) peripheral clock.* @param  RCC_APB2Periph: specifies the APB2 peripheral to gates its clock.*   This parameter can be any combination of the following values:*     @arg RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB,*          RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE,*          RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1,*          RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1,*          RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3,*          RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17,*          RCC_APB2Periph_TIM9, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11     * @param  NewState: new state of the specified peripheral clock.*   This parameter can be: ENABLE or DISABLE.* @retval None*/

即这里的第一个参数我们选择RCC_APB2Periph_GPIOB,因为我们的GPIO是在选择的GPIOB,另一个参数选择ENABLE即可。即调用函数即可使能对应的外设的时钟。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE)

至此,时钟设置就结束了。

2、选择引脚

此处选择的引脚是PB0和PB1,在选择引脚的时候需要设置三个参数,一是我们选择的是哪一个引脚,这里选择的PB0和PB1,二是需要设置一个速度,三是设置一个输出或者输入方式,一般led灯对应的是输出,按键对应的是输入。
在stm32f10x_gpio.h中官方给我们定义了一个名为GPIO_InitTypeDef结构体用来设置引脚,结构体具体内容如下

**typedef struct
{uint16_t GPIO_Pin;             /*!< Specifies the GPIO pins to be configured.This parameter can be any value of @ref GPIO_pins_define */GPIOSpeed_TypeDef GPIO_Speed;  /*!< Specifies the speed for the selected pins.This parameter can be a value of @ref GPIOSpeed_TypeDef */GPIOMode_TypeDef GPIO_Mode;    /*!< Specifies the operating mode for the selected pins.This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;**

里面有三个成员,对应上面所述的三个参数的设置。其类型选择如下

#define GPIO_Pin_0                 ((uint16_t)0x0001)  /*!< Pin 0 selected */
#define GPIO_Pin_1                 ((uint16_t)0x0002)  /*!< Pin 1 selected */
#define GPIO_Pin_2                 ((uint16_t)0x0004)  /*!< Pin 2 selected */
#define GPIO_Pin_3                 ((uint16_t)0x0008)  /*!< Pin 3 selected */
#define GPIO_Pin_4                 ((uint16_t)0x0010)  /*!< Pin 4 selected */
#define GPIO_Pin_5                 ((uint16_t)0x0020)  /*!< Pin 5 selected */
#define GPIO_Pin_6                 ((uint16_t)0x0040)  /*!< Pin 6 selected */
#define GPIO_Pin_7                 ((uint16_t)0x0080)  /*!< Pin 7 selected */
#define GPIO_Pin_8                 ((uint16_t)0x0100)  /*!< Pin 8 selected */
#define GPIO_Pin_9                 ((uint16_t)0x0200)  /*!< Pin 9 selected */
#define GPIO_Pin_10                ((uint16_t)0x0400)  /*!< Pin 10 selected */
#define GPIO_Pin_11                ((uint16_t)0x0800)  /*!< Pin 11 selected */
#define GPIO_Pin_12                ((uint16_t)0x1000)  /*!< Pin 12 selected */
#define GPIO_Pin_13                ((uint16_t)0x2000)  /*!< Pin 13 selected */
#define GPIO_Pin_14                ((uint16_t)0x4000)  /*!< Pin 14 selected */
#define GPIO_Pin_15                ((uint16_t)0x8000)  /*!< Pin 15 selected */
#define GPIO_Pin_All               ((uint16_t)0xFFFF)  /*!< All pins selected */typedef enum
{ GPIO_Speed_10MHz = 1,GPIO_Speed_2MHz, GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;typedef enum
{ GPIO_Mode_AIN = 0x0,GPIO_Mode_IN_FLOATING = 0x04,GPIO_Mode_IPD = 0x28,GPIO_Mode_IPU = 0x48,GPIO_Mode_Out_OD = 0x14,GPIO_Mode_Out_PP = 0x10,GPIO_Mode_AF_OD = 0x1C,GPIO_Mode_AF_PP = 0x18
}GPIOMode_TypeDef;

所以设置引脚就可以先定义结构体GPIO_InitTypeDef对引脚进行设置,具体代码如下:

GPIO_InitTypeDef InitStrcuture;//定义一个结构体以便为其成员赋值InitStrcuture.GPIO_Pin = GPIO_LED_PIN_0 | GPIO_LED_PIN_1;InitStrcuture.GPIO_Speed = GPIO_Speed_10MHz;InitStrcuture.GPIO_Mode = GPIO_Mode_Out_PP;

这样就完成了对PB0和PB1引脚的设置,当然设置完成之后需要将该设置的引脚进行初始化操作,这里利用stm32f10x_gpio.c文件的函数GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
可以看到该函数第一个参数这里应该选择GPIOB,而第二个参数就是之前定义的结构体

GPIO_Init(GPIOB, &InitStrcuture);

至此,就将对应的引脚设置完成。

3、对引脚赋值

接下来就可以对该引脚的电平进行操作了,这里使用固件库函数

GPIO_SetBits(GPIOB,GPIO_Pin_0);
GPIO_ResetBits(GPIOB,GPIO_Pin_1);

这样就可以使得PB0为高电平,PB1为低电平,从而使得led1亮,led2灭。
其完整代码如下

#include "stm32f10x.h"int main(void)
{GPIO_InitTypeDef InitStrcuture;//定义一个结构体以便为其成员赋值RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//打开对应外设的时钟InitStrcuture.GPIO_Pin = GPIO_Pin_0| GPIO_Pin_1;InitStrcuture.GPIO_Speed = GPIO_Speed_10MHz;InitStrcuture.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &InitStrcuture);while(1){GPIO_SetBits(GPIOB,GPIO_Pin_0);GPIO_ResetBits(GPIOB,GPIO_Pin_1);}
}

二、使用寄存器

使用寄存器操作引脚,步骤与固件库函数的是极为类似的,唯一不同的是需要自己根据STM32参考手册去寻找相应外设或引脚的地址。个人觉得固件库的方法更为简单,但寄存器的学习也是必不可少的内容,下面用寄存器的方法点亮led灯。
这里同样是三部曲,一使能对应的时钟,二是配置IO口,三是对引脚赋值。

1、使能时钟

首先找到RCC时钟的地址,从下图可以看到RCC的基地址为0x40021000

使能时钟是通过APB2外设时钟使能寄存器(RCC_APB2ENR)来进行操作的。

可以从上图看到,该寄存器的偏移地址为0x18,如果在该地址的第4位填写1的话,则APB2上的GPIOB外设的时钟将被激活。

*(unsigned int*)0x40021018 = 0x8;

这样GPIO外设时钟就被激活了。

2、配置IO口

从参考手册中的寄存器映像中可以找到APB2所对应的地址范围,在这个范围中又可以找到GPIOB所对应的地址范围,可以看到这个基地址为0x40010C00

这里配置IO口的寄存器名为端口配置低寄存器(GPIOx_CRL) ,0-7为低寄存器,8-15为高寄存器。

可以看到只要将该地址的值配置好就可以设置相应的模式了。

*(unsigned int*)0x40010C00 = 0x11;

3、引脚赋值

引脚赋值使用的寄存器为端口输出数据寄存器(GPIOx_ODR)

*(unsigned int*)0x40010C0C |= 0x3

至此使得两个led灯亮。完整代码如下

#include "stm32f10x.h"int main(void)
{*(unsigned int*)0x40021018 = 0x8;*(unsigned int*)0x40010C00 = 0x11;*(unsigned int*)0x40010C0C = 0x3;
}

STM32之初学点亮led灯相关推荐

  1. 【STM32学习笔记-点亮LED灯】

    STM32学习笔记-点亮LED灯 文章目录 STM32学习笔记-点亮LED灯 一.原理图分析 二.代码分析 1.mian函数 2.led.c函数 3.led.h函数 4.函数文件整理 5.LED_In ...

  2. STM32入门之点亮LED灯

    导语: stm32系列的芯片比起入门级的AT89C51.STC系列芯片,有更强大的性能以及资源.但在编程上也有着或大或小的改变,使得初学者总会面临一些麻烦,下面我来总结下自己初学时的经验. 首先在ke ...

  3. 最小系统板 STM32入门,点亮 LED 灯(STM32F103C6T6)

    Hello, I'm Shendi 最近开整单片机,这里记录一下 我目前配置,最小系统板 STM32F103C6T6,ST-LINK V2 最小系统板,通电后PWR灯会亮,ST-LINK插上电脑后也会 ...

  4. 野火霸道STM32开发板点亮LED灯课后作业

    #include "stm32f10x.h" int main(void) {     //打开GPIOB端口的时钟     *(unsigned int *)0x40021018 ...

  5. STM32汇编语言点亮led灯

    STM32汇编语言点亮led灯 首先,这篇blog的主要内容是在C语言中调用汇编语言写的函数.即在我们常用的标准库函数工程中,对外设(这里指led)使用汇编语言完成相关的寄存器配置和控制. 一.背景 ...

  6. 【STM32】STM32CubeMX教程二--基本使用(新建工程点亮LED灯)

    前言 在配置好CubeMX之后,就是新建工程的开始了,那么首先我们需要一些准备,本片博客我们会很详细的介绍STM32CubeMx的基本使用和如何创建一个新的工程并且点亮LED灯  面向初学者   如果 ...

  7. 采用STM32外部中断模式控制LED灯亮灭

    文章目录 实验工具 一.STMCube配置项目 1.配置引脚 2.配置EXIT 3.配置SYS 4.配置GPIO 5.创建代码 二.使用KEil配置代码 1.打开生成的项目,找到stm32f1xx_i ...

  8. 单片机stm32LED流水灯C语言,STM32单片机入门 篇二:单片机编程:从点亮LED灯开始(二)...

    STM32单片机入门 篇二:单片机编程:从点亮LED灯开始(二) 2019-04-26 13:21:48 19点赞 73收藏 19评论 写在前面的话:本篇是承接上一篇文章,属于小白向. 没看过的朋友点 ...

  9. stm32点亮led灯。

    新手学习stm32 学习32第一个程序就是点亮led灯.本人用的是野火的指南者开发板.先上电路图. 如图所示,为led模块电路图,由图可知,此模块为共阳极.只需将引脚变成低电平即可使led灯亮.此次代 ...

最新文章

  1. Boom Library 93套影视游戏无损配乐音效素材合集包
  2. Xcode 6 Bug:Interface Builder文件中的未知类
  3. java加密方式有哪些_面完平安JAVA,他们说了这些
  4. Android开发学习之路-环境搭建
  5. wireshark抓包常见提示含义解析
  6. openresty 前端开发入门四之Redis篇
  7. Windows环境下,如何在Docker里运行SAP UI5应用
  8. 第二次尝试修复Hbase2出现Region不一致,使用 HBCK2 - 2021.11.15
  9. C语言-字符串处理函数strcpy
  10. C++调用WMI类查询获取操作系统名(实例)
  11. 【kafka】kafka Offset commit failed on partition The coordinator is not aware of this member
  12. 佳能g2810打印机扫描怎么用_佳能Canon PIXMA G2810 驱动
  13. python中的request库_Python中的Requests库简要总结
  14. 如何在Word文档中制作三线表
  15. android 菜鸟面单打印_android studio 菜鸟实战项目 之 spnner实现
  16. linux下while循环,Bash 中的 while 循环详解
  17. u8系统更改了服务器,用友u8服务器地址修改
  18. 基于逻辑回归模型对鸢尾花数据集进行分类
  19. ncbi blast MATLAB,NCBI-BLAST在线使用教程详细攻略(图解)
  20. MyCat做MySQL负载均衡(享学课堂,咕泡学院听课笔记)

热门文章

  1. rabbitmq订单消费案例
  2. 函数的四种特性——有界性 单调性 奇偶性 周期性
  3. 「Adobe国际认证」不要让“字距调整”,限制你的风格
  4. 支付宝和天弘独家合作 基金公司淘宝开店热降温
  5. 微信公众号分享开发过程中报错com.foxinmy.weixin4j.exception.WeixinException: 40164 invalid ip 120.79.217.10 (记录)
  6. 三星java安装_三星S3930C 电脑下载java后直接安装方法总结
  7. 【shell】linux输出重定向|输出重定向2>1
  8. java程序卡住的原因_Java程序卡住问题的解决
  9. 部门名称部门结构叠用_公司部门名称
  10. 学会这招,再也不怕女朋友生气啦。