STM32学习笔记
一,初识STM32单片机
- STM32有什么功能
- STM32分类
- STM32命名方法
例:STM32F103CRT6 表示:M3内核F1系列48P脚QFP封装环境温度-40~85°。
- 系统框图
- 输出选择
- 推挽输出
推挽输出时,最高可以提供25ma电流
推挽输出:可以输出高,低电平,连接数字器件; 推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源低定。 - 开漏输出
开漏输出具有“线与”功能,一个为低,全部为低,多用于I2C和SMBUS总线。 输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内).
开漏形式的电路有以下几个特点:
利用外部电路的驱动能力,减少IC内部的驱动。当IC内部MOSFET导通时,驱动电流是从外部的VCC流经R pull-up ,MOSFET到GND。IC内部仅需很下的栅极驱动电流。 - 浮空输入:
由于浮空输入一般多用于外部按键输入,结合图上的输入部分电路,我理解为浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的。 - 上拉输入/下拉输入/模拟输入:
这几个概念很好理解,从字面便能轻易读懂。 - 复用开漏输出、复用推挽输出:
可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用)
数据手册Cortex-M3里,对于GPIO的配置种类有8种之多:
(1)GPIO_Mode_AIN 模拟输入
(2)GPIO_Mode_IN_FLOATING 浮空输入
(3)GPIO_Mode_IPD 下拉输入
(4)GPIO_Mode_IPU 上拉输入
(5)GPIO_Mode_Out_OD 开漏输出
(6)GPIO_Mode_Out_PP 推挽输出
(7)GPIO_Mode_AF_OD 复用开漏输出
(8)GPIO_Mode_AF_PP 复用推挽输出 - 在STM32中选用IO模式
(1) 浮空输入_IN_FLOATING ——浮空输入,可以做KEY识别,RX1
(2)带上拉输入_IPU——IO内部上拉电阻输入
(3)带下拉输入_IPD—— IO内部下拉电阻输入
(4) 模拟输入_AIN ——应用ADC模拟输入,或者低功耗下省电
(5)开漏输出_OUT_OD ——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。可以读IO输入电平变化,实现C51的IO双向功能
(6)推挽输出_OUT_PP ——IO输出0-接GND, IO输出1 -接VCC,读输入值是未知的
(7)复用功能的推挽输出_AF_PP ——片内外设功能(I2C的SCL,SDA)
(8)复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)
- GPIO输出初始化顺序
二、寄存器开发和库开发
对于STM32是用寄存器开发还是用库开发,一直备受争论,而寄存器开发和库开发都各有利弊,主要还是看开发者在项目中如何来权衡。下面用最基础的GPIO引脚配置来对比一些这两种开发方式的差异。
2.1 寄存器开发
必备手册《STM32中文参考手册》
寄存器开发让开发者知根知底,能够深入了解底层工作原理。
寄存器开发代码执行效率更高,代码更加简洁。
int main(void)
{
//开启 GPIOB 端口时钟
RCC_APB2ENR |= (1<<3);
//清空控制 PB0 的端口位
GPIOB_CRL &= ~(0X0F << (4*0));
//配置 PB0 为通用推挽输出,速度为10MHz
GPIOB_CRL |= (1 << (4*0));
// PB0 输出低电平
GPIOB_ODR |= (0<<0);
while(1);
}
2.2 库开发
必备手册:《stm32F1xx_stdperiph_lib_um.chm》
库开发使代码可读性增强,且符合CMSIS库标准便于移植。
代码相对寄存器开发更加繁琐,执行效率没有寄存器高。
int main(void)
{
// 定义一个 GPIO_InitTypeDef 类型的结构体
GPIO_InitTypeDef GPIO_InitStructure;
// 开启 GPIOB 端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// 选择要控制的 GPIO 引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
// 设置引脚模式为通用推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
// 设置引脚速率为 10MHz
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
// 调用库函数,初始化 GPIO 引脚
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 使引脚输出低电平
GPIO_ResetBits(GPIOB, GPIO_Pin_0);
while(1);
}
2.3 开发总结
通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的。一般大多数都会选用标准库和HAL库,而极少部分人会通过直接配置寄存器进行开发。
一般大多数都会选用标准库和HAL库。
标准库:是目前最多人使用的方式,也是学习STM32接触最多的一种开发方式。
HAL库:
很好的解决了程序移植的问题,不同型号的stm32芯片它的标准库是不一样的,例如在F4上开发的程序移植到F3上是不能通用的,而使用HAL库,只要使用的是相通的外设,程序基本可以完全复制粘贴,注意是相通外设,意思也就是不能无中生有,例如F7比F3要多几个定时器,不能明明没有这个定时器却非要配置,但其实这种情况不多,绝大多数都可以直接复制粘贴。是而且使用ST公司研发的STMcube软件,可以通过图形化的配置功能,直接生成整个使用HAL库的工程文件。