Bootstrap

基于库函数的stm32单片机的外设使用

本文用于自己的学习记录,欢迎交流

1、stm32单片机的外设

STM32单片机有很多外设,这里进行一下整理,常用的外设有GPIO、AFIO、EXTI、NVIC.....

在stm32技术手册中可以知道这些外设的位置各不相同,有的位于内核,有的位于内核外部,但是这些外设的使用方法流程大同小异,下面针对这些外设的使用方法进行一下整理,首先对于绝大多数的外设而言,其使用方法都脱不掉以下的几个步骤

  • 开启外设时钟

  • 对外设进行配置

  • 使用外设

2、时钟

RCC时钟是所有外设的基础,大多数外设在初始化的过程中都应该首先开启对应的时钟。

我是这样理解外设和时钟之间的关系的,

假设有一个温泉酒店,酒店为旅客提供吃饭、睡觉、游戏、洗浴、健身、电影等各种娱乐服务。这些服务都在由一个个设备提供,比如桑拿房、家庭影院等等。酒店为每种服务都提供了好几套设备,但这些设备的性能分为VIP和普通两种级别。为了便于管理,酒店前台就有两个登记人员,一个负责管理VIP设备,一个负责管理其他的设备。当旅客(使用者)进入酒店后,无论是想要使用什么设备,首先要做的事情就是去前台告知登记人员,然后由登记人员为旅客打开该对应的设备。

将这个例子放在STM32单片机上,就是时钟总线有两个,分别挂载了不同的外设,要使用外设就要先打开对应的时钟。这里可以间单片机看成是温泉旅店,将外设看成是设备,将时钟看成是登记人员。图1是STM32F1x参考手册中关于时钟总线挂载外部设备的示意图,其中APB2的性能要好于APB1的性能。

图 1

下表对时钟和外设之间的关系进行了总结

APB1

DAC

USART2

SPI2

TIM2

I2C1

USB

bxCAN

USART3

SPI3

TIM3

I2C2

USART4

TIM4

USART5

TIM5

TIM6

TIM7

APB2

ADC1

USART1

SPI1

TIM1

GPIOA

EXTI

AFIO

ADC2

TIM8

GPIOB

ADC3

GPIOC

GPIOD

GPIOE

GPIOF

开启时钟的库函数为:

3、STM32系统结构的解析

下面的内容都是以STM32F103C8T6单片机而言的。

3.1、GPIO

GPIO(General Purpose Input/Output Port),即通用输入输出端口,就是芯片的一些引脚。作为输入端口时,我们可以通过它们读入引脚的状态--高电平或低电平,作为输出端口时,我们可以通过它们输出高电平或低电平来控制连接的外围设备。

3.2、TIM

定时器,分为高级定时器,通用定时器,基本定时器

高级定时器:TIM1、(TIM8)

通用定时器:TIM2、TIM3、TIM4

基本定时器:(TIM6、TIM7)

3.3、 SPI

串行外设接口(SPI)允许芯片与外部设备以半/全双工、同步、串行方式通信。此接口可以被配置

成主模式,并为外部从设备提供通信时钟(SCK)。接口还能以多主配置方式工作。

3.4、EXTI

外部中断/事件控制器

就像51的定时器既可以定时又可以计数一样,这里的外部中断和事件控制也可以在一个外设上实现。

3.5、ADC

模拟/数字转换外设,

3.6、AFIO

复用引脚,这里说的这些外设都会有对应的引脚,但有时候在使用引脚的过程中会冲突,复用功能主要时在这个时候对引脚进行调整,GPIO口中的一部分具有复用功能,但也只能被复用一次

3.7、I2C

这个是用来进行数据传输的,和SPI一样,但数据线只有一根。

3.8、USART

串口外设,用于数据传输。后边有详细记录。STM32f103C8T6一共三个USART寄存器

这里把图拉下来,看一下图中还有那些没写到

cortex-M3,这个是内核

SDIO:这个是SD卡的对应内设,手册里叫SDIO接口

Flash:这个和SD卡差不多,也是存储外设,或者存储芯片读取的外设,与SD卡的区别是,SD卡普遍内存大一点

DMA:直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传

输。

RCC:这个就是时钟,上边写了。

FSMC:FSMC模块能够与同步或异步存储器和16位PC存储器卡接口。

SRAM:静态随机存取存储器Static Random-Access Memory,SRAM)是随机存取存储器的一种。所谓的“静态”,是指这种存储器只要保持通电,里面储存的数据就可以恒常保持。相对之下,动态随机存取存储器(DRAM)里面所储存的数据就需要周期性地更新。然而,当电力供应停止时,SRAM储存的数据还是会消失(被称为volatile memory),这与在断电后还能储存资料的ROM闪存是不同的。


4、GPIO口

GPIO口是STM32单片机的重要外设,主要用来实现单片机与外界的互动,在使用该外设时,首先要进行初始化配置

配置主要分两个步骤,开启GPIO时钟,对GPIO进行初始化

  • 开启GPIO时钟

  • 对GPIO进行初始化

GPIO初始化结构体的声明方法如下

GPIO_Init(Timx,&GPIO_InitType)

函数使用结构体GPIO_InitType来进行GPIO初始化,结构体的结构如下

结构体中GPIOMode_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;

;