有关STM32/8的FAQ,分享一下

2019-12-10 18:31发布

一、STM32
1、STM32应用场景
答:智能手环、微型四轴、扫地机器人、工业自动化控制等。
2、STM32F103CBT6,USB与CAN可否可以同时共用?
答:USB 和CAN 不能同时使用,但可以在同一个应用中分时使用. 这是因为USB 和CAN 使用了相同的RAM 区,同时使用将导致RAM区数据冲突。
补充一点,ST 的ARM7和ARM9产品中可以同时使用USB 和CAN。

3、STM32F10XXX 系列芯片FLASH 加密解密的方法.
答:一种简便的方法是使用ISP功能,通过PC机上的ISP软件进行加密解密; 另一种方法, 在用户程序中加入FLASH加密代码(详细说明请参考STM32F10xxx Flash programming文档),当程序下载到FLASH中并运行后, FLASH 就有加密保护了;只有擦除FLASH 后,才能解密。
4、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条指令形式。
5、ADC的输入引脚如何映射的?
问:例如:PC5/ADC_IN15要选择ADC。
从GPIO设置为模拟输入。在ADC哪里可以打开ADC_IN15, 但没说明如何让ADC_IN15连接上PC5/ADC_IN15管脚? 是不是 通道选择ADC_IN15 后 ADC自动会处理连接管脚?
答: 通道选择ADC_IN15后,ADC自动会处理连接管脚. 你只需要把相应的管脚设置成模拟输入,配置好ADC的时钟和AFIO的时钟。
ADC管脚连接不必配置,它是直接连接的;STM32技术参考手册中有内部连接图。所有类型的端口都有内部连接图。
6、什么是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程序(第一部分代码)区域不会被意外地破坏。
详细说明请参考: http://www.mxchip.com/sbbs/viewt ... &extra=page%3D1 .

7、STM32的SPI 做为从设备,SCK 接2M 时钟。STM32跑在36MHz 上,现象:当用EXTI  检测到一同步信号后,用SPI_I2S_SendData(新版的库)发送数据时看到MISO 比EXTI 有7‐‐8us 的延后。(EXTI 中断服务程序中就一个函数SPI_I2S_SendData ,EXTI 设为上升沿触发)。
问: 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位数据).
答:比较好的,也是比较可行的办法是用你的同步信号触发一次DMA 传送.先初始化好SPI的所有寄存器,包括SPI_DR,但不使能SPI模块,利用DMA向SPI_CR1进行一次传送,使能SPI模块从而在同步信号之后的时钟周期SPI发送一次数据,一次SPI发送结束后产生中断,在中断中关闭SPI;然后再从新初始化SPI准备下一次传送,下一个同步信号再次通过DMA使能SPI发送下一个数据,如此直到所有数据发送完毕。SCK时钟为2MHz,半个周期为250ns ,同步信号的上升沿至下一个时钟的上升沿这么短的时间(约250ns)必须启动SPI准备发送,只有DMA操作能够在这么短的时间中完成这个工作。

8、STM32的字对齐问题.
问: 用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;
答:不是所有的ARM都可以的 , 在STM32中,可以分配32位或者16位字在奇地址.

9、STM32F10x 中断能否做成电平中断?
答:STM32F10x 的中断不支持电平中断, 所有应用电平中断的场合都可以使用边沿中断.
如果使用电平中断, 问题是CPU 如何响应电平中断. 当检测到相应电平时产生中断,但在退出中断后如果相应电平仍然存在,CPU 又会进入相应的中断,如此循环, CPU 根本没办法处理其它事物。所以电平中断一定要转换到边沿中断。

10、怎样用stm32f103实现三相交流电压Ua、Ub、Uc的软件同步采集?
问: 怎样用stm32f103实现三相交流电压Ua、Ub、Uc的软件同步采集?以下方案是否可以?
1)时器T1的输入捕获测得Ua的频率,并开启输入捕获中断;
2)当中断发生时,再开启T2,使其设置在输出比较‐时间模式(Output Compare Timing mode),在采样时间间隔内产生中断;
3)在此中断中软件启动AD采样;
4)当一个周期的点采集完成后,又回到步骤1。
答:使用ADC双模式‐‐注入通道同时采样救可以了,具体如下:
1)配置ADC1的注入通道采样Ua的电压,配置ADC2的注入通道采样Ub的电压;
并且采用TIM1_CC4事件来触发ADC;
2)配置T1的PWM4通道,使其工作在OC模式下;
这样,你只要设置TIM1的PWM4的duty cycle,就可以设定采样点,并且Ua,Ub
是同时采样的。另外,由于Ua+Ub+Uc=0,由此可得到Uc。

11、怎样将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;

12、关于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 。
13、关于JTAG 速度的问题.
问:JTAG 速度设置为560KHz 以下,都没有问题,设置为1.1MHz  ‐ 9MHz 确实比较容易出问题(JTAG  OVERRUN)。但,奇怪的是,设置为18MHz 的话,却没有任何问题,而且速度确实比较快。
答:JTAG 只是嵌入式调试模块的接口, 嵌入式调试模块与CPU 使用的是不同的时钟源,JTAG 的时钟驱动调试模块;从设计上来讲,这是一个典型的异步衔接,因此要求JTAG的时钟必须小于CPU的时钟,为了保证可靠的数据传输,STM32的数据手册中规定JTAG的时钟频率需小于CPU时钟频率的十分之一。
在刚上电时,STM32使用内部的HSI ,CPU时钟频率只有8MHz,因此JTAG时钟频率不能超过800kHz,当CPU的时钟频率提高到72MHz时,JTAG的时钟频率可以提高到7.2MHz。至于JTAG能够在18MHz运行并不奇怪,这是常见的超频现象,超频可以在某种情况正常工作,但不保证能在所有情况下正常工作。
14、在STM32F10x下利用IAP升级程序步骤.
答:这里只粗要说明简单的步骤。
1)从官方网站下载例程
http://www.st.com/stonline/produ ... ro/files/an2557.zip下载例程后需要根据自己的电路板修改头文件platform_config.h。主要是根据电路板中实际使用的芯片定义页大小、Flash尺寸大小等。如果这里定义的不对,传输的应用程序将不能进行正确写入,可能会产生校验错误。如果是使用B型的STM32xx开发板,则在头文件开始添加以下一句定义即可。
#define USE_STM3210B_EVAL
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:KeilARMBIN31fromelf.exe ‐‐bin  ‐o  ..outputgpio.bin  ..outputgpio.axf ;界面如下:

5)根据STM32 IAP 官方应用文档,利用超级终端下载编译好的二制文件。 http://www.st.com/stonline/products/literature/an/13588.pdf

15、STM32关于USART的问题
1、STM32103 USART1死机
问:void USART_Receive(USART_TypeDef* USARTx)
{
if (USART_GetFlagStatus(USARTx,USART_FLAG_RXNE)==SET)
{
USART_ClearFlag(USARTx,USART_FLAG_RXNE);
s[0]=USART_ReceiveData(USART1);
delay(1000);
s[1]=USART_ReceiveData(USART1);
delay(1000);
s[2]=USART_ReceiveData(USART1);
delay(1000);
write_char(s[0],s[1],s[2]); //发送数据到PC

//if(s[0]==0xff){GPIO_WriteBit(GPIOE,GPIO_Pin_0,Bit_SET);} // //write_char(s[0],s[1],s[2]);
// query_uart_command(); //命令判断
}
}
上面程序在
发送FF的时候收到FF FF FF
发送FF 22的时候收到FF 22 22
发送FF 22 33时收到FF 22 22
之后再发送数据时串口不响应!!!
答1:你这个程序,你收到第一个字节后,清标志,然后等待接后后面两个没有清标志。这也和两次发送时间 间隔有关
答2:stm32串口有个可以说是bug的地方,就是即使不使能溢出等其他错误中断的情况下,若发生溢出错误,仍会进入中断,而且常规检查中断的方法无法查到中断标志。所以办法就是在串口正常中断处理之后加清除中断的语句。具体网上可以找到。之前因为这个原因,程序经常死掉,结果是死在串口中断处理里,不停中断,有没有清除中断标志哦。

2、STM32F207的串口问题
问:使用官方提供的串口例程时,定义串口2~5都没有问题。使用串口1或串口6时,无数据输出。TXD线上只是低电平。求解?
答:附上代码。
串口2~5,先提供官方例程
按照例程,将串口3改为串口1后,串口1不能工作,TXD线上是低电平,
仿真时发现,程序停留在
while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TXE) == RESET)
{
}
这个地方。
串口1的引脚定义是PA.09,PA.10
答1:RCC_APB2PeriphClockCmd(RCC_APB2Periph_USARTx, ENABLE) for USART1 and USART6 * RCC_APB1PeriphClockCmd(RCC_APB1Periph_USARTx, ENABLE) for USART2, USART3, UART4 or UART5. *

3、stm32中的串口通信中的USART_WordLength,数据位的长度包不包括开始位哪些?
问:stm32中的串口通信中的USART_WordLength,数据位的长度包不包括开始位哪些?
答:不包括开始位,如果你有 校验(奇 偶)的话,数据位是包括校验位的。USART_WordLength 这个是可以设 9

4、stm32的DMA 到usart
问:把一个数组的数据传输到USART。设为Circular时,DMA是不是会自动不停的传输数据?既是main函数里没有调用传输,DMA也会不停把数组的数据传给USART?不受main控制?DMA数据传输还是受CPU的控制的?需要认为的调用?
答:设置成循环的只是说当数据传输量寄存器里面的内容变为零会重新加载,然后重新传输,但是这一切前提都是进行了设置和使能(这里应该是DMA请求,我还没看出来别的使能方式,正在学习呵呵),但是记住只有再怎么写好设置的子函数或者说模块,如果没有main里调用,不会运行的,因为单片机只执行MAIN里的函数,如果没有调用语句,是不会自己跑到DMA设置子函数里的,也就是说不会不断执行。人为调用,设置一下各个寄存器,有传输的来源和目的设置有传输数据量设置等等,设置完了,开启就可以了,CPU可以去干别的,看一下参考手册就知道了。

5、STM32串口接收程序
问:在STM32串口接收程序里 USART_GetFlagStatus(USART1,USART_FLAG_ORE)==RESET 这句语句是什么意思?
答:查寻串口标志,为0还是1,reset 为0,set 为1,还有清除标志位的作用

6、STM32F10XX系列SPI和USART区别。
问:STM32F10XX系列SPI和USART区别?我想用USATR对SD卡进行读写是否可行?我用USART的同步方式跟SPI是一样的吗?我用的STM32中的USART可以接SPI设备,它是一个同步/异步收发器。我在看开发板时看到有开发板是用SPI对SD卡进行操作的。应该是用的SD卡的MMC/SPI模式。只是没有见到用它的USART读写SD卡的例子,不知道哪有这方面的资料。
答:请先SPI和USART都没有搞清楚,再搞用USATR对SD卡进行读写,我不知道你的sd卡是哪个型号,但是一般的存贮器件不会采用uart口的,SD卡是用来存储大容量数据的,读写数据在速度在要求快,而uart口的速度一般不会很快,你看看你的串口调试助手就知道了,上面有波特率,所以sd卡不会用uart口来读写的,再说了,用什么口来读写sd卡都是一样的,你只要按照datasheet 的命令格式给卡发送命令就可以操作它了,建议不要纠结这个问题!

16、关于STM32的JLINK问题
1、使用JTAG download程序至STM32F205XX(with Cortex-M3)
问:若想使用JTAG interface下载程序至STM32F205XX的板子,似乎一般是通过SEGGER的J-link,是否可使用其他的JTAG-USB下载线如Altera出的USB Blaster? 又是否只要符合JTAG规范的传输线皆可?
答:只要支持M3并且支持STM32F2XX系列就可以,不一定非要JTAG,也可以使用SWD。

17、关于STM32的PWM问题
1、STM32F10X定时器PWM输入模式测量频率、占空比精度问题
问:今天使用了STM32F10X定时器PWM输入模式,用来测量输入方波信号的频率和占空比,发现精度不高,设置定时器的时钟频率为36MHz,预分频为35,计数频率为1MHz,即精度为1us,当输入信号为500Hz时,测量值为500Hz,当输入信号为1KHz时,测量值为1000.1,当输入信号频率继续增加时,测量误差越大,之后提高定时器的技术频率为72MHz,精度有提高,但是输入信号频率增加,误差越大,同时对于低频信号需要使用更新中断才能处理。
请假各位大侠是如何处理精度和低频信号测量的问题?
答:能不能看看你的代码配置。还有要注意TIM的范围,可能约接近最大值,误差可能会有所变化。
答:设置为:PWM输入模式,计数精度为1us ,没有考虑溢出的情况,同时也没有使用低于500Hz的信号做测试,当提高技术精度为100ms甚至更小时,相同频率下误差减小,但是误差还是随着频率增加而变大,然后自己看了Datasheet,发现里面有一句这样的话:TI1的上升沿和计数器实际复位之间的延时,取决于TI1输入端的重同步电路,也就是说肯定有延时,而且延时不确定,当测量频率越高时,延时对结果的影响自然越大。另外我使用捕获功能来测量频率,考虑溢出,计数精度1us,在100KHz内,基本上没有误差。

2、stm32f103 PWM互补通道问题。
问: stm32PWM 互补通道在禁止输出时可不可以均默认为高或变为浮空输入通道 不要在每次发生通道变换时认为的去修改寄存器!
答:函数TIM1_ForcedOC1Config可以,看下固件库手册,没问题的!

3、STM32的DAC输出脉冲
问:STM32的DAC上电时输出一个幅值100mV,脉宽5ms的脉冲,影响后面电路的工作,怎么去掉这个脉冲呢?
答:关闭DAC波形输出

4、PWM input capture
问:在测试PWM input capture时,使用TIM3—CH2通道,则IC1和IC2影射到TI2上,此时CCR2 register捕获PWM的period,CCR1 register捕获PWM的duty cycle,IC1和IC2开始捕获计数。如果这个PWM的周期比较长,IC2计数值超过65535溢出之后会怎么办?溢出的值是不是舍弃掉了?还能通过CCR1/CCR2这个公式来计算占空比吗?
答:溢出以后会将产生中断,如果周期比较长,建议使用计数器来判断。或者降低模块频率。

18、关于STM32的中断问题
1、STM32的EXIT的库函数
问:EXTI_GetFlagStatus和EXTI_GetITStatus区别是什么?
答:一个是获取状态也的,一个是获取中断的。你可以看一下函数上面的说明。

2、STM32的外部中断
问:STM32的外部中断响应的最大频率是多少?
答:应该是2-3个机器周期。

3、判断中断是否会被响应的依据是什么?
答:1)首先是占先式优先级,其次是副优先级; 2)占先式优先级决定是否会有中断嵌套; 3)Reset、NMI、Hard Fault 优先级为负(高于普通中断优先级)且不可调整。

4、什么是占先式优先级?
答:占先式优先级(pre-emption priority): 高占先式优先级的中断事件会打断当前的主程序/中断程序运行——抢断式优先响应,俗称中断嵌套。

5、什么是副优先级?
答:副优先级(subpriority):1、在占先式优先级相同的情况下,高副优先级的中断优先被响应; 2、在占先式优先级相同的情况下,如果有低副优先级中断正在执行,高副优先级的中断要等待已被响应的低副优先级中断执行结束后才能得到响应——非抢断式响应(不能嵌套)。

6、中断不进入是什么原因?
答:1)未开启接收中断; 2)未配置中断向量开启。

19、关于STM32的I2C问题。
1、I2C上电过程故障,复位后即正常,有可能是什么原因?
问: I2C1总线上挂有一片24C02(Addr:0xA0)和另一个I2C总线器件(Addr:0xAC),上电后配置完毕I2C1(库操作,100K)后既执行24C02的读写,完毕后,执行另一I2C器件的读写。
现象1:每次断电、再重新上电后,程序一直停在24C02的写过程中,另一片I2C芯片也不响应;
现象2:如果是直接按复位键,则程序可以顺利执行,并且两片I2C器件均可正常访问和读取。
请问:有可能是什么原因造成这样的问题,SCK速度100K,示波器显示SCK为50%占空比。
答:这个问题是,由于上次写E2的时候导致I2C总线错误,而E2这个时候并不能正确的接收数据。解决方法,断电的时候或者操作完毕以后将I2C总线停止,或者断电的时候将E2断电。
答:你的电路启动的RESET的时间可能不够。因为你提到按下RESET按键之后就都可以正常工作。表示你的POWER ON Reset有问题。

2、STM32的I2S问题。
问:最近有个项目,想用STM32录播音频,不知道STM32的I2S接口能不能和CODEC的I2S接口,同时录音、播放,就是通过CODEC的AD进来的数据同时发送到CODEC的DA输出。
答:这个是可以的!我用了wm8974!用两个i2s口实现!stm32f4是全双工的!只用一个就行了!

3、I2C上电过程故障,复位后即正常,有可能是什么原因?
问:I2C1总线上挂有一片24C02(Addr:0xA0)和另一个I2C总线器件(Addr:0xAC),上电后配置完毕I2C1(库操作,100K)后既执行24C02的读写,完毕后,执行另一I2C器件的读写。
现象1:每次断电、再重新上电后,程序一直停在24C02的写过程中,另一片I2C芯片也不响应;
现象2:如果是直接按复位键,则程序可以顺利执行,并且两片I2C器件均可正常访问和读取。
请问:有可能是什么原因造成这样的问题,SCK速度100K,示波器显示SCK为50%占空比。
答:这个问题是,由于上次写E2的时候导致I2C总线错误,而E2这个时候并不能正确的接收数据。解决方法,断电的时候或者操作完毕以后将I2C总线停止,或者断电的时候将E2断电。
4、I2S使用的注意事项。
问:I2S使用时需要注意什么?I2S2_WS,I2S2_CK,I2S2_SD,I2S2_MCK如何设置MCK是不是只支持256FS, 对于无法进行编程的I2S解码器,如何设置中断。
最佳答案:
1)小容量和中容量的STM32不支持I2S音频协议。

2)I2S与SPI共用3个引脚:
SD:串行数据(映射至MOSI引脚),用来发送和接收2路时分复用通道的数据;
WS:字选(映射至NSS引脚),主模式下作为数据控制信号输出,从模式下作为输入;
CK:串行时钟(映射至SCK引脚),主模式下作为时钟信号输出,从模式下作为输入。
MCK:主时钟(独立映射),在I2S配置为主模式,寄存器SPI_I2SPR的MCKOE位为’1’时,作为输出额外的时钟信号引脚使用。输出时钟信号的频率预先设置为256 × Fs,其中Fs是音频信号的采样频率。

3)I2S接口与SPI接口使用大致相同的引脚、标志和中断。

5、STM32的I2C奇怪现象。
问:如果先把I2C的相关I/O口配置成通用输入接口,然后在配置成I2C的接口,测试I2C功能正常;但是如果把I/O口先配置成通用输出接口,再配置成I2C接口,测试I2C功能就不正确。
答:I2C的IO口必须要配置成对应的功能,也就是输入,这个时候才能工作。这个是I2C模块必须要配置的,就像串口的IO口,也要配置成对应的传输方向。

6、STMF103 I2S 时钟调整方案。
问:通常音频的采样速率均为44.1K/S,若有72M的时钟,同时需要MCLK输出,这样根据手册FS只能为46.875这样速率精确度太差,误差达到6.29%,是否可以考虑将时钟将为56M,这样可以将FS调整到43.75,误差为0.8%
答:不知道你用的是16位的还是32位的,根据表的值,你选择16位的,44117.65这个值的误差比较小0.04%。 如果选择22.050K/S,22058.822,16位和32位的误差是0.04%。

20、关于STM32的USB问题。
1、stm32f10x usb无法识别
问:我现在用的片子是103t8和开发板的是103vct6的,没有8M的晶振所以我用了6 M的但是程序里面我已经改了,12倍频,usb时钟1.5分频我没动,还是开发板的那部分,1.5k的上拉直连3.3,我把开发板控制usben的管教断开直接接了3.3v上拉也可以识别usb 我做的板子也改了1。5的上拉接3.3v还是不能识别,两个程序的差别只有外部晶振倍频系数不同求解
答:解决这个办法 1、你先用8M晶振试试程序,如果还是不行,就说明当前硬件有问题 2、时钟配置的时候,分频晶振、倍频,然后获得系统时钟,建议你检查一下这段代码,确定系统时钟是72M的。

21、系统时钟的监控和切换的作用是什么?
问:系统时钟的监控和切换的作用是什么?
最佳答案:STM32作为一个可靠稳定的微处理器,但是不能排除由于某些外界特殊因素可能造成STM32的外部振荡器失效,所以在芯片中需要一种包含机制能够在STM32运行时,一旦外部晶体振荡器(HSE)失效,切换STM32的系统时钟源到一个稳定的时钟源,以保证STM32能够继续运行,并进行相应的保护操作。

22、STM32W 的 wireshark 用Mxchip 的ADK-DK 可以充当吗?
答:Wireshark 抓包器需配合MXCHIP的sniffer-W使用,ADK-DK无法充当。


23、STM32的三种低功耗模式是什么?
答:1)睡眠模式Sleep:电压调节器开启,Cortex-M3内核停止运行,外设保持运行态; 2)停止模式Stop:电压调节器可选择性开启,所有外设时钟、PLL、HSI和HSE被关闭,Cortex-M3内核和所有外设停止运行,保留SRAM和寄存器的内容; 3)待机模式Standby:电压调节器关闭、整个1.8v区域断电。除了备份区域和待机电路的寄存器以外,SRAM和寄存器的内容全部丢失。

24、系统时钟的监控和切换的作用是什么?
最佳答案:STM32作为一个可靠稳定的微处理器,但是不能排除由于某些外界特殊因素可能造成STM32的外部振荡器失效,所以在芯片中需要一种包含机制能够在STM32运行时,一旦外部晶体振荡器(HSE)失效,切换STM32的系统时钟源到一个稳定的时钟源,以保证STM32能够继续运行,并进行相应的保护操作。

25、使用JTAG download程序至STM32F205XX(with Cortex-M3)。
问:若想使用JTAG interface下载程序至STM32F205XX的板子,似乎一般是通过SEGGER的J-link,是否可使用其他的JTAG-USB下载线如Altera出的USB Blaster?
又是否只要符合JTAG规范的传输线皆可?
答1:只要支持M3并且支持STM32F2XX系列就可以,不一定非要JTAG,也可以使用SWD。
答2:ARM KEIL ULINK也行,兼容性非常好呀!

26、VDD与VSS的去藕电容如何处理?
答:每对VDD与VSS都必须在尽可能靠近芯片处分别放置一个10nF~100nF的高频瓷介电容 或者,在靠近VDD3和VSS3的地方放置一个4.7μF~10μF的钽电容或瓷介电容。

27、STM32F4系列软件仿真问题。
问:STM32F4系列能用Keil4.54,的debug进行软件仿真吗? 我一仿真,程序指针跳到0x00000000处。很奇怪,而且peripherals菜单选项没有了。请问这是怎么回事?
答:可以。说明你程序有错误,而不能跳到启动。你应该下载一个最新的KEIL。

28、STM32的官方例程在哪下载呢?
答:你好,社区的资料下载栏目,以及论坛里都可以找到。

29、用内部HSI时钟时,外部时钟引脚应该悬空还是接地?
最佳答案:悬空。接地都可以。最好是接地。
30、CPU休眠后无法唤醒。
问:CPU休眠后,RTC无法让它唤醒,外部触发也不能唤醒,示波器测试小晶振,有正常的波形
答:这种情况也有可能是因为你对数组或者指针操作的时候引起的程序错误,而进入硬件错误中断。

31、keil环境下,如何将函数定义到指定的FLASH地址。
问:keil环境下,如何将函数定义到指定的FLASH地址?定义常量变量到指定地址我知道可以通过__attribute__((at(addr))),但是函数的定义不会啊!
答:#program ROM 类似的语句,详情你可以参考帮助

32、仿真问题.
问:keil4 STM32仿真里面怎样给USART1送入数据?
答:软件仿真的话,可以监视到USART1接收的数据。但要是给USART1送入数据的时候我一般用JLINK硬件仿真,加上电脑的串口助手发送。仿真中可以在USART1中设置断点查看数据是否发送成功(中断接收的时候)。

33、关于STM32 寄存器变量 。
问:STM32 寄存器变量 #define __IO volatile __IO uint32_t USART_Rx_Done = 0; USART_Rx_Done = 1;
怎样知道这个寄存器变量的地址,它是一个标志位 应该是有地址的 为什么在KEil中看不到
答:都在标准库里,你只能编译后,工程里包含的库文件才会出来,然后你选中寄存器变量,点右键,然后选择里面一个“涉及此参数”的选择。就可以找到地址了。

二、STM8
STM8A系列
1、STM8A不能从CAN接收中断中唤醒Halt模式
问:我是做车载CAN通信的,使用STM8AF51AA的MCU,但是发现CAN接收中断不能唤醒Halt模式,但是改成Wait模式就可以唤醒,Walt模式的功耗过高,不符合车厂的要求。说明书上是说两种都可以唤醒的,我现在不知道是我的设计有问题还是芯片不支持,哪位大虾遇到这种情况的,可以跟大家一起分享吗?谢谢啦!
答:1、WKUIE中断开启了吗? 2、支持该功能,你怎么判断他没有进入唤醒?第一包的数据会丢失。
答:WKUIE中断已经开启,因为我在Wait模式下可以正常唤醒,所以中断设置是正常的,我在中断函数里面打个断点,等待中断的到来。
答:这个时候仿真不管用。你最好使用LED和串口调试信息。

STM8S系列
1、STM8S加密问题
问:我想问下,STM8S怎么样做到最安全的保密(其内部的程序不被人复制出来)
答:FLASH加密,你可以看手册FLASH加密这一章

2、stm8s 编译器
问:编译的时候出现: FlexLM Cannot find license file.
安装svtd的时候为提示要“license ”,是什么原因?
刚从瑞萨转过来,准备做电机驱动。
答:你的cosmic没有license。

3、Bootloater
问:本人准备用STM8S103K3做一个电视机控制器,需要用到BOOTLOATER,由于是第一次用,本人用的是I2C接口,不知道有没有I2C BOOTLOATER的代码。如果操作。希望高手指点。
答:请参考文档:http://www.st.com/internet/com/T ... NUAL/CD00201192.pdf

STM8L系列
1、STM8L151C8中断问题
问:使用STM8L151C8,使用了PA3和PE3两个中断,配置成PX3中断,想在中断处理函数中判断是PA口的中断还是PE口的中断,但调试时发现单独使用PA3或单独使用PE3都是正常的,一旦把两个中断都打开,就无法进入中断了。请教下STM8L系列单片机是否不能同时出现两个以上的pin3中断?即最多只能支持8个中断呢(pin0~pin7)?
我们实际项目中希望使用19个中断,这是否意味着使用STM8L151C8单片机无法同时实现打开19个中断?

另外使用外部中断时,IO口是否有必要都加上拉或下拉电阻?我有几个中断没有使用下拉电阻(使用的是上升沿中断),结果发现有时候根本没有加高电平就自己进入中断函数了。示波器上观察该IO口上有峰值为0.3V左右的类似正弦波。

答:同一个中断源只能配置一个。中断号为3的,只能配置一个,多个配置需要不同的中断号。比如PA3和PE2可以,但是PA3和PE3是不可以,只能配置一个。

2、STM8有几种看门狗?
问:STM8有几种看门狗?
答:2种,一种是硬件看门狗 WWDG,一种是窗口看门狗IWDG。

3、STM8有几种功耗模式?
问:STM8有几种功耗模式?
答:Wait Fast Active Halt Slow Active Halt Halt

4、STM8支持几种BOOT模式?
问:STM8支持几种BOOT模式?
答:UART, CAN, LIN

5、STM8 是什么架构?
问:STM8 是什么架构?
答:Harvard CISC

6、求助 STM8的常量与变量?
问:假设我有俩数组
const u8 buffer1[5]={0x00,0x01,0x02,0x03,0x04};
u8 buffer2[5];
现在我想让
buffer1数组定义到 0x9000位置上
buffer2数组定义到 0x0100位置上
请问下,这个程序怎么写啊?

答:用#program RAM_DATE这种格式,具体你可以参考帮助文档。另外,有的也可以用buffer1@addr这种方式,但是addr是程序地址.

7、进入SLEEP模式的省电要操作哪些流程?
最佳答案:1、关闭无需等待中断或事件的外设时钟;
2、设置进入机制(Sleep-Now或Sleep-on-Exit);
3、设置系统进入SLEEP模式。

8、STM8 可以使用什么编译器
答:cxstm8 或者STVD
答:Cosmic用的比较多或IAR EWSTM8是一个一整套开发工具,包括一个项目管理器、编辑器和项目创建工具(C语言编译器和链接器)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
迅得电子
1楼-- · 2019-12-10 21:11
没有人,有点尴尬
gzfslt
2楼-- · 2019-12-10 21:55
我没有用stm32/8。 也进来看看有没有什么可以触类旁通的。
luohui5003
3楼-- · 2019-12-11 01:58
赞一个!感谢楼主分享。
迅得电子
4楼-- · 2019-12-11 03:20
 精彩回答 2  元偷偷看……
迅得电子
5楼-- · 2019-12-11 08:17
gzfslt 发表于 2019-5-27 12:36
我没有用stm32/8。 也进来看看有没有什么可以触类旁通的。

欢迎,欢迎哦~
ly830102624
6楼-- · 2019-12-11 09:21
干货分享,楼主无私,点个赞

一周热门 更多>