STM32学习(1)


开始学习STM32,我买的开发板是正点原子的STM32F103ZET6战舰v3

相对比51,STM32的知识量要大出许多许多,这里学一点记一点吧。

1.STM32F103ZET6有144个引脚,7组IO口,每组IO有16个IO,一共7*16=112个IO

IO口从GPIOA一直到GPIOG,每组内的的IO从Px1-Px15

2.STM32的大部分IO除了用作GPIO的功能外,还可以复用为外设功能引脚,比如串口。

3.STM32的GPIO有8种工作模式,又分为4种输入模式,4种输出模式

4种输入模式为:

  • 输入浮空
  • 输入上拉
  • 输入下拉
  • 模拟输入

4种输出模式为

  • 开漏输出
  • 开漏复用功能
  • 推挽式输出
  • 推挽式复用功能

4.每组GPIO端口包括7个寄存器:

2个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),配置一个IO需要4位,因此一个寄存器能够配置8个IO,每组GPIO内有16个IO,因此需要两个32位的寄存器;CRL寄存器控制0-7的IO,CRH寄存器控制8-15的IO,寄存器配置图如下

ysSGvT.png

通过MODEx[1:0]这两位来设置IO为输入或者输出,设置为00即为输入模式,设置为其他的值即为输出模式(翻转速率不一样),当设置了IO输入或者输出后,可以设置CNFx[1:0]的值来设置具体的工作模式,即上面说的八种工作模式(注意,要设置IO为上拉或者下拉还需要设置ODR寄存器的值,当ODR寄存器相应的位为0时,即为下拉输入,为1时,即为上拉输入)。

2个32位数据寄存器(GPIOx_IDR,GPIOx_ODR)

GPIOx_IDR为端口输入数据寄存器,它用来读取IO口的输入(在输出模式下,这个寄存器也可以用来读取对应的IO口的输出值),寄存器图如下

ysSvin.png

32位中只有低16位被使用,低16位的每一位都用来控制一个IO口,每一位的值就是对应IO口目前的状态;

GPIOx_ODR为端口输出寄存器,寄存器图如下

yspDoj.png

和IDR寄存器一样,ODR寄存器也只有低16位被使用,每一位对应着一组IO口的一个IO,可以读取每一位的值来获取每一个IO的状态,也可以设置每一位的值来控制每一位IO的状态(通过GPIOx_BSRR来设置)。

1个32位置位/复位寄存器(GPIOx_BSRR)

GPIOx_BSRR是端口位设置/清除寄存器寄存器,寄存器图如下

ys9d91.png

这个寄存器一般只用低16位,也就是设置对应的ODRy位为1,将ODRy设置为0的操作则是由GPIOx_BRR寄存器来完成。

1个16位复位寄存器(GPIOx_BRR)

GPIOx_BRR为端口位清除寄存器,和GPIOx_BSRR相对应,GPIOx_BSRR用来设置ODRy位为1,而GPIOx_BRR设置为0,寄存器图如下

ys9yHe.png

ys9cAH.png

GPIOx_BSRR和GPIOx_BRR这两个寄存器都只使用低16位寄存器。

1个32位锁定寄存器(GPIOx_LCKR)

下面记录如何点亮led

在学51单片机的时候,我们只需要将led对应的IO口设为高电平即可点亮,但stm32要麻烦一些。

我们知道,时钟是单片机的驱动源,单片机的外设想要工作的话必须打开其对应的时钟。在51单片机编程中我们使用一些外设并没有配置时钟,这是因为51单片机只要打开一个时钟源就能使用所有外设,而这个时钟源是默认开启的。但stm32不一样,它的所有时钟默认都是关闭的,我们要想使用某个外设都需要先使能其对应的时钟,才能进行下一步操作。

因此在stm32下点亮led有以下三个步骤:

  1. 使能对应的GPIOx
  2. 初始化对应的GPIOx
  3. 给GPIOx_Pin_y设置相应的值

还得再提一手stm32的系统架构,多的不谈,挑一点记录(其实只是因为我现在只学了这么点)

APB1 和 APB2 的区别, APB1 上面连接的是低速外设,包括电源接口、
备份接口、 CAN、 USB、 I2C1、 I2C2、 UART2、 UART3 等等, APB2 上面连接的是高速外设包
括 UART1、 SPI1、 Timer1、 ADC1、 ADC2、所有普通 IO 口(PA~PE)、第二功能 IO 口等。居宁
老师的《稀里糊涂玩 STM32》资料里面教大家的记忆方法是 2>1, APB2 下面所挂的外设的时
钟要比 APB1 的高。

再记录一些函数

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
IO口初始化库函数
第一个参数为要初始化的IO,从GPIOA-GPIOG
第二个参数为GPIO结构体,如下
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;
GPIO_Pin为具体的IO,从GPIO_Pin_0-从GPIO_Pin_15;GPIO_Speed为翻转速率,GPIO_Mode为IO的工作模式

未完待续。。。(不想写了,什么时候想写了再写吧)


文章作者: Lock
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Lock !
评论
 上一篇
iot的一点知识 iot的一点知识
1.ROM、RAM、SRAM、DRAM、FLASH区别1.ROM(Read Only Memory)ROM是只读存储器,掉电时可以保存数据: 只读存储器,在单片机运行时,只能从中读取数据,不能向里面写数据。特点是掉电不丢失数据,在单片机中主
2021-04-05 Lock
下一篇 
IDA7.5下的idapython使用 IDA7.5下的idapython使用
开始学习IDApython的使用 网上的教程都是基于7.0版本的IDA,自IDA7.4之后,idapython的语法就有了变化,且由py2转移到了py3,所以需要对照着Hexray官方的说明来修改,链接 跟着这个教程一点点学习 IDApy
2021-01-25 Lock
  目录