STM32学习笔记

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)
  1. 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库的工程文件。

三、如何学习单片机

  1. 杨桃电子里面推荐学习标准库函数的方式开发,以此教程进行学习。
    杨桃电子
  2. 然后正点原子等学习HAL库
    正点原子
  3. 最终学习RTT操作系统。
    RT-Thread
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值