IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 【STM32】(一)概述与GPIO介绍 -> 正文阅读

[嵌入式]【STM32】(一)概述与GPIO介绍

前言

??因为各种原因,STM32的学习势在必行,没办法,但是为了高质量学习,我先整理汇总了此前找到的多个资料,打算写一篇系统性的学习笔记。

对于一款单片机的学习,我认为一般要注意以下几点:

  • 明确芯片引脚及片上外设,如IO口,中断,定时器,串行口,ADC等
  • 数据手册,方便查阅在使用某个模块时查询响应的寄存器或者程序
  • 例程,一般来说,官方会给出一定的例程,方便使用者学习使用。
  • 多多练习

参考链接

以下文字和图片大部分出自本视频教程中的内容。

STM32F103概述

??STM32是ST(意法半导体)公司基于ARM Cortex-M内核开发的32位单片机,所谓M,即Microcontroller的首字母缩写,32代表该单片机为32位。

内核认识与产品选型

??STM32是基于ARM内核设计的,但似乎很多人无法区分内核和单片机的关系。而这个视频就详细讲述了这点。如下图所示:
在这里插入图片描述
??简单来说,就是ARM公司提供内核,然后ST公司完善外围的存储器和外设等部分,使该单片机具有不同的功能。此外,还有其他的单片机公司也会基于ARM内核来添加其他类型的外设(Peripherals),从而形成基于ARM内核但功能、型号不同的单片机产品
??关于ARM内核的各个型号如下图所示:
在这里插入图片描述
??其中,Cortex-M系列主要用于嵌入式和单片机,也就是我们常见的STM32F103的内核。其他产品内核及特性如下图所示:
在这里插入图片描述

系统结构图

??查阅手册可以看出,小、中、大容量的产品内部结构是差不多的,如下图所示:
在这里插入图片描述
??其中,Cortex-M3为内核,ICode和DCode为内核相关的指令总线和数据总线,用来执行Flash中的程序指令,System为系统总线,用来连接其他的外设。AHB(Advanced High performance Bus)为先进高性能总线,用来连接性能要求较高的外设,如时钟RCC和复位。APB1和APB2(Advanced Peripheral Bus)为先进外设总线,用来连接片上外设,其中APB2最大时钟为72MHz,APB1最大时钟为36MHz,因为APB1、APB2时钟和AHB存在一定差异,因此需要使用桥接电路。
??需要记住的是,到底哪些外设是连接APB1,哪些是连接APB2,因为一般使用外设前都需要使能对应总线的时钟,否则外设无法运行。其中,GPIO和各外设的“1号选手”挂载在APB2上,其他外设的“非1号选手”和ADC等就挂载在APB2上,相对较慢。

STM32F103C8T6

??以上描述的都是STM32F1系列整体性的功能与结构,具体到使用的最小系统板和它的芯片型号,也需要有一定的了解。
??该视频教程使用的是基于STM32F103C8T6芯片的最小系统板,根据选型手册,可以知道该型号的芯片主频为72MHz,供电为2.0~3.6V,一般选择3.3V供电。
??最小系统板的电路原理图如下所示:
在这里插入图片描述
??此外,还需要注意STM32的启动配置,即BOOT0和BOOT1的配置,这两个引脚决定了单片机从哪里开始执行程序,具体设置如下图所示:
在这里插入图片描述
??其中,第一种模式下程序从主闪存开始启动,为正常运行程序的模式,一般都是使用这种模式;第二种模式为从系统存储器开始启动,即我们常说的BootLoader,一般用来作为串口下载使用。
??此外,根据表格下面的注释可以知道,当系统复位之后,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存,此时就可以将BOOT0引脚配置为普通的IO口了。

标准库开发之Keil新建工程

??STM32的开发方式,一共有三种:寄存器开发、标准库开发、HAL库开发,其中,由于STM32的寄存器都是32位,而且数量众多,所以目前很少有人用寄存器开发,大部分都是使用标准库或者HAL库来开发。这里主要介绍标准库的开发方式,因此只需要使用Keil即可。
??但是,标准库开发有一个很大的麻烦,那就是这个工程文档建立较为麻烦,需要先到ST官网下载标准外设库的压缩包,然后在项目工程中添加一些文件。

  • 1、创建一个工程,选择对应的器件
    在这里插入图片描述
    在这里插入图片描述
  • 2、在项目文件夹中创建几个子文件夹,便于工程的管理:Start、Library、System、User、Peripherals,名字可以任意,便于理解即可。同时也在Keil工程中创建相同名称的Group。
    在这里插入图片描述
    ??需要注意的是:创建group之后,一定要在项目包含项中添加对应的文件夹
    在这里插入图片描述
    ??同时还要在define中添加使用标准库的定义:USE_STDPERIPH_DRIVER
  • 3、打开标准库文件,在Keil项目工程中添加对应的文件。这里较为复杂,具体参考视频中的教程

实际上,如果只需要部分功能,完全可以只添加部分官方的.c和.h文件,但为了创建一个“百试不爽”的项目工程模板,完全可以添加全部的源文件和头文件,只是编译速度慢一点而已。

  • 4、根据自己的实际情况设置调试器
    在这里插入图片描述

踩坑日记

  • 1、报错FCARM - Output Name not specified, please check 'Options for Target - Utilities’
    原因:添加文件时类型选择错误
    在这里插入图片描述
    应改为All files。而且右键添加的文件,可以发现其属性对应错误。
    参考链接
  • 2、使用ST-Link下载程序到开发板,发现只有按下复位按钮才能运行程序
    解决:出在设置中勾选Reset and run之外,还需要取消勾选Enable
    在这里插入图片描述
    在这里插入图片描述
    参考链接

GPIO

额外参考链接

概述

??STM32的GPIO较为复杂,但是了解原理之后掌握基础使用还是很简单的。其内部的IO口结构如下图所示:
在这里插入图片描述
??其中,值得一提的是,输入端的肖特基触发器,实质上是一个施密特触发器(属于翻译错误了),即具有滞回比较曲线,可以使得读入的信号不受波动的影响。输出端,位设置/清除寄存器是用来设置输出数据寄存器的,因为输出数据寄存器只能整体读写,而如果需要更改某一位时,就需要用到位设置/清除寄存器,来实现某一位的写入,而其他位不改变的效果。
??正是因为STM32的GPIO内部结构较为复杂,因此GPIO一共可以配置为8种输入输出模式,如下表所示:
在这里插入图片描述
??8种模式对应标准库中的代码如下图所示:
在这里插入图片描述


??一般来说,使用GPIO的步骤如下:

  • 使能时钟(使能APB2总线上的时钟)
  • 初始化GPIO端口,包括设置引脚(Pin)、模式(Mode)、速度(Speed)等参数
  • 使用对应的API函数接口进行输入输出

??其中,初始化端口时,一般要先定义一个GPIO的结构体,然后分别配置结构体中的各参数,参考代码如下:
在这里插入图片描述

API函数总结

??初始化完GPIO端口之后,接下来的就是操作输入输出了,这里需要用到标准库给定的各种API函数。那如何找到这些函数呢?很简单,打开添加的stm32f10x_gpio.h文件,滑到最底下,就可以看到常用的API函数了。
在这里插入图片描述
??虽然数量有点多,但实际上常用的函数并不多。其功能如下图所示:
在这里插入图片描述
??如果需要查看函数具体的定义,可以在函数声明上右键,选择Go To Definition Of xxxxx,如果需要返回函数声明,在定义的函数上右键,选择Toggle Head
??下面附上一个LED闪烁的代码:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

int main(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	while (1)
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_0);
		Delay_ms(500);
		GPIO_SetBits(GPIOA, GPIO_Pin_0);
		Delay_ms(500);
		
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);
		Delay_ms(500);
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);
		Delay_ms(500);
		
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0);
		Delay_ms(500);
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1);
		Delay_ms(500);
	}
}

CubeMX学习教程

https://zhuanlan.zhihu.com/STM32CubeMX
https://www.waveshare.net/study/article-629-1.html

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-02-14 21:20:17  更:2022-02-14 21:21:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:56:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码