资讯详情

STM32F103标准库入门——新建工程、初识GPIO

自古逢秋悲寂寞,我说秋胜春。 晴空一鹤排云,便将诗情带到碧霄。-刘禹锡《秋词二》·其一》


一、新建工程

  • 芯片型号: STM32F103C8T6 (SMT32最小系统开发版)
  • 新建工程后需要添加一些必要文件:(将里面的文件全部复制,并粘贴到新建工程的Start文件中)
  • stm32f10x.h :就是 STM32 外设寄存器描述文件,其功能及51单片机的头文件 REGX52.H 同样,用于描述 STM32 寄存器对应的地址是什么?
  • 下面两个 system 文件主要用于配置时钟,,就是system文件中的函数配置:
    • system_stm32f10x.c:
    • system_stm32f10x.h:
  • 复制并粘贴这三个文件Start文件中;
  • STM32由内核和内核外围设备组成,内核寄存器和外围设备的描述文件不在一起,需要添加内核寄存器的描述文件;
  • 两个 cm3(Cortex-M3) 文件是内核的寄存器描述,还带有一些内核的配置函数,全部复制到Start文件下;
  • 必要的文件已经准备好回来了keil将刚刚复制的文件添加到项目中,
  • 将以下文件添加到项目中,最基本的文件,不需要我们修改,只读文件;
  • 最后,我们还需要在工程选项中添加文件夹的头文件路径,否则软件找不到.h文件的;
  • 打开工程文件夹:新建一个 User 存储我们的文件夹 main 函数;

二、点灯

1. 配置寄存器点亮灯:

  • 首先是RCC这个寄存器,使能GPIOC的时钟,,所以在这个APB2 外设时钟使寄存器 RCC_APB2ENR 里面配置;
    • IOPCEN:这是使能GPIO该位写的时钟1,就是打开GPIOC的时钟;
  • 第二个寄存器需要配置PC13口找到配置高寄存器的端口模式GPIOx_CRH
    • CNF13MODE13用于配置13号口的,
    • CNFy[1:0]:端口x配置位
      • 在输入模式(MODE[1:0] = 00)
        • 00:模拟输入模式;
        • 01:浮动输入模式(复位状态);
        • 10:上拉/下拉输入模式;
        • 11:保留;
      • 在输出模式(MODE[1:0] > 00)
        • 00:一般推拉输出模式;
        • 01:通用泄漏输出模式;
        • 10:复用功能推挽输出模式;
        • 11:复用功能泄漏输出模式;
    • 端口输出数据寄存器(GPIOx_ODR)
      • ODR13:写1号、13号口为高电平,写0为低电平;
        • 如果写 1ODR 的值就是 0000 2000

2. 为工程增加库函数

  • 库函数是编辑和包装应用寄存器,应用相应的函数名可以实现相应的功能,不需要设置单片机寄存器,初学者或先使用寄存器,了解寄存器,然后使用函数编程;
  • 两者没有本质区别,只是包装层次不同。因为所有的库函数本质上都是为了方便编程和调用寄存器读写。而且两者可以在一定程度上混用(只要不引起冲突)。一般来说,库函数开发要快得多,寄存器开发需要更高的资源管理,开发非常困难,也容易出错,但在正确开发后,由于缺乏一层调用,程序效率更高(但这在大多数情况下意义不大)。
  • 在工程中新建一个文件夹 Library 用于存储库函数;
  • misc 是内核的库函数,其他是内核外的外设库函数;
  • 为了直接使用库函数,我们需要添加另一个文件;
    • conf(configuration) 文件是用来配置库函数头文件的包含关系的,其中里面还有一个用来检查的函数定义,这是所有库函数都需要的;
    • 两个 it(interrupt) 存储中断函数的文件;
  • 复制这三个文件并粘贴到项目中 User 文件中;
  • 完成后,我们将使用库函数进行点灯操作,库函数实际上是间接配置寄存器;
  • 库函数间接配置寄存器,因此步骤与寄存器相同:
    • ,库函数有这样一个打开时钟的函数 RCC_APB2PeriphClockCmd()
      • 有两个参数,
      • 该函数用于使能或失能APB2外设时钟;
      • (可直接复制以下参数) 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
      • NewState 的值可以是 ENABLE 或者 DISABLE ;(也可复制)
    • ,需要使用 GPIO_Init() 这个函数;
      • 其中有两个参数:
        • GPIOx,其中 x 可以是 A到G ,来选择需要配置哪个GPIO,选择的是PC13口LED,所以第一个参数就写GPIOC
        • 是一个 GPIO_InitTypeDef 的结构体,需要先定义一个结构体,需要先写上结构体的类型,然后给结构体取个名字,名字最好叫 GPIO_InitStruct ,然后填上结构体的每个参数;
        • - 这个结构体有三个参数,分别是:
          • :可以看到这个结构体是个枚举的类型,GPIO_Mode就是其中的一个值,选择Out_PP这一项,意思就是通用推挽输出;
          • :这个参数是在GPIO_pins_define中定义的,采用注中的方式,可以看到一个宏定义的列表,选择GPIO_Pin_13,然后复制到第二个位置;
          • :也是如上操作,跳到定义,然后注操作,选中50MHz的速度,然后赋值过去;
          - 注:在注释里的东西,无法使用右键进行跳转,可以进行选中这个字符,然后按下Ctrl+F,搜索这个字符的位置 ,点击Find Next,可以看到这个结构体是个枚举的类型,GPIO_Mode就是其中的一个值,选择Out_PP这一项,意思就是通用推挽输出 ; **
        
        • GPIO_Init()这个函数的第二个参数是一个指向结构体的指针,因此我们需要传递结构体的地址,复制结构体的名字,粘贴到函数的第二个参数的位置,然后在前面加上一个取地址符(&);
      • 这样就完成了GPIO模式的配置;
    • 配置的操作方式虽然看上去比较难,但是STM32的这种方式都是固定的;
      • 最后一步:来设置端口的高低电平进行点灯,
        • 函数GPIO_SetBits():该函数可以把指定端口设置为高电平;
          • 第一个参数:GPIOC;
          • 第二个参数:GPIO_Pin_13;(即可将PC13号口置为高电平)
          • 高电平熄灭;
        • 函数GPIO_ResetBits():该函数可以将指定端口设置为低电平;
          • 第一个参数:GPIOC;
          • 第二个参数:GPIO_Pin_13;(即可将PC13号口置为低电平)
          • 低电平点亮;


三、强调点

1、首先是新建工程里的启动文件选择,启动文件有很多类型,至于选择哪一个,我们需要根据芯片的型号来选择;

  • STM32F1 系列中的型号分类:
  • 根据 Flash 的大小:
    • 小容量产品,Flash为16~32K,简写为LD(Low Density)
    • 中容量产品,Flash为64~128K,简写为MD(Medium Density)
    • 大容量产品,Flash为256~512K,简写为HD(High Denisty)


四、GPIO

GPIO(General Purpose Input Output) :通用输入输出口,可配置为8种输入模式;

  • 0V~3.3V,部分引脚可容忍5V
  • 下可控制端口输出高低电平,用以驱动LED控制蜂鸣器模拟通信协议输出时序等;
  • 下可读取端口的高低电平或电压,用于读取按键输入外接模块电平信号输入ADC电压采集模拟通信协议接收数据等;
    • ,用来捕获按键按下的事件;另外也可以读取带有数字输出的一些模块;比如光敏电阻模块热敏电阻模块等;
    • ,那 GPIO 还可以配置成模拟输入的模式,再配合内部的ADC外设,就能直接读取端口的模拟电压了;

4.1 GPIO基本结构

4.1 GPIO 位结构


GPIO 模式

  • 通过配置 GPIO 的端口配置寄存器,端口可以配置成以下 8种模式
  • 这三个模式的电路结构基本是一样的,区别就是:
  • 它们都属于
    • 因为在浮空输入在引脚悬空时,电平是不确定的,所以在使用浮空输入时,端口一定要接上一个连续的驱动源,不能出现悬空的状态;

模拟输入

注:在GPIO的这8种模式中,除了模拟输入这个模式会关闭数字的输入功能,在其他的7个模式中,所有的输入都是有效的。


六、操作STM32的GPIO的三个步骤

  • 使用RCC开启GPIO时钟;
  • 使用GPIO_Init()函数初始化GPIO;
  • 使用输出或者输入的函数控制GPIO口;

七、RCC的库函数


八、GPIO的库函数


1、推挽模式输出下,高低电平都是有驱动能力的;

2、开漏输出模式下,高电平相当于高阻态,是没有驱动能力的,低电平有驱动能力;

3、一般输出使用推挽输出,在特殊情况下选择开漏输出;

4、除了这个 GPIO_Pin 可以用按位或的操作方式外,这个时钟控制得这一项,也是可以用 按位或(|) 的操作方式来选择多个外设的;

谢谢阅读!!!

标签: 54c8分类电阻器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台