登录

干货分享 |  那些年你在STM32上被困住的难题,今天我们给你总结了

创易栈 2017-07-24 18:33:45

STM32常见问题连载(一)

辟谣!!!相信这两天很多小伙伴跟小编一样都被ST停止接受订单以及交期延迟到88周的消息刷屏了吧,今天ST官方都出来辟谣啦!各位可以长舒一口气啦!

今天小编在这里给各位准备了STM32常见问答大合集,今天总结分享的是我们的第一期


Q1:STM32的启动流程整么样,下载进去的代码又是怎么运行起来的?


A1:首先明确一点的是,每一种微控制器(处理器)都必须有启动文件,启动文件的作用便是负责执行微控制器从“复位”到“开始执行main函数”中间这段时间(称为启动过程)所必须进行的工作。最为常见的51,AVR或MSP430等微控制器当然也有对应启动文件,但开发环境往往自动完整地提供了这个启动文件,不需要开发人员再行干预启动过程,只需要从main函数开始进行应用程序的设计即可。

对于STM32微控制器,无论是keil还是IAR开发环境,ST公司都提供了现成的直接可用的启动文件,程序开发人员可以直接引用启动文件后直接进行C应用程序的开发。这样能大大减小开发人员从其它微控制器平台跳转至STM32平台,也降低了适应STM32微控制器的难度(对于上一代ARM的当家花旦ARM9,启动文件往往是第一道难啃却又无法逾越的坎)。

相对于ARM上一代的主流ARM7/ARM9内核架构,新一代Cortex内核架构的启动方式有了比较大的变化。ARM7/ARM9内核的控制器在复位后,CPU会从存储空间的绝对地址0x000000取出第一条指令执行复位中断服务程序的方式启动,即固定了复位后的起始地址为0x000000(PC=0x000000)同时中断向量表的位置并不是固定的。而Cortex-M3内核则正好相反,有3种情况:

1、通过boot引脚设置可以将中断向量表定位于SRAM区,即起始地址为0x2000000,同时复位后PC指针位于0x2000000处;

2、通过boot引脚设置可以将中断向量表定位于FLASH区,即起始地址为0x8000000,同时复位后PC指针位于0x8000000处;

3、通过boot引脚设置可以将中断向量表定位于内置Bootloader区,本文不对这种情况做论述;

而Cortex-M3内核规定,起始地址必须存放堆顶指针,而第二个地址则必须存放复位中断入口向量地址,这样在Cortex-M3内核复位后,会自动从起始地址的下一个32位空间取出复位中断入口向量,跳转执行复位中断服务程序。对比ARM7/ARM9内核,Cortex-M3内核则是固定了中断向量表的位置而起始地址是可变化的。


Q2:STM32通过JLink下载bootloader和主程序后程序主程序不能运行!芯片采用的是STM32l152R8,可以通过JLink将两个程序下载成功,bootloader地址为0x8000000,主程序是0x8006000,通过串口调试bootloader可以运行,但是主程序不能运行?


A2:首先,串口调试BL可以运行,说明代码有正确烧入,基本排除硬件上问题。并且前一段代码没有问题,可能的问题是BL代码和主程序代码之间的地址不连续导致。

解决的办法有两种:

一,严格的计算两段代码的大小,下载代码到对应的连续位置上运行。

二,在BL引导代码中指定PC指针跳转到主程序的地址入口。


Q3:如何利用串口实现开发板屏幕上的画面输出到电脑上?


A3:下位机利用串口发送数据到上位机显示的整个过程可以划分为三个部分:1,数据发送;2,数据接收;3,数据格式处理。

1,数据发送:下位机将存放在开发板屏幕的显存的数据取出来,并将数据通过串口发送出去,完成

屏幕缓冲区

->

串口缓冲区

的拷贝处理。

2,数据处理:将显存的数据按照一定的格式(为了后期还原数据使用)进行排列分包,如果传送的图片的数据较大,考虑到实时性,也可以移植压缩解压缩技术,先将数据进行压缩再发送。

3,数据接收:PC端编写上位机(可以使用MFC或者Qt编写),上位机通过串口获取下位机传送过来的数据,将数据按照之前定好的格式进行相应的处理,将处理好的数据保存为特定格式的文件,最后在上位机上调用windows自带的图片浏览器,打开并显示该文件。

整个的系统大致流程图如下:

WechatIMG53.jpeg

Q4:STM32定时器中断,到时间不能按要求进入中断,同样的程序没做改动,在STM32的mini板上可以进定时器中断,但是在自己的板子上有时进得去有时就进不去,为什么啊???!!!


A4:在硬件层次上分析,定时器和硬件相关的主要是定时器的时钟源,通常的习惯都会使用外挂的晶振作为整个系统的时钟源,如果时钟不稳定,就会导致定时器定时不稳,计数错误。

解决办法:检查时钟硬件上的焊接;用示波器抓取分析时钟信号。

从软件层次上分析,主要可能在于对定时器的配置,可以使用IDE(MDK或者IAR)调试观察寄存器的相关配置,包括使能、参数配置、标志位情况等。


Q5:使用MiniSTM32开发板,在拿到板子后,遇到fonterror或者systemfilelost的错误,然后不能进入主界面?


A5:这个问题,一般是因为:下载了老版本的代码,老版本代码有个bug:

jtag插上会影响KEY1按键,导致强制进入字库更新,如果此时没有SD卡,则直接提示font

error了.这就是问题原因.新版本的代码,已经解决这个bug了.解决办法就是加入验证机制,按下KEY1以后,还会弹出提示对话,再次按下KEY0,才会真正更新字库.

解决办法:

在电脑上将光盘:5,SD卡根目录文件

这个文件夹里面的SYSTEM文件夹,拷贝到SD卡根木录,然后再将SD卡插回开发板的SD卡槽,然后按复位,等待系统自动更新即可.更新完成就可以进入主界面了.


Q6:怎样用stm32实现14位精度的AD采样?


A6:可采用过采样技术。

过采样技术是一种以牺牲采样速度来提高ADC分辨率的技术。如果STM32的12位AD,每秒采集10个数据,即采样率为:10/秒。根据过采样技术,每提高1位ADC分辨率,需要增加4倍的采样率。从12位AD提高到14位AD,一共提高了2位,所以需要把采样率提高2*2*2*2=16倍。原来在100mS之内只采集一个数据,现在需要在100mS之内采集16个数据了。然后,我们把这16个数据累加,再把累加值右移2位,这样就得到STM32过采样之后的14位ADC。

需要注意的是,过采样技术会限制输入信号的频率。根据采样定律,采样率最少是输入信号的2倍才能将信号还原。当需要提高n位的ADC分辨率时,采样率又得提高4*n倍。STM32的12位ADC的最高采样率为1MHz,如果要达到14位的ADC分辨率,那么输入信号的频率就不能超过:1M/2/15=31.25KHz。最后提醒:分辨率的提升到14位并不是精度也能提升14位。我自己试过提升到16位的分辨率,但是精度大概只有13、14位的样子。


Q7:STM32移植小灯例程用来控制舵机,调整了PWM的频率为200hz在舵机工作的范围内,修改了占空比值从8到100000,都是往一个方向大死,谁知道是什么原因吗?舵机的工作频率是50到300hz,工作电压为5~7.2V,我用了6V?


A7:一,舵机相关介绍:

舵机的控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。

二,原因分析:

从硬件层次上来看:舵机是否校正了0°的位置:如果舵机一开始0°被放在了最左边位置,当PWM波控制舵机往左打时候,舵机会卡死在位置上不动,也会影响到后续的正常控制,典型的现象是刚开始可以往一边转,卡死在另一边之后,舵机怎么控制都不转动了。

从软件层次上看:舵机控制的PWM波的占空比只有在很小的一段范围内,超过了这段范围之后的PWM波都是无效的。

以180°的伺服为例那么对应的控制关系是这样的:

0.5ms--------------0度;

1.0ms------------45度;

1.5ms------------90度;

2.0ms-----------135度;

2.5ms-----------180度;

三,解决办法:

用示波器抓取PWM波,主要获取两个参数:周期

以及占空比。然后根据自己使用的舵机的技术参

数分析。


Q8:利用stm32f4探索者利用HC04无线蓝牙模块以及我们的摄像头,做了一个无线传输视频的东西,但是关键问题是现在接收到的,也就是电脑上上位机接收到的是隔了六秒钟左右接收到的一张张图片,我想让它的帧率满帧,然后就去改了HC05蓝牙模块的波特率,但是蓝牙模块又不能启动了?


A8:

一,原因分析:从描述的现象上来看,延迟收到图片的原因是因为蓝牙模块透传的速率没办法满足满帧显示。

二,解决办法:

1、提高串口透传的速率,并且采用图像压缩解压缩技术,例如JPEG

静态图像压缩编码便是应用得很广泛的一种编码压缩方法。JPEG

作为国际静态图像压缩标准,是一项成熟的图像编码技术,压缩比例高、失真小、运行速度快且易于实现,因此,被广泛的应用于多媒体、网络传输等多个领域。

2、使用蓝牙模块内部开发,利用SPI、IIC等接口获取图像并传输到上位机。其中IIC接口标准模式下可达到100Kbps,快速模式下可达到400Kbps。SPI接口常用的可以达到4M、8M的传输速率,最快的可以达到18M以上,不过当速率提高了,对于硬件器件以及PCB布局则会有较高的要求。


Q9:使用RTC过程中,发现RTC运行不起来,不管是用LSI还是LSE都不行?

A9:检查方法:使用STM32CUBE图形化界面配置系统的时钟,并且打开RTC的日历功能,并且配置好串口输出,用于打印RTC的读取值。

现象:输出的时分秒都是0,RTC没有走动。测试stm32L433ccu6  stm32L433vct6 stm32F411ret6

都发现存在这样的现象。

原因:在使用STM32Cube配置RTC的时候,如果不对Data进行读取的话,日历的数值会被锁住,也就是需要在代码当中补充上HAL_RTC_GetDate

这个函数值。


Q10:STM32F405RGT6(LQFP64封装)使用STM32F1同样的封装的芯片的原理图,打板子之后,插上仿真器结果发现板子根本识别不到仿真器(Jlink仿真和STLINK仿真都识别不到)。而且数显的Powersupply的电流显示100度mA,CPU表面微微发烫。


A10:首先先说明结论:对于LQFP64封装的STM32F4的VCAP_1和VCAP_2都接地的话会有问题,而必须使用特定容值的电容下拉到地。

具体的原因在于:通过查看STM32F4datasheet中Powersupplyschemes章节的电源的内部Block,发现VCAP_1和VCAP_2是VOLTAGEREGULATOR(调压器)相关的两个引脚,并且外接一个2.2UF的电容再接地。而在STM32F1datasheet中Powersupplyschemes章节的电源的内部Block中,发现F1的电源的Block中没有VCAP,而多了VSS(接地)。在F4当中,VCAP_1和VCAP_2作为专用引脚通过外部电容连接到调压器,所有封装都配有这两个引脚。为激活或停用调压器,必须将特定引脚连接到VSS或VDD。具体引脚与封装有关。通过软件激活时,调压器在复位后始终处于使能状态。


Q11:STM32F103使用CubeMx配置timer3pwm输出后无法调试分析?

A11:使用Cube配置timer3pwm时候,生成的代码__HAL_AFIO_REMAP_TIM3_PARTIAL()修改了AFIO-MAPR寄存器,由于AFIO-MAPR寄存器同时也控制着SWD调试功能的使能和失能功能,在修改的过程中,导致了SWD功能出错。所以这就造成先读再写值可能就变了,是不确定的。这样就可能正好失能了swd功能而出现我们所观察到的配置timer3的复用功能却导致swd功能用不了。


Q12:STM32是用定时器过程中,发现还没有打开定时器,程序自动执行到了定时器中断?


A12:1,检查思路:硬件层次上:检查晶振,定时器的时钟源;软件上:是用软件调试的方法,确定出问题的地方。原因:定时器中断标志未清除的问题,调用TIM_ClearFlag函数之后就不会发生以上问题了。在硬件配置时一定要注意这个问题,不管是其他外围设备的初始化都需要注意。在对外设进行初始化时候,像SPI、USART等初始化的时候会经常加上XXX_DeInit()函数,看来也并非多余,对于硬件初始化是很有必要的,尽管在手册上看到这些值的初始值都是0,但是在应用中还是出现这种问题,在实际的应用当中也需要多加注意。


Q13:移植正点原子STM32F103串口实验章节的代码到自己的开发板上,使用串口和外设串口屏进行信息交互失败?


A13:硬件上:硬件上相关的主要有两部分,一部分是STM32的串口,该部分可以使用硬件调试功能,或者软件仿真去确定硬件上是否存在问题,以及存在的具体问题;另外一部分是串口屏的串口,可以使用PC端的串口上位机,用USB转串口线和串口屏连接,确定是否是串口屏硬件的问题。

软件上:软件上可能存在的问题有:

1,串口相关参数配置的问题,以及串口的使能和中断配置问题;

2,串口屏和STM32串口的波特率设置问题;

3,双方通信采用的数据格式的问题,例如:一边发送字符型的数据,一边以整形的数据作为判断,两边的数据格式没有统一,出现问题;

4,问题说到,移植正点原子的例程去运行,正点原子例程的串口用于与电脑PC端通信,做了一个检验:数据的结尾必须以回车换行符结束,移植的过程当中应该十分小心注意这个问题。


Q14:STM32在一个1ms的中断当中进了多次中断处理程序?代码如下:

voidTIM6_IRQHandler(void)

 //1ms

{

ms_100_cntdbu++;

if((TIM6->SR&0x0001)!=0)//check interrupt source

{

ms_100_cnt++;

TIM6->SR &= ~(1<<0);  

                                                              }

              

}

现象:ms_100_cntdbu =2*  ms_100_cn

结论:1ms内中断近了2次。


A14:APB桥的延迟造成这个现象.

CPU从AHB的角度来看,数据已经写入(清零SR标志),实际上APB上的写操作需要由AHB2APB桥来管理,需要一定时间才能真正完成写操作(SR才能被清零)。那么当CPU退出中断ISR,此时SR还没有真正被清零,此时对应的pending bit仍旧置位,于是又一次触发了中断。

 

解决办法:

1)进入中断后,判断了相应标志位,就clear之,在作后续的处理。

2)如果你硬是要把清标志放在ISR最后,那么为了避免以上情况的发生,写完SR后,再读出来。

 

Q15: STM32图像压缩技术如何实现?

 

A15:图像压缩的技术按照压缩的格式有多重,不同的实现方式也有一定的差异,其中JPEG作为国际静态图像压缩标准,是一项成熟的图像编码技术,压缩比例高、失真小、运行速度快且易于实现,因此,被广泛的应用于多媒体、网络传输等多个领域。在STM32上也应用广泛。

1、图像压缩编码流程

JPEG 为连续色调静止图像压缩编码制定的国际通用标准. 标准包括压缩编码、解码、数据格式三部分,JPEG 定义了两种基本的压缩算法,一种为基于DCT 的有损压缩,包括基本系统、扩展系统. 另一种为预测压缩算法,即无损压缩. 其中,基本DCT 顺序型方式是最常用的压缩方法,其图像压缩编码流程如图1 所示.

图片 1.png

2、基于STM32F4的图像压缩处理

图像压缩处理主要包括:

①图像预处理;

②进行离散余弦变换(DCT);

③量化处理;

④编码;

其中,图像的预处理为了是将原始图像的格式转换成YCrCb空间上;DCT将数据进行优化,降低运算量,提高运算速度;为了实现图像数据的压缩,必须对数据进行量化处理.

量化是多对一的映射,因此会造成图像信息损失;编码是图像压缩的最后一步.

经DCT变换后,图像的大部分能量集中在低频分量部分,而高频分量经过量化出现了一些0,因此,对DC系数和其他63个AC系数采用分别编码.由于相邻8×8块的DC系数之间相关性比较强,采用了差值脉冲编码(DPCM)方法进行DC编码,为了保证低频分量先出现,同时增加连续零的个数,首先对AC系数进行“Z”(Zig-Zag)排序,然后,将8×8的矩阵变成一个1×64的矢量,之后再进行亮度和色度编码。


Q16:GPIO设置为输入上拉模式或者输入浮空模式,不接外部开关量的时候,这几个IO口采集到的应该是高电平,但是经常出现采集到低电平的时候。用万用表测量电压,的确是低电平。用刀型电烙铁重新热一热这几个管脚,能够好一段时间,但是过一段时间后又不定期出错。我是这样分析的:可以排除焊接的问题。因为设置为上拉输入模式时,即使悬空,也应该采集到时高电平。原因到底是什么?


A16:从硬件上看,可能存在的问题有:

1,电路板问题:包括焊接以及原理图上的错误;

2,芯片损坏:导致GPIO工作不正常;

3,电源问题:输入电源不稳定的话,会导致芯片出现一系列的奇怪现象;

从软件上分析:

1,软件上的问题,主要是在芯片配置上的问题:包括引脚端口的模式配置以及时钟等;

2,另外,引脚配置为浮空模式的话,引脚的电平是一个不确定的状态,特别是当你配置成浮空+输入状态,如果芯片内部根据该引脚的电平做出一些类的动作的话,会导致芯片出现不稳定的现象。


Q17:STM32芯片下载一次代码进去之后,第二次就下载不进去了?


A17:首先,排除下芯片硬件上的问题,包括:引脚损坏,接线错误等;

其次,这种问题的出现最常见的原因是由于上一次的代码影响了芯片内部下载电路的配置,也就是所谓的锁死了芯片。

解决办法:

1、检查上一次的代码,确定是否代码中有部分更改了下载电路的配置寄存器;

2、使用SWD或者JLink的复位引脚功能,强制将新代码烧写进入到芯片内部;

3、在IDE下载配置项FlashDownload里面,将下载功能项选择为擦除整块芯片的Flash。


Q18:使用STM32完成红外投影键盘的方案?


A18:一,红外投影键盘实现的原理

系统主要是使用了相似三角形原理进行测距,其实是用了两种激光(一x’x’x’x个可见激光,一个一字红外激光)加一个摄像头,可见激光只是投射出键盘形状,而那个一字红外激光和那个摄像头才是用来检测手指离一字激光的距离的,知道了距离,当然就知道了手指所在的位置,进而就能确定按的那个按键。

图片 2.png

二,STM32上实现首先构件硬件,包括红外发生装置,以及红外x摄像头捕获装置。STM32主要用于控制红外装置的工作,以及对红外摄像头捕获的图像进行处理,从而获取出距离数据。


Q19:STM32UCOSII任务间通讯的方式有哪些,为什么不能直接像裸机开发一样,用变量作为信息传递的媒介呢?


A19:STM32在ucos下是可以通过全局变量来通信的,但是并不推荐这种方式,原因在于ucos系统下完成的操作都是使用一个个的任务,任务之间要求不能互相影响,要具有独立性,否则一个任务在运行,其他的任务又影响了该任务的运行,很容易导致不确定的后果。因此,在ucos下任务都会有自己的任务堆栈,用于保存自身使用的变量,由于在栈上存放的都是局部变量,因此也不会影响到其他的任务。

但是,在很多时候,又要求任务之间要有信息交互。为此usos提供了一系列的任务间通讯的方式,包括有信号量、邮箱、消息、队列、信号量集合等。


Q20:设置STM32PA11位作为输入中断,找不到中断处理函数,怎么办?


A20:STM32的每个IO都可以作为外部中断输入。

STM32的中断控制器支持19个外部中断/事件请求:

线0~15:对应外部IO口的输入中断。

线16:连接到PVD输出。

线17:连接到RTC闹钟事件。

线18:连接到USB唤醒事件。

每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发)触发/屏蔽,专用的状态位。

IO口外部中断在中断向量表中只分配了7个中断向量,也就是只能使用7个中断服务函数:

图片 3.png

从表中可以看出,外部中断线5~9分配一个中断向量,共用一个服务函数,外部中断线10~15分配一个中断向量,共用一个中断服务函数。

因此,中断11号是和EXTI15_10共同使用一个中断入口的,进入后再根据中断状态寄存器去判读具体是哪一号发生了中断事件。


Q21:STM32F107以太网接收中断进不了?把操作系统去掉之后接收中断就进不去了,原来带着操作系统是可以进去的,我的PHY是DP83848,初始化完成之后,以太网的电源灯是亮的,我用pc发数据的时候数据灯也会亮,但是就是进不了中断,驱动程序应该没问题,因为我没有修改,我是在MDK下做的,求指点,谢谢。


A21:检查一下配置,有没有开启中断。


Q22:网络(Ethernet)接口中ETH_PPS_OUT管脚的作用是什么?

A22:标准的MII数据接口有16个引脚分别是TX_ER、RX_ER、TX_EN、RX_DV、TX_CLK、RX_CLK、CRS、COL、TXD[3:0]、RXD[3:0],管理接口MDC、MDIO

而在STM32处理器中没有找到TX_ER管脚并且在处理器上有一个ETH_PPS_OUT管脚.STM32只能配合8线的以太网接口,而十六线的,这个也可以问问代理商,他们会推荐你合适的芯片


Q23:stm32f107/207测试lwip以太网官方的范例发现,复位时如果网线插着,则启动后能正常Ping通板子,复位时如网线未插着,则启动后不能Ping通板子,以太网失效,请问这是什么问题?可以解决吗?我再其他以太网产品上实验过,不插网线复位可以正常使用。

Q23:

1、不插网线怎么通讯?

2、程序中应该增加以太网初始化的处理,当检测到有网线断开或者连接上以后,就要进行以太网的


Q24:你懂STM32的堆栈吗?


A24:首先介绍下堆栈是个什么东西:

堆和栈是两个不一样的东西,不过它们本质都是一片内存区域,只不过这片内存具有自己独特的属性。堆栈都是一种数据项按序排列的数据结构,只能在一端对数据项进行插入和删除。

堆和栈最为突出的特点是两者存放数据类型的不同。

1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

2、堆区(heap)一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收

。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

除此之外,还有一个存放数据的地方叫做静态区,也叫全局区。全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。该区域的数据是等程序结束后由系统进行释放。

好了,接下来说说STM32的堆和栈。首先有两个问题:1,STM32的堆和栈有多大,在哪里定义的;2,STM32的堆栈在空间上的分配以及增长方向又是怎么样的。

对于第一个问题:堆栈的大小是在STM32的启动文件里面定义的。通过汇编伪指令EQU

来定义大小。1.堆和栈大小

定义大小在startup_STM32f2xx.s

Stack_Size

EQU

0x00000800

AREA

STACK,

NOINIT,

READWRITE,

Stack_Mem

SPACE

Stack_Size

__initial_sp

;

Heap

Configuration

;

Heap

Size

(in

Bytes)

;

Heap_Size

EQU

0x00000800

AREA

HEAP,

NOINIT,

READWRITE,

__heap_base

2.堆和栈空间分配

栈:向低地址扩展

堆:向高地址扩展

栈:存函数的临时变量,即局部变量,函数返回时随时有可能被其他函数栈用。所以栈是一种分时轮流使用的存储区,编译器里定义的Stack_Size,是为了限定函数的局部数据活动的范围,操过这么范围有可以跑飞,也就是栈溢出;Stack_Size不影响Hex,更不影响Hex怎么运行的,只是在Debug调试时会提示错。有的人写单片机代码在函数里定义一个大数组

int

buf[8192],栈要是小于8192是会死的很惨。

堆:存的是全局变量,这变量理论上是所有函数都可以访问的,全局变量有的有初始值,但这个值不是存在RAM里的,是存在Hex里,下载到Flash里,上电由代码(编译器生成的汇编代码)搬到RAM去的。使用了malloc时分配情况:

STM32内存分配规律:

从0x20000000开始依次为:静态存储区+堆区+栈区

未使用malloc时分配情况

从0x20000000开始依次为:静态存储区+栈区

全局变量(静态变量)->堆区->栈区。


Q25:STM32内部FLASH可以实现EEPROM为什么有的产品还要加24C02?内部模拟EEPROM有什么弊端吗?各有什么优缺点!


A25:

1、不需要频繁读取写入数据到flash时,可以直接存在内部flash,比如只存一些产品信息;

2、内部FLASH普遍只能擦写10000次,频繁写入数据时比如写入到外部存储器;

3、外部存储器也要分的。铁电贵但是擦写次数高得惊人,e2prom便宜些;

4、存在内部不可靠,可能会误操作擦除。


Q26:FatFs文件系统为何需要ANSI/OEM和Unicode编码的转换?


A26:进行编码转换的原因在于两者对于编码方式的支持。

对于文件系统而言,文件名默认存储方式为Unicode编码,而我们编译器甚至是电脑,用的中文码为GBK。因此想使用交叉运行的话,就必须经过格式的转化。


Q27:主机发送,从机能中断接收。就是从机发送,主机中断接收,主机能进入中断,但是没接收到数据!!!大家帮帮忙!!


A27:SPI是串行外设接口(SerialPeripheralInterface)的缩写。是Motorola公司推出的一种同步串行接口技术,是一种高速的,全双工,同步的通信总线。SPI支持全双工通信、数据传输速率快。但是由于没有指定的流控制,没有应答机制确认是否接收到数据,所以跟IIC总线协议比较在数据可靠性上有一定的缺陷。

SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多

个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共

有的,它们是SDI(数据输入)、SDO(数据输出)、SCLK(时钟)、CS(片选)。

(1)SDO/MOSI

主设备数据输出,从设备数据输入;

(2)SDI/MISO

主设备数据输入,从设备数据输出;

(3)SCLK

时钟信号,由主设备产生;

(4)CS/SS

从设备使能信号,由主设备控制。当有多个从设备的时候,因为每个从设

备上都有一个片选引脚接入到主设备机中,当我们的主设备和某个从设备通信时将需

要将从设备对应的片选引脚电平拉低或者是拉高。

需要说明的是,我们SPI通信有4种不同的模式,不同的从设备可能在出厂是就是配

置为某种模式,这是不能改变的;但我们的通信双方必须是工作在同一模式下,所以我们

可以对我们的主设备的SPI模式进行配置,通过CPOL(时钟极性)和CPHA(时钟相位)来控制我们主设备的通信模式。

根据描述,主机发送,从机能中断接收,说明了SPI的基本的配置没有问题。

从机发送,主机中断接收,主机能进入中断,但是没接收到数据,说明出问题的地方基本可以锁定在主机接收的中断函数里面。

解决:首先再仔细查看下主机中断接收函数的函数体有没有问题;其次使用硬件联调的方式找出问题的所在。


Q28:直流电源的功率因数怎么用单片机测量?


A28:首先,功率因数是指在交流电路中电流与电压的相位差用余弦(cos)值来表示。在直流电路中电压电流同相故不存在功率因数的说法。

如果是在交流电源中使用单片机测量功率因素的话,可以使用三端电压采样分析计算的方法,原理如下:

通过对电压的提取来检测功率因数的原理如图所示,首先采用3个高精度的WB系列数字式交流电压真有效值传感器分别对被测电路的电源电压U1、附加可调电阻RP两端电压U2及负载电压

U3进行检测。可调电阻RP的作用是使附加电阻尽可能小,以减小对被测负载的影响,又可得到数值适当的电压U2满足功率因数计算的要求。由电路理论

[3],可画出电压U_1、U_2和U_3的相量图如右图所示,则COSφ即是被测负载的功率因数。

图片 4.png

根据几何学中的余弦定理可得,

图片4-1.png

由式可知,只要将电压U1、U2、U3经过运算后就可求出负载的功率因数COSa。为减小测量电路的硬件开销,数据的处理与计算由单片机软件完成。


Q29:STM32的USB在不用的时候想把IO复用但是如何关闭USB功能?


A29:在正点原子的例程里面,USB读卡器实验钟,有这个函数:

[mw_shl_code=c,true]//USB使能连接/断线

//enable:0,断开

//

1,允许连接

void

USB_Port_Set(u8

enable)

{

RCC->APB2ENR|=1

//USB使能连接/断线

//enable:0,断开

//

1,允许连接

void

USB_Port_Set(u8

enable)

{

RCC->APB2ENR|=1CRH&=0XFFF00FFF;

GPIOA->CRH|=0X00033000;

PAout(12)=0;

}

}

调用:USB_Port_Set(0);

此时PA11,PA12就可以做普通IO,输出高低电平了。



我们STM32第一期分享就到这里啦!敬请期待我们的第二期。各位如果还有其他常见问题经常遇到,欢迎在公众号留言给小易留言哦!

快来关注吧-1.png

热门文章

copyright@2014-2016 emakerzone.com 粤ICP备16121718号-2 公安局备案 粤公网