欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STM32学习相关笔记

程序员文章站 2024-03-19 14:35:46
...

这是之前学习STM32开发板过程中一些总结。

1. GPIO

掌握了GPIO口位带的操作,以及相关的寄存器的操作,注意CRL,CRH.是32位寄存器,四位控制一个端口。虽然有公式,但是不需要硬记了~
可以使用为位带操作的寄存器有二部分,包括SRAM和外设。

2. USART操作:

2.1 发送数据的过程:

基本步骤:
(在这之前,还需要开启相应的GPIO和RCC时钟信号)
1. 在USART_CRL寄存器上置位UE位来**USART
2. USART_CR1的M位来定义字长
3. USART_CR2中编程停止位的位数
4. USART_CR1的TE位发送一个空闲帧作为数据的发送,使能TE位
5. USART_BRR寄存器来选择要求的波特率
6. 把要发送的数据写进USART_DR寄存器(此动作清除TXE位)

2.2 接收数据的过程:

基本步骤:
(在这之前,还需要开启相应的GPIO和RCC时钟信号)
1. 在USART_CRL寄存器上置位UE位来**USART
2. USART_CR1的M位来定义字长
3. USART_CR2中编程停止位的位数
4. USART_CR1的TE位发送一个空闲帧作为数据的发送,使能TE
5. USART_BRR寄存器来选择要求的波特率
6. 设置USART_CR1的RE位,**接收器,是他开始寻找起始位,当一个字符被接收到时,RXNE位被置位,表明移位寄存器的内容被转移到起始位,
若RXNEIE位被设置,产生中断,若产生错误,错误标志将被置起。

2.3 波特率的计算:

Tx / Rx 波特率 = FCK/(16*USARTDIV); USARTDIV是一个无符号的定点数
如果需要产生9600bps波特率,假设系统时钟FCK 72MHz,则
USARTDIV = 72000000/9600/16;

总结:发现使用软件仿真可以解决很多细节问题,对程序的理解也比以前加深了不少,不仅仅要知道,而且更需要为什么要这样

3. 硬件下载部分

FLASH下载和RAM下载调试的区别就是,前者速度比RAM速度稍微慢了一点,一个在ROM当中,后者在RAM当中,RAM下载有个缺点:就是掉电数据就消失了。这是一大缺点。
RAM的起始地址:0x20000000 FLASH: 0X08000000

产品的ID号是唯一的,注意要保护版权的问题 ID 0x1FFFF7E9这个是存储ID号的地址的起始地址,是96位的相当于12个字节,所以可以通过for循环来得到12位子节的数据的。
ID_num[0] = (u8 ) (0x1FFFF7E9); //注意前面是吧它强制转换成指针类型,前面一个是获得指针的内容,把它存储在数组当中,
然后在通过PRINTF打印出来,这个ID号可以用作与防止产品的盗版的。或者是安全秘钥的

4. SYSTICK定时器

这个不属于外设,不需要开启相关时钟信号,寄存器也就是四个,具体步骤如下:
1. SysTick_CounterCmd()失能SysTick计数器
2. SysTick_ITConfig() 使能Systick中断
3. 对时钟源和装载值进行配置
4. 对1,2步骤的时钟重新使能.
注意:SysTick_GetFlagStatus()这个是判断是否预装载值向下减到0了
Systick的好处就是:
(1)精准延时
(2)对其他操作系统提供节拍或者说是时钟频率
这里要注意:以上几个函数在固件库3.5版本上面发生了一些改动,由于木有stm32f10x_sysyick.h函数,导致函数出现木有定义的情况,所以这个问题需要解决!!

5. NVIC 中断

(1)为什么需要中断:这是现实生活中的实际
(2)中断的过程:第一个要保护现场然后去执行中断,最后回到发生中断的地方(中断的信号未知,不管主程序执行到哪里)
(3)中断的好处:第一:提高应急;第二:提高效率
CORTEX_M3把中断放在CPU内部,叫做NVIC,内嵌中断,好处就是:速度快,提供一种标准化,STM32自己:同时每个IO可以作为中断源。
中断向量表: 中断名称+中断地址(主要)
中断优先级:抢占优先级(主优先级)+响应中断级(从优先级)
几种发生中断处理的情况:
(1)主优先级不同可以发生嵌套关系,主优先级高的可以打断主优先级低的中断
(2)主优先级相同,若从优先级不同则不能发生嵌套关系,假设一个中断正在执行,那么另一个主优先级相同的中断的不能被打断,必须等待
当前的执行完成之后才可以执行。
(3)主优先级相同,从优先级不同,但是二者同时到达的时候,这时候需要判断二者的从优先级的顺序才行。
(4)主、从优先级都相同,并且中断到达的时间也相同,那么这时候就要看二者在中断向量表的顺序来进行判断了。

这里举一个例子:
假设NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);设置一下主优先1,从优先级3
(1)Enable TIM3 global interrupt with Preemption Priority 0 and SubPriority as 2
(2)Enable USART1 global interrupt with Preemption Priority 1 and SubPriority as 5
(3)Enable RTC global interrupt with Preemption Priority 1 and SubPriority as 7
(4)Enable EXTI4 interrupt with Preemption Priority 1 and SubPriority as 7
我们得到的结果是:
TIM3 interrupt priority is higher than USART1, RTC and EXTI4interrupts priorities. USART1 interrupt priority is higher than RTC
and EXTI4 interrupts priorities. RTC interrupt priority is higherthan EXTI4 interrupt prioriy.
分析:(1)Preemption Priority 0 >Preemption Priority 1 ;
(2)SubPriority as 5 > SubPriority as 7
(3)当主、从优先级都一样时,看中断向量表的排序了
摘录与《STM32固件库手册168页》

4.1 中断分组的概念:可以分成四组,5种情况,分别对主优先级和从优先级个数进行恰当的配置

外部中断编程几个步骤:
(1)对RCC时钟进行配置(包括GPIO口,AFIO,以及相应的外设)
(2)对GPIO口进行正确的配置
(3)对EXTI进行相关的配置(选择,清除中断标志位,触发模式)注意:EXTI_DeInt()不能忘了
(4)对NVIC进行相应的配置
(5)对中断服务子程序进行编写
(6)对main()函数进行正确的编写

5. 定时器

TIM1和TIM8可以产生三路互补的PWM波输出高级定时器,常用于三相电机的驱动,又APB2时钟输出
其他六个定时器用于普通定时器时钟由APB1输出
定时器功能: 定时功能,计数功能,输入捕获,匹配输出,PWM波输出

5.1 通用定时器TIMX

计数模式:向上,向下,上下双向计数模式(这个需要看手册,发生更新的与想象不一样的)

注意之一:

定时器的时钟并不是直接来自APB1,APB2,而是来自一个输入为APB1和APB2的倍频器,目的就是当保证其他
外设使用较低频率时,定时器任然可以使用较高频率。所以,当输入时钟为内部时钟时,可以达到72mhz,而不是APB1
桥最大频率36MHZ

注意之二:

自动重装载寄存器(TIMX_ARR)该寄存器在物理上实际对应着二个寄存器,一个是程序员可以直接操作的,
另外一个是程序员看不到的,叫做影子寄存器,事实上起到真正的作用的是影子寄存器。该寄存器由TIMX_CR1寄存器在
APRE位置,当它为0时,预装载寄存器内容可以随时传送到影子寄存器,此时二者是联通的。当它为1,在每一次更新事件
(UEV)时,才把预装载寄存器的内容传送到影子寄存器当中。

注意之三:

定时器时钟来源:
(1)内部时钟(CK_INT)
(2) 外部时钟模式1: 外部输入脚(TIX)
(3)外部时钟模式2 :外部输入触发(ETR)
(4)内部触发输入,定时器级联操作

注意之四:

定时器溢出时间计算公式:
TOUT = (arr+1) * (psc+1) /tclk;
其中;TOUT 是定时器溢出时间(US).arr:预装载值。psc:分频值。 tclk:定时器输入时钟频率(Mhz)

6. PWM实验:

PWM:脉冲宽度调制

优点:
1、从处理器到被控系统信号都是数字形式的,无需数模转换
2.让信号保持为数字形式的可将噪声影响降到最小,可用于通信方面的
PWM存在二种模式:
模式1和模式2,由TIMX_CCMRx寄存器的OCxM位确定,(110)模式1,111模式2.

PWM输出信号:
PWM输出是一个方波信号,频率由TIMX时钟频率和TIMX_ARR预分频器所决定的,输出信号的占空比由TIMX_CRRX
寄存器所决定的,占空比=TIMX_CRRRX/TIM_ARR *100; 通过向CRR写入适当数来输出方波信号

PWM工作步骤:
(1)设置RCC时钟
(2)设置GPIO口原因是要输出PWM波了,应该设置为GPIO_Mode_AF_PP,若需要重映像的话,需要GPIO_PinRemapConfig()函数
(3)设置TIMX定时器相关寄存器
(4)设置TIMX定时器PWM寄存器
第四步注意:首先设置PWM模式(默认为冻结的)然后设置占空比,在设置输出极性,当设置为HIGH输出信号不返相
为LOW,输出信号反向之后输出,然后使能TIMX输出状态和使能TIMX的PWM输出使能
最后,使用TIM_CMD打开相关外设

PWM模式1,和模式2区别如下:

(1)pwm在模式1向上计数时,一旦TIMX_CNT

7. TFTLCD显示实验

相关步骤:
(1)设置与TFTLCD模块相连接的IO(包含FSMC)
(2)初始化TFT模块,对一系列寄存器进行设置
(3)通过函数将字符和数字显示在TFTCD上面

不论是外部接8还是16位宽设备,FSMC_A[0]永远接外部设备地址A[0].U16的结构体成员变量地址自增相当于增加二个字节。

2.4种不 同的异步时序模型。模式1和模式A区别就是NOE发生一个翻转,原来一直是低电平,现在产生翻转,出现一下高电平。这是区别,
异步模式A的主要作用可以产生不同的读写时序,读的速度比写的慢一点,既可以满足速度的要求,又不需要频繁配置。

主要控制三个寄存器:
FSMC_BCRX 主要对SRAM进行一下总体控制:包含了扩展模式是否使能,写使能,存储器宽度,存储器的种类,存储器使能位
FSMC_BTRX 主要是针对读时序的,包含访问模式,地址保持时间,地址建立时间
FSMC_BWTRX 主要针对写时序的,包含访问模式,地址保持时间,地址建立时间,速度比写的速度稍微快点

FSMC_BCRX和FSMC_BCRX 组成了BTCR[8]寄存器组,
BCTR[0]对应FSMC_BCR1,BTCR[1]对应FSMC_BTR1.其他的一样;
FSMC_BWTRX组成了BWTR[7]:
BWTR[0]->FSMC_BWTR1…..

8. RCC时钟系统与内部结构

四个驱动单元:Cortex内核Icode总线(I_BUS地址总线)D_CODE(D_BUS数据总线)和系统总线(S_BUS)最后还有GP_DMA
三个被动单元: 内部SRAM,内部闪存存储器,AHB的桥,APB1,APB2
总共四个时钟“HSE,HSI,LSI,LSE为什么需要多个时钟,原因就是当一路时钟失效时,系统任可以继续正常工作
使用任何一个外设都需要打开相应时钟,不使用的话关掉时钟,从而降低系统的功耗,实现节能,达到低功耗。
USMART调试实验
使用USMART可以大大减少代码调试的时间,可以通过串口调试助手进行控制,

9 RTC实验:

实时时钟实验。
1.组成部分:RTC主要由二个部分组成的,其一是APB1接口用来和APB1总线相连,APB1接口以APB1总线时钟为时钟;
2.第二个模块(RTC核)由一系列可编程计数器组成的,分成二个,第一个是RTC预分频模块,第二个是32位可编程计数器;
RTC实际应用:可以当做日历或者是报警系统
配置过程: 1. 查询RTOFF(是否允许写操作位)位,直到RTOFF的值变为’1’ 2. 置CNF(是否可以配置标志位)值为1,进入配置模式
3. 对一个或多个RTC寄存器进行写操作 4. 清除CNF标志位,退出配置模式
5. 查询RTOFF,直至RTOFF位变为’1’以确认写操作已经完成。 仅当CNF标志位被清除时,写操作才能进行,
这个过程至少需要3个RTCCLK周期。

先搞清楚PWR和BKP

(1) PWR电源控制:有二种工作电源模式一种是电源供电另一种是后备电源供电
在RTC当中暂时只需要这一个寄存器:PWR_CR第八位DBP :取消后备区域的写保护: 0,禁止写入RTC和后备寄存器;1,允许写入RTC和后备寄存器
PWR_DeInit 将外设PWR寄存器重设为缺省值
PWR_BackupAccessCmd 使能或者失能RTC和后备寄存器访问
(2)备份寄存器BKP
简介:备份寄存器是42个16位寄存器,可以用来存储84个字节用户应用程序数据,也可以用来管理侵入检测和RTC校准功能
复位后,对备份寄存器和RTC的访问将被禁止,执行下列操作可以使你对备份寄存器和RTC的访问。
1.通过设置RCC_APB1ENR的PWREN和BKPEN位打开电源和后备接口时钟;
2.电源控制寄出去你(PWR_CR)的DBP位使能对后备寄存器和RTC访问
注意: 在PC13引脚时(当该引脚不拥护侵入检测时)输出RTC校准时钟,RTC闹钟或者秒钟
寄存器: BKP_RTCCR
位9:ASOS 闹钟或秒输出选择:0,输出RTC闹钟 1,输出秒脉冲
位8:ASOE 允许输出闹钟或秒脉冲
位7: CCO 校准时钟输出 0无影响 1 可以在侵入检测引脚分频后RTC时钟

库函数主要使用:

BKP_RTCOutputConfig 选择在侵入检测管脚上输出的RTC时钟源
BKP_SetRTCCalibrationValue 设置RTC时钟校准值
BKP_WriteBackupRegister 向指定的后备寄存器中写入用户程序数据
BKP_ReadBackupRegister 从指定的后备寄存器中读出数据
BKP_GetFlagStatus 检查侵入检测管脚事件的标志位被设置与否
BKP_ClearFlag 清除侵入检测管脚事件的待处理标志位
BKP_GetITStatus 检查侵入检测中断发生与否
BKP_ClearITPendingBit 清除侵侵入检测中断的待处理位

(3)注意一点:
在系统复位之后,会自动禁止访问后备寄存器和RTC,以防止对后备寄存器意外写操作,所以在设置时间之前,先要取消BKP写保护

总结一下,RTC正常工作的一般步骤:
1. 使能电源时钟和BKP时钟,RCC_APB1Periph_PWR|RCC_APB1Periph_BKP
2. 取消备份区写保护PWR->DBP PWR_BackupAcessCmd(ENABLE)
3. 复位备份区域,开启外部低速振荡器
BKP_DeInit() //复位备份区域
RCC_LSEConfig(RCC_LSE_ON);
4. 选择RTC时钟,并使能
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //选择LSE作为RTC时钟
RCC_RTCCLKCmd(ENABLE); //使能RTC时钟
5. 设置RTC分频,以及配置RTC时钟
6. 更新配置,设置RTC中断分组
7. 编写中断服务程序

10. ADC实验

将模拟量转换为数字量的过程称为模数转换(A/D)转换 被控制对象————–嵌入式控制系统,中间是A/D D/A转换

10.1 ADC: 模数转换器

12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次
连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。
模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。

数据采集系统: 模拟信号采集(传感器+运放电路),A/D转换(多路模拟开关+采样保持+A/D转化器+IO接口) 、数字信号处理(微处理器)
传感器:能够将非电信号装换成电模拟信号(多数为电阻,电容,电感,电压,电流)
A/D转换的原理:采样保持+量化编码(一般装换时间在US级别)
ADC转换器主要参数:分辨率12位 相对精度 转换速度(速度不超过14MHZ)

10.2 通道选择:

ADC多达16路通道,STM32将ADC装换分成二个组,规则组和注入组。规则组相当于你运行的程序,注入组相当于中断,注入组
可以打断规则组的中断,在注入组通道转换完成之后,规则通道才得以继续装换 注入组最多四个通道。

注入组和规则组的区别:

                     规则组             注入组

包含转换次数: 最多16次 最多4次
次序指定寄存器: ADC_SQR1/2/3 ADC_JSQR
数据寄存器: 所有通道公用ADC_DR 每个通道单独ADC_JDRx
软件触发: 置位SWSTART 置位JSWSTART
触发源选择: EXTSEL[3:0] JEXTSEL[3:0]
自动注入: 规则组转换结束之后自动进行

ADC实验
装换模式:
单次转换CONT = 0(单通道、多通道、间隔模式)连续装换 CONT = 1(单通道、多通道、间隔模式)
EG1:如何使用规则通道单次装换实验:
1.若一个规则通道被装换:
(1)转换数据放在16位ADC_DR寄存器当中
(2)EOC(装换结束)标志被设置
(3)若设设置了EOCIE则产生中断
2.若注入组通道被装换
(1)装换数据存储在16位ADC_DRJ1寄存器
(2JEOC(注入转换结束)标志被设置
(3)JEOCIE被设置,则产生中断
然后ADC停止转换(因为是单次装换)
EG2:如何进行单通道的连续转换(注入组暂时不支持连续转换)
1)转换数据放在16位ADC_DR寄存器当中
(2)EOC(装换结束)标志被设置
(3)若设设置了EOCIE则产生中断
(4)继续对该通道进行转换,和单次转换有所不同
注意:只有在规则通道的转换结束时才产生DMA请求,并将转换的数据从ADC_DR寄存器传输到用户指定的目的地址。

ADC寄存器:

ADC_CR1 : SCAN(扫描模式) EOCIE(规则组允许中断位) JEOCIE(注入组允许中断位) DUALMOD3:0 AWDCH[4:0]模拟看门狗通道选择位
ADC_CR2 :ADCON:开关AD转换器(只适用于规则通道) CONT用于设置是否进行连续装换 CAL和RSTCAL用于AD校准 ALIGN用于设置数据对齐 EXTSEL[2:0]启动规则转换组转换的 外部事件
ADC_SMPR1和ADC_SMPR2 用于设置通道0-17采样时间,每个通道占用3个位
ADC_SQR1~3: 规则序列寄存器
ADC_DR :数据寄存器
ADC_SR 状态寄存器
4.ADC装换时间的计算:
Tcovn = 采样时间 + 12.5个周期
其中:Tcovn 为总转换时间 ,采样时间由每个通道的SMP位设置来决定的,EG:当ADCCLK=14MHZ,并且设置1.5个采样周期,得到Tcovn =
1.5+12.5 = 14个周期 = 1US
5. ADC校准:
ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。在校准期间,
在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差。
5 ADC时钟:
RCC_CFGR寄存器控制的,最大速度不可以超过14MHZ
2015.9.8
STM32内部温度传感器
作用:可以测量CPU及周围的温度TA,该温度传感器内部和ADCX_IN16输入通道相连接,此通道把传感器输出的电压转换成数字值,推荐
采样的时间的是17.1US 支持的温度的范围是-40~125度,误差范围是1.5度

工作的步骤:
(1) 选择ADC_IT16作为输入通道
(2) 选择采样的时间大于2.2US,推荐使用17.1US
(3)设置ADC控制器寄存器2 ADC_CR2 TSVREFE位,以唤醒关电模式下的温度传感器
(4) 设置 ADON位启动ADC装换
(5)读ADC数据寄存器的VSENSE 数据结果
(6)得出温度 = (v25-vsense)/avg_slope +25;
其中VSENSE是25度下的数值标准是1.43V,单位是伏,AVG_SLOPE是温度/vense 曲线的平均斜率一般是0.0043

11. 看门狗实验

在嵌入式系统中,由于MCU工作时常常受到外界电磁场的干扰,造成程序的跑飞,从而导致陷入死循环,正常的程序被打断,处于对
单片机运行状态的考虑,产生用于监测程序运行状态的模块,俗称看门狗
IWDG由专用的32KHZ的低速时钟为驱动,以此,即使主时钟发生故障也有效,适合那些需要看门狗作为在主程序之外,可以独立工作,对
时间要求较低的场合。
WWDG:由APB1时钟分频得到的时钟驱动,配置时间窗口检测应用程序非正常的过迟或者过早的行为,适合精确延时的场合

1.IWDG(独立看门狗)
寄存器;
IWDG_KR(键值看门狗)
IWDG_PR(预分频寄存器)
IWDG_RLR(重装载寄存器)
IWDG_SR(状态寄存器)
操作步骤:
1.向IWDG_KR写入0X5555:通过这步骤,取消IWDG_PR和IWDG_RLR写保护操作,使得后面可以操作这二个寄存器,然后设置看门狗的分频系数
和预装载值。
2. 向IWDG_KR写入0XAAAA
通过这句将使STM32重新加载IWDG_RLR的值到看门狗计数器,也可以使用这命令喂狗。
3.向IWDG_KR写入0XCCCC.启动看门狗

12. DAC实验:(只有大容量的才有DAC)

STM32的DAC介绍:数字/模拟转换模块(DAC)是12位数字输入,电压输出的数字/模拟转换器。DAC可以配置为8位或12位模式,
也可以与DMA控制器配合使用。DAC工作在12位模式时,数据可以设置成左对齐或右对齐。DAC模块有2个输出通道,
每个通道都有单独的转换器。在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。

注意:一旦使能DACX通道,相关的GPIO引脚将会自动和DAC模拟输入相连,为了避免寄生的干扰和额外的功耗,引脚PA4和PA5在之前应当设置为模拟输入
DAC_OUT1->PA4 ; DAC_OUT2->PA5

这里注意一下:外部触发事件包括软件触发方式,也就是TENX 位置1,而非外部触发也就是TENX = 0,而不是指软件触发方式,经过一个apb1时钟之后DHR数据传送到DOR当中

13. DMA实验

什么是DMA?(Direct Memory Access)直接存储器传送
定义:将外设的数据不经过CPU直接送入内存储器,或者,从内存储器不经过CPU直接送往外部设备
优点:一次DMA传送只需要执行一个DMA周期,相当于一个总线的读写周期,因而可以满足高速外设数据传输的需要
可以节省时间,同时也可以降低CPU的负担

关于CPU和DMA关系:(CPU和DMA复用一个系统总线)
CPU除了在数据传输开始和结束做一点处理之外,在传输的过程CPU可以进行其他的工作,这样在大部分的时间当中,CPU和输入输出处于并行操作
,因此,整个计算机系统效率提高了不少

DMA传送过程:
1.DMA预处理:CPU向DMA送命令,如DMA方式,主存地址,传送字数,之后CPU执行原来的程序。
2.数据传送: DMA控制下自动完成
3.DMA结束处理:结束DMA传输后,DMA控制器立即把总线控制权交给CPU

通道配置过程:
1. 在DMA_CPARx寄存器中设置外设寄存器的地址。
2. 在DMA_CMARx寄存器中设置数据存储器的地址。
3. 在DMA_CNDTRx寄存器中设置要传输的数据量。
4. 在DMA_CCRx寄存器的PL[1:0]位中设置通道的优先级。
5. 在DMA_CCRx寄存器中设置数据传输的方向、循环模式、外设和存储器的增量模式、外设和存储器的数据宽度、传输一半产生中断或传输完成产生中断。
6. 设置DMA_CCRx寄存器的ENABLE位,启动该通道。
一旦启动了DMA通道,它既可响应连到该通道上的外设的DMA请求。

14. I2C总线

I2C总线由飞利浦公司开发的二线式串行总线,用于连接微控制器及其外围设备,由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据,
在CPU和被控IC,IC和IC之间进行双向传送
I2C总线:
1.数据位有效性规定:SCL在高电平期间,数据线上的数据必须保持稳定,只有在SCL低电平时,SDA才允许变化
2.起始信号:SCL高电平时,SDA由高->低 终止信号: SCL低电平时,SDA 低->高
注意:起始信号和终止信号由主机发送,在起始信号发送之后,总线被占用,在终止信号产生之后,总线处于空闲状态
3.字节传送与应答:每一个字节八位,先传最高位,八位之后随着一个应答位,也就是一帧9位
4.在起始信号发送之后,必须传送一个从机的地址(7位),第八位是数据的传送方向位,0表示主机发送数据,1表示主机接收数据
注意:主机发送地址时候,总线上的每个从机都将这7位地址码和自己的地址进行比较,若相同,则认为自己正被主机寻址,根据R/T位将
自己确定为发送还是接收

注意:虽然STM32自带I2C,但是硬件比较复杂,而且控制起来不是很稳定,所以需要通过软件模拟的方法来仿真。

关于八位数据第八位 0:表示写数据 1:表示读数据

15. SPI实验

定义: SPI是Motorola公司推出的一种同步串行外设接口,用于MCU和各种外围设备以串行方式进行通信 最大18MHZ
SPI是一种环形总线结构,在芯片的管脚上占用了四根线,节约了芯片的管脚,SCK,MOSI,MOSO,CS,数据传输过程只需要一个时钟信号和二条数据线
与普通的串行通讯不同,普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,SPI的片选可以扩充选择16个外设,
DI,SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,
输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输

(1)MISO:Master in slave out 主机输入,从机输出

(2)MOSI(Master out slave in)主机输出,从机输入

(3)SCK –(Serial CLOCK) 时钟信号,由主设备产生;同步时钟,

(4)SS (Slave select)– 从设备使能信号,由主设备控制。 //SCLK信号线只由主设备控制,从设备不能控制信号线

单工,半双工,全双工,同步通信,异步通信
单工:在任何情况下数据只能是一个方向传输,不存在另一种方向的传输
半双工:数据可以双向传输,但是不能同时进行;
全双工:在任何时候数据都可以进行双向传输;
异步通信:通信双方采用不同的时钟,不需要同时进行;
同步通信:通信双方采用相同的时间,速度并且是相同的;

注意:由于SPI和JTAG接口存在公共的情况,所以在使用JLINK时候,需要调换成SW模式,或者使用JATG端口的重映像。

1.SPI主从模式:
设置MSTR(主设备选择)和SPE(使能位)来选择是否工作在主模式下还是从模式下(SPI_CR1寄存器)
在改变CPOL/CPHA位之前,必须清除SPE位将SPI禁 主和从必须配置成相同的时序模式
2.SPI接口可由CPOL和CPHA设定4中不同的传输格式时序
CPOL决定时钟脉冲SCK有效脉冲方式(CPOL:0正脉冲 CPOL:1 负脉冲),CPHA决定数据线MOSI什么时候输出数据或者采集数据,一般有四种模式
3.数据帧的格式:
SPI_CR1寄存器的LSBFIRT位,输出数据是MSB在先还是LSB在先
SPI_CR1寄存器的DFF位,每个数据帧是八位数据还是16位

对SPI_DR寄存器的读操作,将返回接收缓冲器的内容;写入SPI_DR寄存器的数据将被写入发送缓冲器中。

注意一下:SPI1在APB2桥,SPI2,SPI3在APB1桥

SPI主要由二个八位移位寄存器构成环形计数器,必须通过先写入数据,然后再读出数据,这些读写操作,都可以参考W25Q64的手册进行实际的操作。

16. CAN

CAN: 控制器局域网
ISO/OSI基本参照模型:
1.物理层 2.数据链路层 (1,2硬件控制)3.网络层 4.传输层 5.会话层 6.表示层 7.应用层(3,4,5,6,7,软件控制)
ISO11898标准: 通行标准125K~1M CAN高速通信标准; 一般采用闭环控制,需要加120欧姆的终端电阻
ISO11519标准: ISO11519 125k以下的CAN低速标准 一般采用开环控制,一般加2.2K欧的终端电阻

CAND帧的概念:
数据帧:用于数据单元接收传送数据的帧;
遥控帧:用于接收但与向相同ID发送单元请求数据的帧;
错误帧: 用于检测错误向其他单元错误的帧;
过载帧:用于接收单元通知尚未做好准备的帧;
帧间隔:用于数据帧与前面的帧分离的帧

注意: CAN_HIGH和CAN_LOw二根线, 当之间的压差比较低时候逻辑值是高电平(隐性),当压差是比较高的时候(显性),而是低电平,反应的是一种负逻辑的概念