stm32学习笔记.docx
- 文档编号:11734224
- 上传时间:2023-03-31
- 格式:DOCX
- 页数:33
- 大小:120.89KB
stm32学习笔记.docx
《stm32学习笔记.docx》由会员分享,可在线阅读,更多相关《stm32学习笔记.docx(33页珍藏版)》请在冰豆网上搜索。
stm32学习笔记
Stm32学习笔记—C语言基础部分
1、C语言运算符优先级详细列表
优先级
运算符
名称或含义
使用形式
结合方向
说明
1
[]
数组下标
数组名[常量表达式]
左到右
()
圆括号
(表达式)/函数名(形参表)
.
成员选择(对象)
对象.成员名
->
成员选择(指针)
对象指针->成员名
2
-
负号运算符
-表达式
右到左
单目运算符
(类型)
强制类型转换
(数据类型)表达式
++
自增运算符
++变量名/变量名++
单目运算符
--
自减运算符
--变量名/变量名--
单目运算符
*
取值运算符
*指针变量
单目运算符
&
取地址运算符
&变量名
单目运算符
!
逻辑非运算符
!
表达式
单目运算符
~
按位取反运算符
~表达式
单目运算符
sizeof
长度运算符
sizeof(表达式)
3
/
除
表达式/表达式
左到右
双目运算符
*
乘
表达式*表达式
双目运算符
%
余数(取模)
整型表达式/整型表达式
双目运算符
4
+
加
表达式+表达式
左到右
双目运算符
-
减
表达式-表达式
双目运算符
5
<<
左移
变量<<表达式
左到右
双目运算符
>>
右移
变量>>表达式
双目运算符
6
>
大于
表达式>表达式
左到右
双目运算符
>=
大于等于
表达式>=表达式
双目运算符
<
小于
表达式<表达式
双目运算符
<=
小于等于
表达式<=表达式
双目运算符
7
==
等于
表达式==表达式
左到右
双目运算符
!
=
不等于
表达式!
=表达式
双目运算符
8
&
按位与
表达式&表达式
左到右
双目运算符
9
^
按位异或
表达式^表达式
左到右
双目运算符
10
|
按位或
表达式|表达式
左到右
双目运算符
11
&&
逻辑与
表达式&&表达式
左到右
双目运算符
12
||
逻辑或
表达式||表达式
左到右
双目运算符
13
?
:
条件运算符
表达式1?
表达式2:
表达式3
右到左
三目运算符
14
=
赋值运算符
变量=表达式
右到左
/=
除后赋值
变量/=表达式
*=
乘后赋值
变量*=表达式
%=
取模后赋值
变量%=表达式
+=
加后赋值
变量+=表达式
-=
减后赋值
变量-=表达式
<<=
左移后赋值
变量<<=表达式
>>=
右移后赋值
变量>>=表达式
&=
按位与后赋值
变量&=表达式
^=
按位异或后赋值
变量^=表达式
|=
按位或后赋值
变量|=表达式
15
逗号运算符
表达式,表达式,…
左到右
从左向右顺序运算
2、数组:
在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。
这些按序排列的同类数据元素的集合称为数组。
在C语言中,数组属于构造数据类型。
一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。
因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。
3、在C语言中,字符常量有以下特点:
1)字符常量只能用单引号括起来,不能用双引号或者是括号
2)字符常量只能是单个字符,不能是字符串。
3)字符可以是字符集中任意字符。
但数字被定义为字符之后就不能够参与运算。
如'5'和5是不同的。
'5'是字符常量,不能参与运算。
Stm32学习笔记—GPIO部分
1、函数名GPIO_ReadInputDataBit功能描述读取指定端口管脚的输入
2、对于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复用推挽输出
3、推挽输出:
可以输出高,低电平,连接数字器件;推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止。
高低电平由IC的电源低定。
推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。
输出既可以向负载灌电流,也可以从负载抽取电流。
推拉式输出级既提高电路的负载能力,又提高开关速度。
4、如图所示,推挽放大器的输出级有两个“臂”(两组放大元件),一个“臂”的电流增加时,另一个“臂”的电流则减小,二者的状态轮流转换。
对负载而言,好像是一个“臂”在推,一个“臂”在拉,共同完成电流输出任务。
当输出高电平时,也就是下级负载门输入高电平时,输出端的电流将是下级门从本级电源经VT3拉出。
这样一来,输出高低电平时,VT3一路和VT5一路将交替工作,从而减低了功耗,提高了每个管的承受能力。
又由于不论走哪一路,管子导通电阻都很小,使RC常数很小,转变速度很快。
因此,推拉式输出级既提高电路的负载能力,又提高开关速度。
5、开漏输出:
输出端相当于三极管的集电极.要得到高电平状态需要上拉电阻才行.适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内).
开漏形式的电路有以下几个特点:
利用外部电路的驱动能力,减少IC内部的驱动。
当IC内部MOSFET导通时,驱动电流是从外部的VCC流经Rpull-up,MOSFET到GND。
IC内部仅需很下的栅极驱动电流。
一般来说,开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以改变传输电平。
比如加上上拉电阻就可以提供TTL/CMOS电平输出等。
(上拉电阻的阻值决定了逻辑电平转换的沿的速度。
阻值越大,速度越低功耗越小,所以负载电阻的选择要兼顾功耗和速度。
)
6、3.OPEN-DRAIN提供了灵活的输出方式,但是也有其弱点,就是带来上升沿的延时。
因为上升沿是通过外接上拉无源电阻对负载充电,所以当电阻选择小时延时就小,但功耗大;反之延时大功耗小。
所以如果对延时有要求,则建议用下降沿输出。
7、4.可以将多个开漏输出的Pin,连接到一条线上。
通过一只上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系。
这也是I2C,SMBus等总线判断总线占用状态的原理。
补充:
什么是“线与”?
:
8、在一个结点(线)上,连接一个上拉电阻到电源VCC或VDD和n个NPN或NMOS晶体管的集电极C或漏极D,这些晶体管的发射极E或源极S都接到地线上,只要有一个晶体管饱和,这个结点(线)就被拉到地线电平上.因为这些晶体管的基极注入电流(NPN)或栅极加上高电平(NMOS),晶体管就会饱和,所以这些基极或栅极对这个结点(线)的关系是或非NOR逻辑.如果这个结点后面加一个反相器,就是或OR逻辑.
9、
10、其实可以简单的理解为:
在所有引脚连在一起时,外接一上拉电阻,如果有一个引脚输出为逻辑0,相当于接地,与之并联的回路“相当于被一根导线短路”,所以外电路逻辑电平便为0,只有都为高电平时,与的结果才为逻辑1。
11、关于推挽输出和开漏输出,最后用一幅最简单的图形来概括:
12、该图中左边的便是推挽输出模式,其中比较器输出高电平时下面的PNP三极管截止,而上面NPN三极管导通,输出电平VS+;当比较器输出低电平时则恰恰相反,PNP三极管导通,输出和地相连,为低电平。
右边的则可以理解为开漏输出形式,需要接上拉。
13、
14、浮空输入:
对于浮空输入,一直没找到很权威的解释,只好从以下图中去理解了
15、由于浮空输入一般多用于外部按键输入,结合图上的输入部分电路,我理解为浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的。
16、上拉输入/下拉输入/模拟输入:
这几个概念很好理解,从字面便能轻易读懂。
17、复用开漏输出、复用推挽输出:
可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用)
18、最后总结下使用情况:
19、在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)
20、STM32设置实例:
(1)模拟I2C使用开漏输出_OUT_OD,接上拉电阻,能够正确输出0和1;读值时先GPIO_SetBits(GPIOB,GPIO_Pin_0);拉高,然后可以读IO的值;使用GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0);
(2)如果是无上拉电阻,IO默认是高电平;需要读取IO的值,可以使用带上拉输入_IPU和浮空输入_IN_FLOATING和开漏输出_OUT_OD;
Stm32学习笔记—RCC部分
1、RCC有多种用途,包括时钟设置,外设复位和时钟管理。
2、RTC时钟:
系统时钟:
简单的说,就是芯片系统内部的时钟,程序运行的速度是由它来决定的。
RTC:
实时时钟,如果供电,它会按照自己的精确等级运行的,主要用来做日期时间的显示用。
3、时钟树
4、配置时钟树的方法:
(1)定义一个定义一个定义一个ErrorStatu类型的变量HSEStartUpStatus
(2)将时钟树复位至默认设置
(3)开启HSE晶振;
(4)等待HSE晶振起振稳定,并将起结果保存HSEStartUpStatus变量中;
(5)判断HSE晶振是否起成功
(6)设置HCLKHCLK时钟为时钟为SYSCL的分频
(7)设置PLCK2时钟为时钟为SYSCLK的分频;
(8)设置PLCK1时钟为时钟为SYSCLK的分频;
Stm32学习笔记—AD部分
1、采样保持器:
计算机系统模拟量输入通道中的一种模拟量存储装置。
它是连接采样器和模数转换器的中间环节。
采样器是一种开关电路或装置,它在固定时间点上取出被处理信号的值。
采样保持器则把这个信号值放大后存储起来,保持一段时间,以供模数转换器转换,直到下一个采样时间再取出一个模拟信号值来代替原来的值。
在模数转换器工作期间采样保持器一直保持着转换开始时的输入值,因而能抑制由放大器干扰带来的转换噪声,降低模数转换器的孔径时间,提高模数转换器的精确度和消除转换时间的不准确性。
一般生产过程控制计算机的模拟量输入可能是每秒几十点、几百点,对于大型系统甚至上千点,往往需要高速采样(如5000~10000点/秒)。
为使这些模拟量信号逐个地送到模数转换器,而不至降低被测信号的真实性,必须采用采样保持器。
在低速系统中一般可以省略这种装置。
原理采样保持电路由模拟开关、存储元件和缓冲放大器A组成。
在采样时刻,加到模拟开关上的数字信号为低电平,此时模拟开关被接通,使存储元件(通常是电容器)两端的电压UB随被采样信号UA变化。
当采样间隔终止时,D变为高电平,模拟开关断开,UB则保持在断开瞬间的值不变。
缓冲放大器的作用是放大采样信号,它在电路中的连接方式有两种基本类型:
一种是将信号先放大再存储,另一是先存储再放大。
对理想的采样保持电路,要求开关没有偏移并能随控制信号快速动作,断开的阻抗要无限大,同时还要求存储元件的电压能无延迟地跟踪模拟信号的电压,并可在任意长的时间内保持数值不变。
2、采样频率英文名称:
samplingfrequency定义:
在模数转换器中采样时间间隔的倒数。
3、Ad转换器的分类
4、Ad转换器的技术指标:
转换时间和转换速率分辨率量化误差转换精度
5、Ad位数的选择
6、Ad转换速率的确定
7、工作电压和基准电压
8、Ad的工作模式:
(1)独立模式:
分为单通道单次转换模式、多通道(扫描)单次转换模式、单通道连续转换模式、多通道连续转换模式、注入转换模式
单次转换模式下,ADC只执行一次转换。
在连续转换模式中,当前面ADC转换一结束马上就启动另一次转换。
扫描模式,此模式用来扫描一组模拟通道。
注入转换模式:
当触发方式为软件出发或者外部出发方式时,可以使用此模式。
(2)双adc模式:
分为同时为规则模式、快速交替模式、慢速交替模式、交替触发模式、混合同步注入及+交替模式
9、规则通道和注入通道的区别:
STM32的每个ADC模块通过内部的模拟多路开关,可以切换到不同的输入通道并进行转换。
STM32特别地加入了多种成组转换的模式,可以由程序设置好之后,对多个模拟通道自动地进行逐个地采样转换。
有2种划分转换组的方式:
规则通道组和注入通道组。
通常规则通道组中可以安排最多16个通道,而注入通道组可以安排最多4个通道。
在执行规则通道组扫描转换时,如有例外处理则可启用注入通道组的转换。
一个不太恰当的比喻是:
规则通道组的转换好比是程序的正常执行,而注入通道组的转换则好比是程序正常执行之外的一个中断处理程序。
从系统设计上,测量并显示室内温度的过程中断了测量并显示室外温度的过程,但程序设计上可以在初始化阶段分别设置好不同的转换组,系统运行中不必再变更循环转换的配置,从而达到两个任务互不干扰和快速切换的结果。
可以设想一下,如果没有规则组和注入组的划分,当你按下按钮后,需要从新配置AD循环扫描的通道,然后在施放按钮后需再次配置AD循环扫描的通道。
10、SRAM
SRAM是英文StaticRAM的缩写,即静态随机存储器。
它是一种具有静止存取功能的内存,不需要刷新电路即能保存它内部存储的数据。
11、DMA原理:
DMA(DirectMemoryAccess,直接内存存取)是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依于CPU的大量中断负载。
否则,CPU需要从来源把每一片段的资料复制到暂存器,然后把它们再次写回到新的地方。
在这个时间中,CPU对于其他的工作来说就无法使用。
Stm32学习笔记—CAN部分
1、bxCAN主要特点
支持CAN协议2.0A和2.0B主动模式
波特率最高可达1兆位/秒
支持时间触发通信功能
发送
3个发送邮箱,发送报文的优先级特性可软件配置,发送SOF时刻的时间戳
接收
3级深度的2个接收FIFO,14个位宽可变的过滤器组
标识符列表
FIFO溢出处理方式可配置,记录接收SOF时刻的时间戳,时间触发通信模式,禁止自动重传模式,16位自由运行定时器,可在最后2个数据字节发送时间戳
管理
中断可屏蔽,邮箱占用单独1块地址空间,便于提高软件效率
2、
Stm32学习笔记—TIM部分
1、通用定时器(TIM)
通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。
它适用于多种场合,包括测量输入信号的脉冲长度(输入采集)或者产生输出波形(输出比较和PWM)。
使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。
定时器是完全独立的,而且没有互相共享任何资源。
2、SCB是MDK库文件里面定义的一个结构体,subsystemcontrolblock子系统管理模块
3、TIMER主要是由三部分组成:
时基单元、输入捕获、输出比较,还有两种模式控制功能:
从模式控制和主模式控制。
4、定时器的计数模式:
向上计数模式,
向下计数模式,在向下模式中,计数器从自动装入的值(TIMx_ARR计数器的值)开始向下计数到0,然后从自动装入的值重新开始并且产生一个计数器向下溢出事件。
每次计数器溢出时可以产生更新事件,在TIMx_EGR寄存器中设置UG位(通过软件方式或者使用从模式控制器)也同样可以产生一个更新事件。
设置TIMx_CR1寄存器的UDIS位可以禁止UEV事件。
这样可以避免向预装载寄存器中写入新值时更新影子寄存器。
因此UDIS位被清为0之前不会产生更新事件。
然而,计数器仍会从当前自动加载值重新开始计数,同时预分频器的计数器重新从0开始(但预分频器的速率不能被修改)。
此外,如果设置了TIMx_CR1寄存器中的URS位(选择更新请求),设置UG位将产生一个更新事件UEV但不设置UIF标志(因此不产生中断和DMA请求),这是为了避免在发生捕获事件并清除计数器时,同时产生更新和捕获中断。
当发生更新事件时,所有的寄存器都被更新,并且(根据URS位的设置)更新标志位(TIMx_SR寄存器中的UIF位)也被设置。
中央对齐模式,
5、时基单元包含:
计数器寄存器(TIMx_CNT)
预分频器寄存器(TIMx_PSC),预分频器可以将计数器的时钟频率按1到65536之间的任意值分频。
自动装载寄存器(TIMx_ARR),自动装载寄存器是预先装载的,写或读自动重装载寄存器将访问预装载寄存器。
根据在TIMX_CR1寄存器中的自动装载预装载使能位(ARPE)的设置,预装载寄存器的内容被立即或在每次的更新事件UEV时传送到影子寄存器。
6.可设置时长的定时器的方法
设置计数器的时钟频率。
设置计数器的计数初值。
打开计数器开始计数。
开启中断。
执行中断服务程序
7、通用定时器的时钟来源:
内部时钟(CK_INT)
外部时钟模式1:
外部输入脚(TIx)
外部时钟模式2:
外部触发输入(ETR)
内部触发输入(ITRx):
使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。
8、计数器时钟频率的计算方法
9、从库函数角度设置定时时间
(1)Timx时钟使能:
通用定时器挂在APB1下,通过APB1总线的使能函数来使能,函数为RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,enable)
(2)初始化定时器参数:
设置自动重装值、分频系数和计数方式等,函数原形为:
TIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct)
功能描述:
根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位,输入参数1,TIMx:
x可以是2,3或者4,来选择TIM外设;输入参数2TIM-TimeBase_InitStruct:
指向结构TIM_TimeBaseInitTypeDef的指针,包含了TIMx时间基数单位的配置信息。
TIM_TimeBaseInitTypeDef定义于文件“stm32f10x_tim.h”:
typedefstruct
{
u16TIM_Period;
u16TIM_Prescaler;
u8TIM_ClockDivision;
u16TIM_CounterMode;
}TIM_TimeBaseInitTypeDef;
TIM_Period设置了在下一个更新事件装入活动的自动重装载寄存器周期的值。
它的取值必须在0x0000和0xFFFF之间。
TIM_Prescaler
TIM_Prescaler设置了用来作为TIMx时钟频率除数的预分频值。
它的取值必须在0x0000和0xFFFF之间。
TIM_ClockDivision
TIM_ClockDivision设置了时钟分割
(3)设置timx-dier允许更新中断:
函数原形voidTIM_ITConfig(TIM_TypeDef*TIMx,u16TIM_IT,FunctionalStateNewState)功能描述,使能或者失能指定的TIM中断,输入参数1TIMx:
x可以是2,3或者4,来选择TIM外设;输入参数2,TIM_IT:
待使能或者失能的TIM中断源,输入参数3NewState:
TIMx中断的新状态,这个参数可以取:
ENABLE或者DISABLE
输入参数TIM_IT使能或者失能TIM的中断。
可以取下表的一个或者多个取值的组合作为该参数的值。
TIM_IT_UpdateTIM中断源,TIM_IT_CC1TIM捕获/比较1中断源,TIM_IT_CC2TIM捕获/比较2中断源,TIM_IT_CC3,TIM捕获/比较3中断源TIM_IT_CC4TIM捕获/比较4中断源,TIM_IT_TriggerTIM触发中断源
(4)设置中断优先级,在nvic的寄存器中设置
(5)使能timx
(6)编写中断服务函数
10、TIM_ClearFlag函数原形voidTIM_ClearFlag(TIM_TypeDef*TIMx,u32TIM_FLAG)
功能描述,清除TIMx的待处理标志位,输入参数1,TIMx:
x可以是2,3或者4,来选择TIM外设,输入参数2,TIM_FLAG:
待清除的TIM标志位
TIM_FLAG值:
TIM_FLAG_UpdateTIM更新标志位
TIM_FLAG_CC1TIM捕获/比较1标志位
TIM_FLAG_CC2TIM捕获/比较2标志位
TIM_FLAG_CC3TIM捕获/比较3标志位
TIM_FLAG_CC4TIM捕获/比较4标志位
TIM_FLAG_TriggerTIM触发标志位
TIM_FLAG_CC1OFTIM捕获/比较1溢出标志位
TIM_FLAG_CC2OFTIM捕获/比较2溢出标志位
TIM_FLAG_CC3OFTIM捕获/比较3溢出标志位
TIM_FLAG_CC4OFTIM捕获/比较4溢出标志位
11、函数名:
TIM_GetCounter
函数原形:
u16TIM_GetCounter(TIM_TypeDef*TIMx)
功能描述:
获得TIMx计数器的值
输入参数:
TIMx:
x可以是2,3或者4,来选择TIM外设
12、函数名TIM_GetITStatus
函数原形TIM_GetITStatus(TIM_TypeDef*TIMx,u16TIM_IT)
功能描述检查指定的TIM中断发生与否
输入参数1TIMx:
x可以是2,3或者4,来选择TIM外设
输入参数2TIM_IT:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- stm32 学习 笔记