该文章是我历时一个月整理总结而成,专门针对想要通过野火&洋桃STM32开发板入门stm32的读者。由于csdn编辑限制,该学习指导只包含文字信息。如需查看含图片的完整版可进入我的博客下载页。完整版内容详实,保证您看完该文对野火&洋桃STM32开发版的学习具有更加深入的理解。
这里放几张完整版笔记内容截图:


如果对该资源有任何疑惑,欢迎评论区或者私信交流。由于本人还在csdn初始建立信任度阶段,故设置的资源性价比极高,并且本人保证,对资源有任何不满意的地方均可以退回积分!

以下为无图片正文部分:

学习方法论:
看视频
视频相对而言是最轻松、有趣的学习方式
碰到不懂的可以先继续听,因为后面的东西前面用到了就讲了很正常
多听几遍,然后百度一下写笔记【一般视频都有配套资料,跟着一个资料系统走一遍】
看手册
数据手册(其他长篇文档也是)一定先通篇预览,再按需学习
数据手册主要用于芯片选型和设计原理图时参考,参考手册主要用于在编程的时候查阅

内部功能图

母线busmatrix
通过点亮LED灯全面理解寄存器编程

编译出错解决办法
对于error,可以双击则会自动跳到出错位置,在该位置上下几行寻找问题
实在找不到可以右键复制到剪贴板再百度求助
对于warning,如果不影响运行有一些可以忽略(比如定义的变量未使用),而若影响运行则需要同error一样解决
基本概念
keil的理解
Keil是公司名,uVision是集成开发环境(IDE),uVision5是其中最新的一个版本
搭建环境,就是需要编程用的语言和用什么进行编程,用什么进行调试(调试就是找有没有bug,所以调试器的英文叫做debugger)的这几个条件的总和
在我们这儿,就是用keil5提供的软件以汇编语言进行编程,用开发工具进行调试
开发工具包括MDK——支持ARM内核;c51——支持8051内核
软件本身的基础性作用就是把汇编语言编译生成单片机可执行的二进制代码,这样就可以烧写到单片机里面
编程时搭建环境、搭建框架的含义详解

封装
F103指的是设计的晶圆型号,晶圆经过激光蚀刻(形成上亿的晶体管)每一小块滑下来就是一个MCU【感觉类似AD中的拼版】,晶圆取下来后就需要封装,下图就是双列直插式封装,连接金属引线的过程就是ponding[绑定]

BGA,LQFP是按照外形来划分的封装类型
这个是BGA(底部有点)

这个是LQFP(四周有脚),应用更为广泛

一般来说引脚少,功能少,内存也小,其他各方面均配套降低
图:数据手册中给出的封装使用说明

STM32及ARM

STM32 使用ARM内核CPU
ARM属于一个微控制器,STM32自带了各种常用通信接口,比如 USART、I2C、SPI 等,
1、串口—USART,用于跟跟串口接口的设备通信,比如:USB转串口模块、ESP8266
WIFI、GPS模块,GSM 模块,串口屏、指纹识别模块
2、内部集成电路—I2C,用于跟I2C接口的设备通信,比如:EEPROM、电容屏、陀螺
仪MPU6050、0.96寸OLED模块
3、串行通信接口—SPI,用于跟SPI接口的设备通信,比如:串行FLASH、以太网W5500、音频模块VS1053
4、SDIO、FSMC的超级、I2S、ADC、GPIO
CPU,MCU,嵌入式系统联系与区别

MCU选型
一个原则:花最少的钱,做最多的事
在确定项目需求的情况下,一般按照下面的顺序来选择合适的MCU
1、选择哪种内核的芯片,内核越高意味着功耗也越高
2、选择多少引脚的芯片,引脚多少决定了资源的多少,也影响价格
3、选择多少RAM和FLASH的芯片,FLASH越大,价格越贵
4、还要考虑所选型号采购是否容易,供货是否稳定

存储器概念辨析
存储器:
分类

内存一般指的RAM,SRAM无需刷新,所以速度比DRAM快,SRAM 一般只用于 CPU 内部的高速缓存(Cache),而外部扩展的内存一般使用 DRAM【但是霸道扩展用的SRAM】。

闪存指的是FLASH,容量比ROM大
其中NOR FLASH 一般应用在代码存储的场合
即我们平常所说的从FLASH读取到内存,可以简单粗暴的理解为从NOR FLASH读取到SRAM
SD 卡、U 盘以及固态硬盘是NAND FLASH

机械硬盘:
非易失性存储器种类非常多,半导体类的有 ROM 和 FLASH,而其它的则包括光盘、
软盘及机械硬盘。
一般说的硬盘都是指的机械硬盘,硬盘应当是计算机的“外存”,储存空间 (Storage)指的就是硬盘的容量
各类型存储器区别与联系

DAP及串口ISP
串口isp是成本低的下载方式,现在在F4,7系列已经很少使用,DAP完全可以取代它(下载+调试+仿真)
debugger直译为调试器,但是一般却叫做仿真器
高速版HS——5M,全速版FS——1M
串口,JTAG,SW均是下载模式的国际标准
高速版支持JTAG和SW,全速版仅支持SW【SW和SWD是一样的】
内置ARM的SWJ接口,包含了SW和JTAG接口

注意:ARM【内核】是采用了一种叫做SWJ的接口,包含了SW和JTAG两种接口;DAP【仿真器】是分成两种版本,支持不同接口

可见JTAG包含SWD,SWCLK是时钟线,SWDIO是数据线,NJTRST是复位线
串口【COM口】功能只有下载程序
JTAG,SW可在线调试和硬件仿真
关于JTAG,SW的区别
串口中BOOT就是引导的意思,Boot模式设实际指的就是选择启动的起始地址区域,在STM32中存在以下三种模式可供选择,分别为片内Flash、系统内存、片内SRAM

寄存器
可以理解为CPU的零级缓存,它内置于各个IP外设中,是一种用于配置外设功能的存储器,就是一种内存,并且有相对应的地址。

存储器映射
存储器本身没有地址,给存储器分配地址的过程叫存储器映射
寄存器映射
寄存器本身就有地址
给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射。
如sfr p0=0x80
野火寄存器点亮LED灯教程中避开了寄存器映射,采用对地址进行位操作
偏移地址
它的存在是历史原因所致
把存储单元的实际地址与其所在段的段地址之间的距离称为段内偏移,也称为“有效地址或偏移量”。 亦: 存储单元的实际地址与其所在段的段地址之间的距离。本质其实就是“实际地址与其所在段的段地址之间的距离”
更通俗一点讲,内存中存储数据的方式是:一个存储数据的“实际地址”=段首地址+偏移量,
也可以这样理解:就像我们现实中的“家庭地址”=“小区地址”+“门牌号”
上面的“偏移量”就好比“门牌号”
其实就相当于C++的指针一样啦,指出确切的地址而已……

汇编语言
汇编语言基础知识
Heap(堆)
因为用户主动请求而划分出来的内存区域,叫做 Heap(堆)。它由起始地址开始,从低位(地址)向高位(地址)增长。Heap 的一个重要特点就是不会自动消失,必须手动释放,或者由垃圾回收机制来回收。

Stack(栈)
除了 Heap 以外,其他的内存占用叫做 Stack(栈)。简单说,Stack 是由于函数运行而临时占用的内存区域。

帧(frame)
帧是栈的一部分
C语言

宏定义
条件编译
条件编译是一种宏定义,故有#,它的目的就是防止函数二次定义
最常用的方式就是
#ifndefine //如果未定义此函数
#define //则定义它
续行符
语法:“\”
表示续行符的下一行与续行符所在的代码是连接起来
应用续行符的时候要注意,在“\”后面不能有任何字符(包括注释、空格),只能直接
回车
指针
指针意思是通过它能找到以它为地址的内存单元
作个比喻,假设将电脑存储器当成一本书,一张内容记录了某个页码加上行号的便利贴,可以被当成是一个指向特定页面的指针

枚举
从同一类型的数据中抽出来一部分,就是枚举
Enum

结构体
把不同类型的数据重组在一块

typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。
init为初始化函数
变量
浅析C语言之uint8_t / uint16_t / uint32_t /uint64_t
基本数据类型

数组

易变/修饰 只读变量
编译器有可能会对没有执行程序的变量进行优化
volatile 表示易变的变量,防止编译器优化

参数与变量区别
参数也是变量。变量很多种,参数变量是其中一种。
普通变量是你自己初始化的,参数变量是程序自动为你初始化的(就在你调用函数的一瞬间)
追问
那带参函数是什么意思
它与不带参数的有什么区别
追答
从道理上讲,既然有 带参数,那就有不带参数的情况。
货车可以装货,也可以不装货啊,尽管货车是用来装货的。

从技术讲,定义一个函数实际上是定义了一段代码,一段可以重复利用的代码
这段代码只有入口和出口,就像工厂的生产线,你送进去棉花,出来就是毛线。

定义一个函数
int plus(int a, int b) { retuan a + b};
定义一个函数
成品 生产(原料 棉花) <---- 成品代表int 生产单表plus 原料代表int 棉花代表 a。
{
return (棉花在生产线上经过七七四十九关处理变成——毛线);

}

有时候函数没有参数噻,这个就跟自然数为什么要发明一个0呢,一样道理。

函数这段代码有一个专门传入参数的地方,如果没有参数,这个地方就没用而已。
c语言参数和变量的区别
C语言形参和实参的区别(非常详细)
简单来说,形参就是无赋值,而实参就是有赋值
总线
I2C总线

SCL时钟控制线 SDA串行数据线
Serial clock data
AHB总线
AHB 总线衍生出APB2 和 APB1 总线,上面挂载着 STM32 各种各样的特色外设

固件库
中英文对照
Firmware library
模板:template
bsp:Board support package板级支持包;就是只针对特定的开发板
为什么用固件库

固件库就是底层驱动程序,用来操作寄存器

Doxygen
/**

  • @brief 初始化控制LED的IO
  • @param 无
  • @retval 无
    */
    这一段是代码书写的规范,名为“Doxygen”,如果在工程文件中按照这种规范去注释,可
    以使用 Doxygen 软件自动根据注释生成帮助文档。
    函数简介(@brief)、参数说明(’@param’)和返回值说明(@retval)四部分
    文件类型
    .s是汇编语言
    .h是头文件
    .h中一般放的是宏定义以及同名.c文件中定义的变量、数组、函数的声明,需要让.c外部使用的声明。
    .c文件一般放的是变量、数组、函数的具体定义。
    用法
    .c文件,以c为扩展名,一般存储具体功能的实现。
    .h文件,称为头文件,一般存储类型的定义(宏定义),函数的声明等。通常,头文件被.c文件包含,使用#include 语句。但值得注意的是,这只是一种约定,而非强制。
    Ps:为防止.h被不同.c文件调用而导致其中宏定义被多次定义【类似一个函数可以被声明多次,但是只能被定义一次】,在.h文件中宏定义时一定要用条件编译

文件作用
1-汇编编写的启动文件
startup_stm32f10x_hd.s:设置堆栈指针、设置PC指针、初始化中断向量表、配置系统时钟、使用库函数_main最终去到C的世界

2-时钟配置文件
system_stm32f10x.c:把外部时钟HSE=8M,经过PLL倍频为72M。

3-外设相关的
stm32f10x.h:实现了内核之外的外设的寄存器映射
本质还是头文件
但是一般来说由于功能重要,故在main.c中必须要定义

xxx:GPIO、USRAT、I2C、SPI、FSMC
stm32f10x_xx.c:外设的驱动函数库文件
stm32f10x_xx.h:存放外设的初始化结构体,外设初始化结构体成员的参数列表,外设固件库函数的声明

4-内核相关的
CMSIS - Cortex 微控制器软件接口标准
core_cm3.h:实现了内核里面外设的寄存器映射
core_cm3.c:内核外设的驱动固件库

NVIC(嵌套向量中断控制器)、SysTick(系统滴答定时器)
misc.h
misc.c

5-头文件的配置文件
stm32f10x_conf.h:头文件的头文件
//stm32f10x_usart.h
//stm32f10x_i2c.h
//stm32f10x_spi.h
//stm32f10x_adc.h
//stm32f10x_fsmc.h

6-专门存放中断服务函数的C文件
stm32f10x_it.c
stm32f10x_it.h

中断服务函数可以随意放在其他的地方,并不是一定要放在stm32f10x_it.c
固件库调用逻辑
STARTUP文件启动[汇编语言,效率高]
调用CMSIS中的core_cm3.c[ARM内核相关程序]以及system_stm32f10x.c来配置时钟
使用FWLib添加固件库来关联main.c
在头文件main.c中对固件库进行调用
Ps:在main.c前声明stm32f10x.h就可以调用这个库文件[其中对所有功能配置寄存器的地址进行了定义,之后就可以通过定义名来操作地址]

由于我们基本的函数执行均在main.c中完成,所以编写头文件的过程一般称作初始化xxx,因为头文件里面的内容是不需要全部调用的,而.c文件中如果有变量定义了而未进行使用,则会warning

野火新建工程文件存放方式
Fwlib-Template\Libraries\CMSIS\startup
Fwlib-Template\Libraries\CMSIS\core_cm3.c+stm32f10x.c
Fwlib-Template\Libraries\STM32F10x_StdPeriph_Driver\inc(库.h)+src(函数.c)
Fwlib-Template\User\main.c+stm32f103_it.c

洋桃新建工程文件存放方式
CMSIS\core_cm3.c+stm32f10x.c
Lib\STM32F10x_StdPeriph_Driver\inc(库.h)+src(函数.c)
startup
user\main.c+stm32f103_it.c
CMSIS:微控制器软件接口标准

———————————
GPIO

GPIO其实是厂商的说辞,本质还是I/O端口

翻转 toggle
中英文对照
PWM脉冲宽度调制
LSB,英文 least significant bit,中文义最低有效位
Alias,别名

引脚与I/O端口
I/O端口是引脚的一大类使用方式
引脚有3个要注意的地方:
1.大部分引脚也会有复用
2.少部分引脚可以自己映射(重定义)
3.大部分引脚兼容5V

GPIO中所用到的寄存器
CR:配置寄存器
DR:数据寄存器
每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH):LOW代表低电平,HIGH代表高电平方向控制
两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR):input output电平控制
一个32位置位/复位寄存器(GPIOx_BSRR):B代表bit set reset
一个16位复位寄存器(GPIOx_BRR)
一个32位锁定寄存器(GPIOx_LCKR):lock
GPIO的8种输入方式
翻转速度指的是方波脉冲翻转速度

模拟输入即ADC输入
模拟和浮空都是断开上下拉电阻和输出端(绿色放大器),只有输入(黄色放大器)只不过输入信号不同
上拉/下拉的目的是保持端口悬空时的电平状态【上拉/下拉的电阻很大,故不会影响实际输入高/低电平】
推挽电流较大,有驱动外设工作的能力
开漏电流较小,只是一个输出电流

GPIO的分组
C51中以1.1,1.2;3.1,3.2这样的方式分组
STM32中以PA,PB,PC这样的方式分组,且并非所有端口都会列出来(有一些是内部自己使用了)
GPIO初始化配置函数解析
stm32 GPIO简单介绍及初始化配置(库函数)
延时函数代码解析
1.void Delay(__IO uint32_t nCount) //简单的延时函数
{
for(; nCount != 0; nCount–);
}//具体时间与#define SOFT_DELAY Delay(0xFFFFF)以及时钟频率有关
初始化配置代码解析

1 void LED_GPIO_Config(void)
2 {
3 /定义一个 GPIO_InitTypeDef 类型的结构体/
4 GPIO_InitTypeDef GPIO_InitStructure;
5
6 /开启 LED 相关的 GPIO 外设时钟/
7 RCC_APB2PeriphClockCmd( LED1_GPIO_CLK|
8 LED2_GPIO_CLK|
9 LED3_GPIO_CLK, ENABLE);
10 /选择要控制的 GPIO 引脚/
11 GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;
12
13 /设置引脚模式为通用推挽输出/
14 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
15
16 /*设置引脚速率为 50MHz /
17 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
18
19 /
调用库函数,初始化 GPIO/
20 GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);
21
22 /选择要控制的 GPIO 引脚/
23 GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN;
24
25 /调用库函数,初始化 GPIO/
26 GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
27
28 /选择要控制的 GPIO 引脚/
29 GPIO_InitStructure.GPIO_Pin = LED3_GPIO_PIN;
30
31 /调用库函数,初始化 GPIOF/
32 GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure);
33
34 / 关闭所有 led 灯 /
35 GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
36
37 /
关闭所有 led 灯 /
38 GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);
39
40 /
关闭所有 led 灯 */
41 GPIO_SetBits(LED3_GPIO_PORT, LED3_GPIO_PIN);
42 }
附件:上述代码原图

位带操作(偏重寄存器,可忽略)
计算机位的理解
我们常常看到 32位 CPU、64位 CPU 这样的名称,其实指的就是寄存器的大小
32位是说计算机一次最多能够处理32位数据,1byte=8bit,也就是说32位就是4字节
不同位支持的运行内存不同。

每个存储单元可以存放八个二进制位,即一个零到二百五十五之间的整数、一个字母或一个标点符号等,叫做一个字节),即1字节=8 位。存储器的容量就是以字节为基本单位的,每个单元都有唯一的序号,叫做地址。中央处理器凭借地址,准确地操纵着每个单元,处理数据。
Eg:比如外设外带区的地址为:0X40000000~0X40100000,大小就为 1MB
因为1在第6位,即165=220,单位byte,1MB=210KB,1KB=210byte

指针的寻址能力是4byte,段地址+偏移地址,可以通过一个地址找到整个寄存器
但是一个地址仍然对应着的是一个字节
参考手册原文:

寻址本身也是一种操作,所以寻址时时必须对整个32位寄存器进行操作

位操作和位带操作
位操作就是可以单独的对一个比特位【地址最末位】读和写
51单片机中通过关键字 sbit 来实现位定义
51 单片机里面并不是所有的寄存器都是可以比特位操作,有些寄存器还是得字节操作,比如 SBUF

STM32 没有这样的关键字,但是通过访问位带别名区可以实现对所有寄存器位操作
在 STM32 中,有两个特定的地方,一个是 SRAM 区的最低 1MB 空间,另一个是外设区最低 1MB 空间,称为位带,位带经过膨胀后得到位带别名区
对位带别名区的操作称为位带操作

RCC
中英文对照
RCC :reset clock control 复位和时钟控制器【注意该控制器有时钟和复位两种功能】
高速外部时钟信号HSE(High Speed External Clock signal)相应的还有HSI(High Speed Internal Clock signal)、LSE(Low…)、LSI(Low…)

RCC寄存器英文缩写均省略clock
时钟控制寄存器 CR :control register
时钟配置寄存器 CFGR :configuration register
1.PLLMUL:PLL倍频系数 (PLL multiplication factor)
2.PLLXTPRE:HSE分频器作为PLL输入 (HSE divider for PLL entry)PRE想说的是预分频
3.PLLSRC:PLL输入时钟源 (PLL entry clock source)
备份域控制寄存器BDCR:Backup Domain Control Register
控制/状态寄存器 CSR:control/status register

时钟
时钟树

对时钟的理解
STM32中的高速时钟是给内核和外设用的,而低速时钟是给RTC和IWDG用的
高速单位一般是MHz,低速是KHz
HSE 8M倍频成72M,当HSE不能用时,使用HSI时钟
E是external,I是internal,外部始终不能用才用内部,因为内部时钟会产生温漂
一个时钟可以通过分频产生不同的频率,频率输送到定时器开始计数,实现精准计时

分频和倍频
CPU时钟频率称为主频,主频频率高,所以需要倍频得到其时钟信号
其他外设频率低,且所需频率不一,所以需要分频
倍频

预分频和后分频

后分频几乎不用,预分频英文prescaler

晶振
分类:分为有源晶振和无源晶振
有源晶振需要电源,但不需要附加的电容。它内部含有起振器。通常接到CPU的一根引脚即可【OSC_IN】。无源晶振不需要电源,但常需要和电容配合使用,它通常接到CPU的两根引脚上。【OSC_IN 和 OSC_OUT】
目的:产生时钟信号(一般是方波)

系统时钟
软件延时函数,使用不同的系统时钟,延时时间不一样,可以通过 LED 闪烁的频率来
判断。
其他时钟
MCO 是 microcontroller clock output 的缩写,是微控制器时钟输出引脚,在 STM32 F1
系列中 由 PA8 复用所得,主要作用是可以对外提供时钟,相当于一个有源晶振
可以用来监控系统时钟
中断
STM32具有十分强大的中断系统,将中断分为了两个类型:系统异常和外部中断。并将所有中断通过一个表编排起来,称之为stm32中断向量表
系统异常体现在内核水平,故也叫内核异常
外部中断体现在外设水平
内核异常不能够被打断,不能被设置优先级(也就是说优先级是凌驾于外部中断之上的)。常见的内核异常有以下几种:复位(reset),不可屏蔽中断(NMI),硬错误(Hardfault),其他的也可以在表上找到。
外部中断包含线中断,定时器中断,I2C,SPI等所有的外设中断,可配置优先级
接下来讨论的都是外部中断
一般情况下中断和异常可以混用,不做区分
注意中断一定是终止内核的工作
中英文对照
Interrupt
异常服务例程(ESR):Exception service routine
系统控制块(System Control Block)
应用程序中断及复位控制寄存器 AIRCR:Application Interrupt and Reset Control register
PRIGROUP:PriorityGroup
API(Application Programming Interface,应用程序接口):是一些预先定义的函数
对中断的理解
有关单片机中断系统的概念:什么是中断,我们从一个生活中的例程引入。你正在家中看书,突然电话铃响了,你放下书本,去接电话,和来电话的人交谈,然后放下电话,回来继续看你的书。这就是生活中的“中断”的现象,就是正常的工作过程被外部的事件打断了。仔细研究一下生活中的中断,对于我们学习单片机的中断也很有好处。

第一、什么可经引起中断,生活中很多事件能引起中断:有人按了门铃了,电话铃响了,你的闹钟闹响了,你烧的水开了….等等诸如此类的事件,我们把能引起中断的称之为中断源。

第二、中断的嵌套与优先级处理:设想一下,我们正在看书,电话铃响了,同时又有人按了门铃,你该先做那样呢?如果你正是在等一个很重要的电话,你一般不会去理会门铃的,而反之,你正在等一个重要的客人,则可能就不会去理会电话了。如果不是这两者(即不等电话,也不是等人上门),你可能会按你常常的习惯去处理。总之这里存在一个优先级的问题,单片机中也是如此,也有优先级的问题。优先级的问题不仅仅发生在两个中断同时产生的情况,也发生在一个中断已产生,又有一个中断产生的情况,比如你正接电话,有人按门铃的情况,或你正开门与人交谈,又有电话响了情况。考虑一下我们会怎么办吧。

第三、中断的响应过程:当有事件产生,进入中断之前我们必须先记住现在看书的第几页了,或拿一个书签放在当前页的位置,然后去处理不一样的事情(因为处理完了,我们还要回来继续看书):电话铃响我们要到放电话的地方去,门铃响我们要到门那边去,也说是不一样的中断,我们要在不一样的地点处理,而这个地点常常还是固定的。计算机中也是采用的这种办法,五个中断源,每个中断产生后都到一个固定的地方去找处理这个中断的程序,当然在去之前首先要保存下面将执行的指令的地址,以便处理完中断后回到原来的地方继续往下执行程序。具体地说,中断响应能分为以下几个步骤:
1、保护断点,即保存下一将要执行的指令的地址,就是把这个地址送入堆栈。
2、寻找中断入口,根据不一样的中断源所产生的中断,查找不一样的入口地址。
3、执行中断处理程序。
4、中断返回:执行完中断指令后,就从中断处返回到主程序,继续执行。
NVIC
NVIC是主要的中断控制器,外部内部中断均能处理。它跟内核紧密耦合,是内核里面的一个外设。但是各个芯片厂商在设计芯片的时候会对 Cortex-M3内核里面的 NVIC进行裁剪,把不需要的部分去掉,所以说 STM32 的 NVIC 是 Cortex-M3 的 NVIC 的一个子集。

NVIC负责除了SYSTICK之外的所有中断的控制,十分重要!
优先级
分类
分成抢占优先级和子优先级。如果有多个中断同时响应,抢占优先级高的就会抢占 抢占优先级低的 优先得到执行,如果抢占优先级相同,就比较子优先级。如果抢占优先级和子优先级都相同的话,就比较他们的硬件中断编号,编号越小,优先级越高
分组

第0组:所有的4位都有来表示响应优先级,能够配置16种不同的响应优先级。中断优先级则都相同。
第1组:最高一位用来配置抢占优先级,剩余三位用来表示响应优先级。那么就有两种不同的抢占优先级(0和1)和8种不同的响应优先级(0~7)。

第2组:高两位用来配置抢占优先级,低位用来配置响应优先级。那么两种优先级就各有4种。
第3组:高三位用来配置抢占优先级,低位用来配置响应优先级。有8种抢占优先级和2种相应优先级。
第4组:所有位都用来配置抢占优先级,即有16种抢占优先级,没有响应属性
这5种不同的分配方式,根据项目的实际需求来配置。
配置的API如下:
NVIC_PriorityGroupConfig();
其中括号内可以输入以下一个参数,代表不同的分配方式:
NVIC_PriorityGroup_0
NVIC_PriorityGroup_1
NVIC_PriorityGroup_2
NVIC_PriorityGroup_3
NVIC_PriorityGroup_4
初始化NVIC
NVIC_IRQChannel 需要配置的中断向量
NVIC_IRQChannelCmd 使能或者关闭相应中断向量的中断响应
NVIC_IRQChannelPreemptionPriority 配置相应中断向量的抢占优先级
NVIC_IRQChannelSubPriority 配置相应中断的响应优先级
中断编程
misc是大杂烩的意思,misc.c文件中放的就是一些其他文件没有写的东西,其中最重要的就是nvic的相关定义
同时core_cm3.c文件中也有nvic的相关定义
在中断编程中,我们一般不用core_cm3.h中固件库函数,而是采取下面的方法
1.使能中断请求
这个具体由每个外设的相关中断使能位控制
2.初始化 NVIC_InitTypeDef 结构体,配置中断优先级分组,设置抢占优先级和子优先级,使能中断请求
3、编写中断服务函数
为了方便管理我们把中断服务函数统一写在 stm32f10x_it.c 这个库文件中

AFIO
stm32的引脚有两种用途:GPIO(general purpose io通用功能)和AFIO(alternate function io复用功能)
对于一些引脚(视芯片而定),这两种用途都没有,如在64脚产品中,OSC_IN/OSC_OUT与作为GPIO端口的PD0/PD1共用一样的引脚,而在100、144引脚产品中,这四个功能各有引脚与之对应,不互相冲突,所以OSC_IN/OSC_OUT既不作GPIO也不作AFIO
一文看懂stm32的引脚的两种用途:GPIO和AFIO
EXTI
EXTI(External interrupt/event controller)—外部中断/事件控制器
与NVIC不同,EXTI仅处理外部

触发方式

只有上升沿触发、只有下降沿触发或者上升沿和下降沿都触发
中断与事件

输入
EXTI 控制器有 19 个中断/事件输入线【第20个是以太网唤醒事件(只适用互联型)
互联型指的是F105,107等系列】,其中,EXTI0 至 EXTI15 用于 GPIO
当中断被触发后,程序要马上跳转到中断处理函数去执行中断操作,这个函数在工程创建时默认时没有的,需要手动添加。这个函数在startup_stm32f10x_hd.s中

EXTI寄存器
AFIO_EXTICR寄存器组,总共有4 个,因为编译器的寄存器组都是从0 开始编号的,所以EXTICR[0]~ EXTICR[3],对应《STM32参考手册》里的 EXTICR1~ EXTICR 4。每个 EXTICR只用了其低16 位。
编程
1-初始化要连接到EXTI的GPIO
2-初始化EXTI用于产生中断/事件
3-初始化NVIC,用于处理中断
4-编写中断服务函数
5-main函数
SYSTICK:嘀嗒定时器

中英文对照
Tick:发出嘀嗒声

DMA
中英文对照
Memory:存储器 Peripheral:外设 Configuration:配置
SRC:(source):源头 DST(destination):目的地
DIR:(direction):方向
DMA_CPARx(DMA channel x-Peripheral address register):DMA通道x外设地址寄存器(x=1…7)
理解为DMA的第x个通道的外设地址寄存器
同理
DMA_CCARx(DMA channel x-Configuration address register):DMA通道x配置地址寄存器(x=1…7)
PINC:外设地址增量模式 (Peripheral increment mode)
DMA_CNDTRx:(DMA channel x-Number of data to transfer register)DMA通道x(数据)传输数量寄存器(x = 1…7)

DMA配置
DMA(Direct Memory Access,直接存储器访问)用来提供在外设【Peripheral】和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。

数据分为常量和变量,常量放在FLASH中,CPU通过ICode总线读取
变量放在SRAM中,CPU通过DCode总线读取
数据还可被DMA总线读取
取数时经过总线矩阵仲裁,决定哪个总线读取

同时,不同外设之间还可以通过DMA互相读取数据
DMA配置方法1
DMA配置方法2

ADC
中英文对照
ADC-DR :Analog-to-Digital Converter-Data Rigister模拟-数字转换器 数据寄存器
CR:Configuration register配置寄存器
参考例程
ADC

WDG

RTC
RTC:Real_Time Clock 实时时钟
32.768kHz是对应1秒
通讯功能
同步通讯
把时钟信号带入特性方程得到数据状态方程
USART
RS232&RS485
串口、COM口、TTL、RS-232的区别详解
SPI
串行外设接口
Serial peripheral interface

CAN
Controller Area Network

USB

CRC

野火洋桃STM32开发版学习指导完整版相关推荐

  1. AI工程师职业规划和学习路线完整版

    AI工程师职业规划和学习路线完整版 如何成为一名机器学习算法工程师 成为一名合格的开发工程师不是一件简单的事情,需要掌握从开发到调试到优化等一系列能 力,这些能力中的每一项掌握起来都需要足够的努力和经 ...

  2. R语言必看推荐:R语言入门经典版(中文版)+R语言实战第二版(中文完整版)

    R语言入门经典(中文版)R for beginners R语言经典教材 第二版 适合初学者 作者:Emmanuel Paradis R 语言实战第二版(中文完整版) R语言实战(第2版)注重实用性,是 ...

  3. 【剑指offer】Java版代码(完整版)

    参考链接 [剑指offer]Java版代码(完整版)

  4. 中小企业网络管理员实战指南(第2版)PDF完整版全书电子书下载中小企业网络管理员实战指南(第2版)PDF完整版全书电子书下载

    中小企业网络管理员实战指南(第2版)PDF完整版全书电子书下载 中小企业网络管理员实战指南(第2版)PDF完整版全书电子书下载 全书所有的章节 目录                           ...

  5. Arduino开发版学习计划

    制定学习开发版的计划,今天先大体过一下整个教程. http://www.bilibili.com/video/av6105302/ 视频中说可以自己制造亦可卫星放上天. Arduino使用C/C++编 ...

  6. PyTorch核心贡献者开源书:《使用PyTorch进行深度学习》完整版现已发布!

    来源|新智元 [导读]<使用PyTorch进行深度学习>一书的完整版现已发布!教你如何使用PyTorch创建神经网络和深度学习系统,内含图解与代码,操作易上手. 由Luca Antiga. ...

  7. 狂神Redis学习记录 完整版

    [狂神说Java]Redis最新超详细版教程通俗易懂_哔哩哔哩_bilibili笔记资料交流都在我们的平台:www.kuangstudy.com秦疆老师Java全栈系列课程之Redis讲解从Nosql ...

  8. 酒店管理与计算机技术结合,(定稿)某酒店内部管理系统的开发与应用(完整版)...

    <某酒店内部管理系统的开发与应用.doc>由会员分享,可免费在线阅读全文,更多与<(定稿)某酒店内部管理系统的开发与应用(完整版)>相关文档资源请在帮帮文库(www.woc88 ...

  9. 计算机网络谢希仁第七版课后答案完整版 微课视频 配套课件

    课后答案完整版 腾讯文档: https://docs.qq.com/doc/DRXNVYWRDRHN0VExi 如何下载腾讯在线文档? https://blog.csdn.net/COCO56/art ...

最新文章

  1. c语言 指针函数 详解,[NOTE-C]C语言指针详解(一)
  2. STM8S103 PB4和PB5
  3. c语言中if和goto的用法,C语言中if和goto的用法.doc
  4. 计算机网络数据链路层 --- 后退n帧协议(GBN)
  5. Hemberg-lab单细胞转录组数据分析(四)
  6. c语言链表递增,[C语言][PTA][2019Fall] 6-28 递增的整数序列链表的插入 (15 point(s))
  7. filedialog 函数用法
  8. 静态网页制作作业_HTML CSS复习之制作静态网页
  9. java 清单文件 生成,使用批处理文件生成文件列表清单
  10. 编解码格式 -- H264
  11. vim globle
  12. CLion安装 + MinGW 配置 + Opencv安装
  13. 杭州电信域名解析服务器,浙江电信的DNS是多少?
  14. ::ffff:192.168.31.101 是一个什么地址?
  15. 小红书去水印源码算法
  16. 跑分超小米10,“性能旗舰”iQOO 3 5G未发先火!
  17. DFS(深度优先搜索算法)入门
  18. 相关分析-5种常用相关分析方法
  19. jstack: Java占用高CPU分析之- C2 Compiler Thread
  20. Win10通过anaconda安装GPU、CPU版tensorflow

热门文章

  1. 实习周记---20180609
  2. 网易推全球首个公正邮箱 破解电子邮箱出证难
  3. C++11:使用 auto/decltype/result_of使代码可读易维护
  4. Result「?」 返回类型拼接
  5. 1.7 信息化发展与应用
  6. JavaScript的压缩
  7. iframe的属性及其简单使用(点击标签切换页面)
  8. postfix+dovecot+SSL 搭建邮件服务器
  9. 微信门户开发框架-使用指导说明书
  10. 智慧职教云答案在哪里找_智慧职教云课堂上的题答案在哪里能找到?