搜档网
当前位置:搜档网 › STM32-FAQ

STM32-FAQ

STM32-FAQ
STM32-FAQ

©2008 MXCHIP Corporation. All rights reserved.

1. STM32F103CBT6,USB 与CAN 可否可以同时共用?

USB 和CAN 不能同时使用,但可以在同一个应用中分时使用. 这是因为USB 和CAN 使用了相同的RAM 区,同时使用将导致RAM 区数据冲突。

补充一点,ST 的ARM7和ARM9产品中可以同时使用USB 和CAN.

2. 请教 ADC 的输入引脚如何映射的?

Q: 例如:PC5/ADC_IN15 要选择 ADC.

从GPIO 设置为模拟输入。 但就查不到关于ADC_IN15的进一步设置说明了。

在ADC 哪里可以打开ADC_IN15, 但没说明如何让ADC_IN15连接上PC5/ADC_IN15 管脚? 是不是 通道选择ADC_IN15 后 ADC 自动会处理连接管脚 ?

A: 通道选择ADC_IN15后,ADC 自动会处理连接管脚. 你只需要把相应的管脚设置成模拟输入,配置好ADC 的时钟和AFIO 的时钟。

3. STM32的SPI 做为从设备,SCK 接2M 时钟。STM32跑在36MHz 上,现象:当用EXTI 检测到一同步信号后,用SPI_I2S_SendData(新版的库)发送数据时看到MISO 比EXTI 有7‐‐8us 的延后。(EXTI 中断服务程序中就一个函数SPI_I2S_SendData ,EXTI 设为上升沿触发)。

Q: SCK 打开后,STM32的SPI 一直在发数据. 同步信号到来时, SPI 一次16位的数据移位还没移完, 此时SPI 的发送缓冲区为空, 但写SPI1‐>DR 时, 其不马上发送DR 的数据,而是把移位寄存器中的余下的几位数据发完后才再发送SPI1‐>DR 中的数据.

主设备的缺省SCK 时钟为2M, SPI 最快的发送速率小等于2Mbit.

时序图中: 当同步信号到来时, STM32检测到同步信号后, MISO 必须在紧接的16个时钟连续给出16位完整的u16类型数据.(不能是上一次的SPI1 DR 中的后几位和本次SPI1 DR 中的前几位组成的16位数据).

A: 比较好的,也是比较可行的办法是用你的同步信号触发一次DMA 传送.

©2008 MXCHIP Corporation. All rights reserved.

先初始化好SPI 的所有寄存器,包括SPI_DR ,但不使能SPI 模块,利用DMA 向SPI_CR1进行一次传送,使能SPI 模块从而在同步信号之后的时钟周期SPI 发送一次数据,一次SPI 发送结束后产生中断,在中断中关闭SPI ;然后再从新初始化SPI 准备下一次传送,下一个同步信号再次通过DMA 使能SPI 发送下一个数据,如此直到所有数据发送完毕。

SCK 时钟为2MHz ,半个周期为250ns ,同步信号的上升沿至下一个时钟的上升沿这么短的时间(约250ns)必须启动SPI 准备发送,只有DMA 操作能够在这么短的时间中完成这个工作。

4. 有关TIM2,3,4 ×1,2 Multiplier 的问题.

Q: 这是STM32时钟树框图,图中:“TIM2,3,4,5,6,7x1, 2 Multiplier“这个送到定时器的时钟倍频是通过设置哪个寄存器实现,或者是哪个库函数?。

A: 图下面有一段话,

The timer clock frequencies are automatically fixed by hardware. There are two cases:

1. if the APB prescaler is 1, the timer clock frequencies are set to the same frequency as that of the APB domain to which the timers are connected.

2. otherwise, they are set to twice (x2) the frequency of the APB domain to which the timers are connected.

请注意下划线标出的部分,定时器时钟的倍频是通过硬件自动完成的。

5. 关于STM3快速启动的问题.

Q: IC 卡行业,对于启动时间要求比较严格,请问STM32关闭BOD 从上电到运行程序最快多少?

BOD:掉电检测电路,就是判断VCC是否符合规定范围,如果电源是缓慢上升,能控制CPU高过阀值后才启动. 程序就上电先开配置RCC,然后配置GPIO时钟 然后就是置位GPIO口. 请问ST对于启动速度有没有什么详细说明

A: 可以考虑在不配置RCC之前,先对GPIO操作.

首先,STM32复位后,内部的高速RC振荡器开始提供CPU的时钟,根据数据手册LSE的启动时间是1~2us;而使用HSE的话,根据数据手册HSE需要2ms(典型值)才能稳定,可能还要加上PLL的200us锁定时间。因此使用HSI,先对GPIO操作,待时间允许再启动HSE,即可解决问题。(以上数据均可在STM32的数据手册中得到,还有复位时间、上电速率等参数,数据很全的,哈哈~~~~)

其次,如果只是要求上电后,某个I/O脚需要有特定的电平状态,还可以通过外加上拉或下拉的方式解决,因为I/O脚在程序没有配置之前的默认模式是浮空输入,管脚的电平受外加的上拉或下拉电阻控制。

6.M3的CPU支持有符号乘除指令吗?

STM32的乘法指令为单周期的,除法指令根据操作数大小为2~12周期

指令 语义 操作

MUL r0, r1, r2 r0 = (r1 * r2) 乘法,32位结果

MLA r0, r1, r2, r3 r0 = ( r1 * r2) + r3 乘加,32位结果

[U|S]MULL r4, r5, r2, r3 r5:r4 = r2 * r3 乘法,64位结果

[U|S]MLAL r4, r5, r2, r3 r5:r4 = r2 * r3 + r5:r4 乘加,64位结果

SDIV Rd, Rn, Rm Rd = Rn / Rm 有符号除法

UDIV Rd, Rn, Rm Rd = Rn / Rm 无符号除法

乘除法共6条指令形式。

7.关于“事件产生寄存器(TIM1_EGR)”.

对TIMx_EGR的CC1G位置1,它就在通道CC1上产生一个捕获/比较事件.

如果CC1配置为输出,则设置CC1G位相当于模拟产生了一次比较匹配,并相应地产生中断或DMA请求。 如果CC1配置位输入,则设置CC1G位相当于模拟产生了一次输入的触发,当前的计数器值被捕获到TIMx_CCR1寄存器中,并相应地产生中断或DMA请求。

©2008 MXCHIP Corporation. All rights reserved.

8.GPIOx_BSRR和GPIOx_BSR中的Reset的功能有何差别?

Q: 同样可以进行reset,那么这两者使用的时候需要注意些什么吗?

A: 功能上没有区别,只是为了方便写代码.

9.STM32加密性能?

Q: STM32这样对FLASH读出保护后,连程序本身都无法读取自身。这样我们定义常量和数组时,就要必须分散加载,将数组放到不加密的FLASH中,但这些数组常量往往是非常重在的数据。

A: 这样理解是不对的, 请看《STM32F10x的闪存编程手册》

( https://www.sodocs.net/doc/1210559874.html,/stonline/products/literature/ds/13259.pdf .)

在2.4.1节(Read protection)有这样的描述:

This protection is activated by setting an option byte in the information block. Once the protection byte is programmed to a value, Flash memory read accesses are not allowed when the device is in debug mode. All features linked to loading and executing code in RAM are still active (for example, JTAG/SWD, boot in RAM, etc.) and this can be used to disable the read protection (access to the Flash memory still denied).

中文译文为:这项保护是通过设置信息块中的一个选择字节启动的。当保护字节被写入相应的值以后,在调试模式中将不允许读出闪存存储器,所有在RAM中加载和执行的功能(如JTAG/SWD,从RAM启动等)仍然有效,这样可以用于解除读保护(访问闪存仍然被禁止)。

在第2.4.2节还有一张表清楚地列出了读保护和写保护的作用范围, 从文字和列表中可以看出,当读保护生效时CPU执行程序时可以读受保护的Flash区,有两个例外情况:

1)调试执行程序时;

2)从RAM启动并执行程序时。

所以说 “STM32这样对FLASH读出保护后,连程序本身都无法读取自身”的 理解是不对的。

另外, STM32还有一个特别的保护,即对Flash存储区施加读保护后,即使没有启用写保护,Flash的第0~3页也将处于写保护状态,这是为了防止修改复位或中断向量而跳转到RAM区执行非法程序代码。

10.STM32的字对齐问题.

Q: 用STM32的时候,定义一个32位或者16位字在奇地址,后续运算会有问题吗?

试验了一下好像可以在奇地址。是否所有的ARM都可以定义在奇地址呢?

代码如下:

typedef union {

vu8 BB[4];

vu32 WW;

} tIP;

©2008 MXCHIP Corporation. All rights reserved.

tIP AA ,BB, *p;

u8 xBu[10]={ 1,2,3,4,5,6,7,8,9,10};

p=(void *)&xBu[0];

AA.WW=(*p).WW;

p=(void *)&xBu[1];

BB.WW=(*p).WW;

A: 不是所有的ARM都可以的 , 在STM32中,可以分配32位或者16位字在奇地址.

11.STM32F10x中断能否做成电平中断?

STM32F10x的中断不支持电平中断, 所有应用电平中断的场合都可以使用边沿中断.

如果使用电平中断, 问题是CPU如何响应电平中断. 当检测到相应电平时产生中断,但在退出中断后如果相应电平仍然存在,CPU又会进入相应的中断,如此循环,CPU根本没办法处理其它事物。所以电平中断一定要转换到边沿中断。

12.怎样用stm32f103实现三相交流电压Ua、Ub、Uc的软件同步采集?

Q: 怎样用stm32f103实现三相交流电压Ua、Ub、Uc的软件同步采集?以下方案是否可以?

1、时器T1的输入捕获测得Ua的频率,并开启输入捕获中断;

2、当中断发生时,再开启T2,使其设置在输出比较‐时间模式(Output Compare Timing mode),在采样时间间隔内产生中断;

3、在此中断中软件启动AD采样;

4、当一个周期的点采集完成后,又回到步骤1。

A: 使用ADC双模式‐‐注入通道同时采样救可以了,具体如下:

1.配置ADC1的注入通道采样Ua的电压,配置ADC2的注入通道采样Ub的电压;

并且采用TIM1_CC4事件来触发ADC;

2.配置T1的PWM4通道,使其工作在OC模式下;

这样,你只要设置TIM1的PWM4的duty cycle,就可以设定采样点,并且Ua,Ub

是同时采样的。另外,由于Ua+Ub+Uc=0,由此可得到Uc。

©2008 MXCHIP Corporation. All rights reserved.

13.how to: 将STM32 的 PB3 当作GPIO.

STM32F103 的 JTAG, 默认状态是Full SWJ。The default state after reset is “000” (whole pins assigned for a full JTAG‐DP connection).PB3作为JDO,被JTAG占用。在 TRACE Asynchronous mode,PB3还是TRACESWO。 若系统不需要JTAG,将PB3当作GPIO,需要如下设置:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB , ENABLE);

GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);

第一句中的 RCC_APB2Periph_AFIO 设置 AFIOEN(如果没有这一句,后面两句失效)。

如果一个模块的clock DISABLE,那么,寄存器的值也无法读写。

有了上面两句,就可以进一步对PB3进行操作了。

例如

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIOB‐>ODR = 0x08;

14.ADC的输入引脚如何映射的?

Q: 例如:PC5/ADC_IN15 要选择 ADC.

从GPIO 设置为模拟输入。 在ADC哪里可以打开ADC_IN15, 但没说明如何让ADC_IN15连接上PC5/ADC_IN15 管脚? 是不是 通道选择ADC_IN15 后 ADC自动会处理连接管脚 ?

A: 通道选择ADC_IN15后,ADC自动会处理连接管脚. 你只需要把相应的管脚设置成模拟输入,配置好ADC的时钟和AFIO的时钟。

ADC管脚连接不必配置,它是直接连接的;STM32技术参考手册中有内部连接图。所有类型的端口都有内部连接图。

©2008 MXCHIP Corporation. All rights reserved.

©2008 MXCHIP Corporation. All rights reserved.

15. 关于IO 用作复用功能时的时钟设置注意要点.

在使用STM32的外设时,由于IO 口被用作复用功能,但是外设的初始化正确,GPIO 口初始化正确,外设的时钟也已开启,但是外设无法正常运行。

其中最关键的一项,大多数使用者多没有设置,就是某个IO 口被用作外设的接口时,需要开启IO 口的复用功能的时钟,即进行外设、IO 的时钟使能时,需要如下代码

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx | RCC_APB2Periph_AFIO, ENABLE); /* GPIOx and AFIO clock enable */

x ‐‐‐ 为对应的GPIO 口,如:A 、B 、C 、D 、E 。

16. 关于JTAG 速度的问题.

Q: JTAG 速度设置为560KHz 以下,都没有问题,设置为1.1MHz ‐ 9MHz 确实比较容易出问题(JTAG OVERRUN)。但,奇怪的是,设置为18MHz 的话,却没有任何问题,而且速度确实比较快。

A: JTAG 只是嵌入式调试模块的接口, 嵌入式调试模块与CPU 使用的是不同的时钟源,JTAG 的时钟驱动调试模块;从设计上来讲,这是一个典型的异步衔接,因此要求JTAG 的时钟必须小于CPU 的时钟,为了保证可靠的数据传输,STM32的数据手册中规定JTAG 的时钟频率需小于CPU 时钟频率的十分之一。

在刚上电时,STM32使用内部的HSI ,CPU 时钟频率只有8MHz ,因此JTAG 时钟频率不能超过800kHz

当CPU的时钟频率提高到72MHz时,JTAG的时钟频率可以提高到7.2MHz。至于JTAG能够在18MHz运行并不奇怪,这是常见的超频现象,超频可以在某种情况正常工作,但不保证能在所有情况下正常工作。

17.什么是IAP?如何实现IAP?

IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。

通常在用户需要实现IAP功能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通信管道(如USB、USART)接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码。这两部分项目代码都同时烧录在User Flash中,当芯片上电后,首先是第一个项目代码开始运行,它作如下操作:

1)检查是否需要对第二部分代码进行更新

2)如果不需要更新则转到4)

3)执行更新操作

4)跳转到第二部分代码执行

第一部分代码必须通过其它手段,如JTAG或ISP烧入;第二部分代码可以使用第一部分代码IAP功能烧入,也可以和第一部分代码一道烧入,以后需要程序更新是再通过第一部分IAP代码更新。

对于STM32来说,因为它的中断向量表位于程序存储器的最低地址区,为了使第一部分代码能够正确地响应中断,通常会安排第一部分代码处于Flash的开始区域,而第二部分代码紧随其后。

在第二部分代码开始执行时,首先需要把CPU的中断向量表映像到自己的向量表,然后再执行其他的操作。

如果IAP程序被破坏,产品必须返厂才能重新烧写程序,这是很麻烦并且非常耗费时间和金钱的。针对这样的需求,STM32在对Flash区域实行读保护的同时,自动地对用户Flash区的开始4页设置为写保护,这样可以有效地保证IAP程序(第一部分代码)区域不会被意外地破坏。

详细说明请参考: https://www.sodocs.net/doc/1210559874.html,/sbbs/viewthread.php?tid=45&extra=page%3D1 .

18.TIM1高级定时器6step‐pwm?

Q: 在译文中提到:在一个通道上应用互补输出,OCxM、CCxE 和CCxNE 的预装载位有效时,在COM 通信事件发生时,预装载位被传送到影子位;因而你可以预先设置好下一步的配置,并在同一时间更改所有通道的配置。软件修改TIM1_EGR 寄存器中的COM 位或者硬件(在TRGI 的上升沿)设置可以产生COM 事件。

问题:并没有解释什么是6step?

这个在实际中是怎么应用的呢?

A: 6step‐pwm 是BLDC马达的工作模式.

©2008 MXCHIP Corporation. All rights reserved.

19.STM32的DFU文件生成方详解.

第一步,准备好要转换的文件,bmp和wav格式,ST原版的DEMO就是这两种格式,后缀改为.bin (也可不改,只是选文件类型过滤选ALL Files(*.*)).

第二步,运行DFU File Manager,选择第一项(I want to GENERATE a DFU file from S19,HEX,or BIN Files),这个是生成DFU文件,第二项是解压DFU文件,点OK进入下一步。

第三步,左边的三个文本框是产品ID,版本信息,可以不用动它,右边有个Target文本框,这个是选择生成的DFU文件写到哪个存储器里,这个非常重要,一定要写对,前面问DFU不成功的都可能是这个问题,ST原版有三个存储器可写,分别是(0,片内Flash),(1,外部SPI Flash),(2,外部Nor Flash),这里我们选择写到外部Nor Flash里面,所以改为 2,下面是芯片的名称可以不管,只要上面的数字对了就可以,点击Multi BIN...进入下一步。

第四步,这里是添加你要转换的文件了,首先将地址该为你要存放的位置,如64000000,这是nor flash 的起始地址,当然根据你的片选分配的不一样这个地址也是不一样的,然后点右边的...按钮选择一个你要添加的文件点打开,再点Add to list,一个文件就加进来了,下面显示有这个文件的起始地址和结尾地址,要再添加文件就在前一个文件的结尾地址上加1设置为下一个文件的起始地址,这样一直把你要添加的文件加完,点OK返回。点右下方的Generate...按钮选择你要保存DFU文件的目录和输入文件名称再点保存,一个DFU文件就生成了。

这里特别要注意的就是Target目标序号的设置和添加文件时地址的设置要正确,否则就有问题。

20.TIM1的中断优先级.

Q: TIM1用作4路普通定时器,并使能4路TIM1_IT_CC1、TIM1_IT_CC2、TIM1_IT_CC3、TIM1_IT_CC4,这4路中断的优先级是相同的,是否有方法,使他们的优先级不同?

A: 普通中断的优先级是不能互相被打断的,必须是优先级组间才可以. 如果一定要TIM1_IT_CC1的中断可以打断TIM1_IT_CC2的中断,只有在处理TIM1_IT_CC2的中断时,不断查询是否有TIM1_IT_CC1的中断,并转去处理TIM1_IT_CC1的中断。反正这两个中断源是使用同一个中断向量。

21.在STM32F10x下利用IAP升级程序步骤.

这里只粗要说明简单的步骤。

1.从官方网站下载例程

https://www.sodocs.net/doc/1210559874.html,/stonline/products/support/micro/files/an2557.zip下载例程后需要根据自己的电路板修改头文件platform_config.h。主要是根据电路板中实际使用的芯片定义页大小、Flash尺寸大小等。如果这里定义的不对,传输的应用程序将不能进行正确写入,可能会产生校验错误。如果是使用B型的STM32xx开发板,则在头文件开始添加以下一句定义即可。

#define USE_STM3210B_EVAL 1

©2008 MXCHIP Corporation. All rights reserved.

©2008 MXCHIP Corporation. All rights reserved.

2.编写编译应用程序。并在开发环境里指定应用程序起始地址。我用的是Keil MDK ,设置界面如下。

3.在common.h 里修改ApplicationAddress 变量使它的值与实际下载的应用程序起始地址一致。这里定义为#define ApplicationAddress 0x8002000

4.因为MDK 不能直接生成二进制文件,所以还需要用其它工具进行转换一下。这里是利用MDK 自带的fromelf.exe 。在MDK 环境下设置步骤为①打开Options for Target ‘xxxx’对话框,选择User 标签页;②构选Run User Programs After Build/Rebuild 框中的Run #1多选框,在后边的文本框中输入C:\Keil\ARM\BIN31\fromelf.exe ‐‐bin ‐o ..\output\gpio.bin ..\output\gpio.axf ;界面如下:

©2008 MXCHIP Corporation. All rights reserved.

5.根据STM32 IAP 官方应用文档,利用超级终端下载编译好的二制文件。 https://www.sodocs.net/doc/1210559874.html,/stonline/products/literature/an/13588.pdf

22. STM32F10XXX 系列芯片FLASH 加密解密的方法.

A: 一种简便的方法是使用ISP 功能,通过PC 机上的ISP 软件进行加密解密;另一种方法,在用户程序中加入FLASH 加密代码(详细说明请参考STM32F10xxx Flash programming 文档),当程序下载到FLASH 中并运行后,FLASH 就有加密保护了;只有擦除FLASH 后,才能解密。

相关主题