Questions tagged «stm32»

STM32是STMicroelectronics的第三个ARM系列。它遵循了较早的基于ARM9E内核的STR9系列和基于ARM7TDMI内核的STR7系列。STM32基于ARM Cortex-M系列内核。

2
STM32F2:Makefile,链接脚本和启动文件组合,而没有商业IDE
我已经使用STM32F2(特别是开发板上的STM32F217IGH6)工作了大约两个月。到目前为止,我最大的问题与“设置”有关,其中包括makefile,链接脚本和启动文件。 特别是,我无法正确设置我的中断向量表,并且无法调用中断处理程序。ST确实提供了针对商业IDE的示例。相反,我使用了GCC工具链的免费Yagarto重新编译(以及OpenOCD通过JTAG加载图像)。 我的主板(或它的近亲)是否有示例项目,其中包含针对非商业IDE(为调用中断处理程序而设置)的适当的makefile,链接程序脚本和启动文件组合?
16 c  stm32  gcc 

5
独立看门狗(IWDG)或窗口看门狗(WWDG)?
我仍在寻找该问题的答案: 为什么stm32 MCU具有完美的看门狗(我的意思是窗口看门狗(WWDG)),却有一个简单的看门狗(独立看门狗(IWDG))? 我发现此页面说: 意法半导体(ST Microelectronics)拥有一系列Cortex-M3器件。M3在低端嵌入式设备中已变得非常流行,ST的STM32F代表了这些部分(尽管WDT是ST的附加组件,并不一定反映其他厂商的实现)。STM32F具有两种不同的保护机制。“独立看门狗”是一种漂亮的香草设计,除了易于使用之外,几乎没有其他用途。但是他们的Window Watchdog提供了更强大的保护。当倒数计时器到期时,将产生复位,可以通过重新装入计时器来阻止复位。没什么特别的。但是,如果重新加载太快,系统也会重置。在这种情况下,“太快”由一个值编程到控制寄存器中。 另一个很酷的功能:它可以在重置之前生成中断。编写一些代码来捕获中断,您可以采取一些措施,例如,将系统置于安全状态或快照数据以进行调试。ST建议使用ISR重新加载看门狗-即,踢狗以免复位。不要接受他们的建议。如果程序崩溃,中断处理程序可能会继续正常运行。使用ISR重新加载WDT会使窗口监视程序的全部原因无效。 而这个: 意法半导体的新系列STM32F4 Cortex™-M4 CPU具有两个独立的看门狗。一个由其自身的内部RC振荡器运行。这意味着各种事情都可能在CPU中崩溃,并且WDT仍然会触发。还有一个“窗口监视程序”(WWDT),它需要代码频繁但不频繁地对其进行挠痒痒。这是确保随机写入保护机制的崩溃代码不会引起WDT异常的一种非常有效的方法,并且WWDT可以在断言复位之前不久产生一个中断。 好的,让我们看一下参考手册: STM32F10xxx具有两个嵌入式看门狗外设,这些外设提供了高安全性,定时精度和使用灵活性的组合。两个看门狗外围设备(独立和窗口)都用于检测和解决由于软件故障引起的故障,并在计数器达到给定的超时值时触发系统复位或中断(仅窗口看门狗)。独立的看门狗(IWDG)由其自己的专用低速时钟(LSI)提供时钟,因此即使主时钟发生故障也保持活动状态。窗口看门狗(WWDG)时钟是从APB1时钟开始预分频的,并具有可配置的时间窗,可对其进行编程以检测异常的过早或过早的应用程序行为。IWDG最适合需要看门狗作为主应用程序之外的完全独立进程运行的应用程序,但时序精度约束较低。WWDG最适合要求看门狗在准确的时序窗口内做出反应的应用。 窗口看门狗用于检测软件故障的发生,通常由外部干扰或不可预见的逻辑条件引起,导致应用程序放弃其正常顺序。看门狗电路会在编程的时间段到期时生成MCU复位,除非程序在T6位清零之前刷新倒数计数器的内容。如果在递减计数器达到窗口寄存器值之前刷新(控制寄存器中的)7位递减计数器值,也会产生MCU复位。这意味着必须在有限的窗口中刷新计数器。 如您所见,他们都没有说过为什么有两个看门狗。如果我问这两个看门狗之间有什么区别,您将计算出上面可以看到的所有功能,如果您想对两者进行比较,显然Windows看门狗(WWDG)将是赢家!那么为什么有两个看门狗? 我想知道什么时候应该使用IWDG,什么时候需要WWDG? 并有什么理由告诉我们为什么他们用这个名字叫第二只手表->“ Window watchdog”?

3
建议使用STM32(ARM Cortex M3)上未使用的引脚的默认设置-上拉/下拉?
我们目前正在使用STM32微控制器系列的各种变体。我想知道以下内容: 如果可以选择同时选择上拉或下拉,则一般建议微控制器引脚的默认设置是什么?彼此搭配的利弊是什么?(假设您默认将它们设置为输入) 我特别想知道如何处理STM32微控制器系列中未使用的引脚。对我来说很明显,我们不应该让引脚悬空(数据表说的就是:(),但是我应该将它们设置为上拉输入还是下拉输入吗?特别是,我想选择最不易受到ESD影响的设置,如果可能的话,也要消耗最少的功率。 对于关键引脚,我们应该依靠固件将引脚正确设置为正确的默认状态,还是应该由外部硬件负责(连接外部上拉或下拉)?如果为外部电阻器选择的值大于内部上拉或下拉电阻,则固件中的设置无关紧要。 我可以看到,这样做的好处是,如果微型计算机由于某种原因(有故障的硬件等)未正确初始化,则我们将不依靠固件来正确设置引脚。 我看到的缺点是,硬件成本更高。 您能从上面得到的任何启示将不胜感激。 谢谢..

7
STM32&ST-LINK-成功编程后无法连接到MCU
我已经用STM32F7-45VGT6构建了自己的开发板。我已经使用ST-LINK v2(不是原始版本)成功地对其进行了编程,现在我什至无法连接MCU。 我从ST和SWD界面使用ST-Link Utility。可能是我将SWD引脚用作输出,并在代码中将它们设置为GPIO输出的情况。可以吗? 但是,我将复位引脚连接到GND,并在ST-Link Utility中设置了“在复位下连接”选项,但是它不起作用...我该怎么办? 在Internet上,我发现了一些有关使用BOOT0引脚的信息,但我不完全知道...

4
鉴于内部振荡器要快得多,何时应该为该MCU使用外部晶振?
我正在看这个MCU,想知道使用外部晶振是否有意义。 从数据表pg1中提取, *时钟管理 – 4至32 MHz晶体振荡器 –用于校准的RTC的32 kHz振荡器–带x6 PLL选项的内部8 MHz RC –内部40 kHz RC振荡器 – 内部48 MHz振荡器,基于ext自动调整。同步* 内部振荡器可以高达48Mhz。外部晶体在4-32 Mhz之间。考虑到外部晶振成本高且占用空间,为什么内部晶振快于48Mhz的人会使用外部晶振?什么时候应该使用外部晶体?

1
使用I2C STM32F0 HAL库寻址寄存器
我对使用STM的CUBE和HAL_libraries非常陌生。我正在使用具有32个引脚的STM32F0微控制器。I2C的原理图是正确的。所以在这里我需要一点帮助。 我有一个使用I2C通信的电容传感器(FDC1004)。我必须写这些寄存器才能读取数据。 我该如何正确地将START请求表的主机发送给从机(从机地址为A0)? 如何设置指向0x0C寄存器的指针? 数据表中看到(寄存器0x0C:bit [7:4])为1。)我不知道,该怎么做?最后如何从同一寄存器读取? 另外,在阅读之前,我必须等待DONE_x字段(寄存器0x0C:bits [3:0])吗? 但是我不知道我是否在寻找正确的寄存器!因为我没有从传感器获得任何数据! 这是我的代码: int I2Ccomm () { HAL_I2C_Master_Transmit(&hi2c1,0xA1,0x0C, 10, 100); //start bit and pointer to register HAL_Delay(50); HAL_I2C_Master_Transmit(&hi2c1,0xA1,0x054, 10, 100); // setting the register HAL_Delay(50); HAL_I2C_Master_Receive(&hi2c1, 0xA0, 0x0C, 10, 100); //read from this register HAL_Delay(50); HAL_I2C_Master_Receive(&hi2c1, 0xA0, 0x02, 10, 100); //read data from …

1
了解有关去耦电容器的STM32数据表
我试图了解ST对于STM32F030CC的去耦电容的建议。 数据表中的图显示了Vdd / Vss对上的“ 2x100 nF”电容。这是否意味着每对Vdd / Vss对并联2个100nF电容?还是他们指的是所需的100nF电容的总数,即,如果有2个Vdd / Vss对,那么每个Vdd / Vss对为1 100nF电容,总共2 100nF电容? STM32F030数据表

4
从STM32 MCU获得快速性能
我正在使用STM32F303VC 发现套件,但对其性能感到有些困惑。为了熟悉该系统,我编写了一个非常简单的程序,只是为了测试该MCU的位速。该代码可以分解如下: HSI时钟(8 MHz)已打开; PLL用16的预分频器启动,以实现HSI / 2 * 16 = 64 MHz; PLL被指定为SYSCLK; SYSCLK在MCO引脚(PA8)上进行监视,并且其中一个引脚(PE10)在无限循环中不断切换。 该程序的源代码如下所示: #include "stm32f3xx.h" int main(void) { // Initialize the HSI: RCC->CR |= RCC_CR_HSION; while(!(RCC->CR&RCC_CR_HSIRDY)); // Initialize the LSI: // RCC->CSR |= RCC_CSR_LSION; // while(!(RCC->CSR & RCC_CSR_LSIRDY)); // PLL configuration: RCC->CFGR &= ~RCC_CFGR_PLLSRC; // HSI / 2 …

5
使用内部上拉/下拉电阻器时的注意事项
我正在使用STM32微控制器。这些微控制器可以选择将输入引脚设置为上拉或下拉: 以前,我曾经在需要时提供外部上拉或下拉电阻,但现在我想知道我是否可以省去外部组件并使用微控制器本身的下拉功能。 那会是一件好事吗? 在某些用例中,我应该格外小心或根本不使用此功能吗?

4
STM32上的字节序问题
我正在使用arm gcc(CooCox)对STM32F4discovery进行编程,而我一直在努力解决字节序问题 我正在通过SPI使用24位ADC进行采样。由于要传入三个字节,因此MSB首先具有将它们加载到联合中的想法(无论如何,我都希望如此!),以便于使用。 typedef union { int32_t spilong; uint8_t spibytes [4]; uint16_t spihalfwords [2];} spidata; spidata analogin0; 我使用spi读取将数据加载到Analogin0.spibytes [0]-[2]中,其中[0]作为MSB,然后通过USART以8比特的高波特率将它们吐出。没问题。 当我尝试将数据传递到12位DAC时,问题就开始了。此SPI DAC需要16位字,其中包括从MSB开始的4位前缀,然后是12位数据。 最初的尝试是将ADC给我的二进制补码转换为二进制偏移量,方法是对0x8000的Analogin0.spihalfwords [0]进行异或运算,将结果移至最低12位,然后在算术上加上前缀。 令人难以置信的令人沮丧,直到我注意到对于analogin0.spibytes [0] = 0xFF和analogin0.spibytes [1] = 0xB5,analogin0.halfwords [0]等于0xB5FF而不是0xFFB5! 注意到这一点后,我停止使用算术运算和半字,并停留在按位逻辑和字节上 uint16_t temp=0; . . . // work on top 16 bits temp= (uint16_t)(analogin0.spibytes[0])<<8|(uint16_t)(analogin0.spibytes[1]); temp=temp^0x8000; // convert twos complement …
11 c  stm32  cortex-m  gcc 

7
I2C从站地址未确认(有时)
我正在尝试使用I2C与远程连接的FRAM(Ramtron的FM24C04)进行通信。此内存嵌入在板上,可以随时将其插入系统或从系统中卸下(在卸下内存之前,通信已正确终止)。 问题是:刚插入包含FRAM的卡后,有时,它不确认地址。 信号测量 我测量了信号以查看发生了什么,看来在两种情况下(工作和不工作)的计时都可以。 正确的I2C通信(读取3个字节): I2C FRAM地址未确认(从机地址已正确发送): 为了解决这个问题已经采取的行动(没有成功) 插入带有嵌入式FRAM的卡后添加的延迟,以确保遵守电源顺序。 检测到未确认从站地址后,I2C停止生成 I2C总线配置 一个主机(ST的STM32F205微控制器) 三个从机(Microchip的EEPROM 24AA1025,Maxim IC的RTC DS1339C和Ramtron的远程FRAM FM24C04 一个I2C电平转换器(Maxim IC提供的MAX3373E)用于允许主机与FRAM之间的通信 总线频率设置为100 kHz 编辑(2013-04-17) 首先,谢谢大家的评论。 由于有很多建议,所以这里是我所做调查的描述。 原理图 下图显示了I2C总线的简化原理图: I2C_SDA和I2C_SCL信号直接连接到微控制器,FRAM_SDA和FRAM_SCL信号连接到FRAM。请注意,使用村田制作所的BLM18铁氧体对连接到FRAM的SDA和SCL信号进行滤波。 FRAM的连接方式如下: NC(引脚1)->未连接 A1(引脚2)-> GND A2(引脚3)-> GND VSS(引脚4)-> GND SDA(引脚5)-> FRAM_SDA SCL(引脚6)-> FRAM_SCL WP(引脚7)-> GND(无写保护) VDD(引脚8)-> + 5V FRAM卡说明 该卡是仅嵌入FRAM的“类似ISA”卡。 调查 减慢频率 我在将SCL频率设置为50kHz和10kHz的情况下进行了测试。我用示波器测量了SCL信号,以确保它处于预期的频率。 这些修改不能解决问题。我检查了时序,它们在FRAM数据表的规格之内。 …

3
每个人都为stm32使用什么免费的IDE?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 3年前关闭。 我当前正在使用Atmel SAM系列。选择很容易:IDE是Atmel Studio,它非常好,免费,我以前用它来开发AVR。我拥有的调试器是Atmel ICE,我也将其用于AVR,它也支持ARM系列。 STM32系列之所以有趣,是因为芯片和开发板的成本非常低。但是,人们使用什么IDE进行开发?我对尽可能完全免费的主流产品感兴趣,因此可以在需要时轻松寻求帮助,并确保工具保持最新状态。我可以在Google或ST的网站上找到明确的答案,因此,如果有人已经参与了该平台的开发,请与我分享数据和意见,我们将不胜感激。
11 arm  stm32  ide 

4
Cortex M3 .bss区域初始化的裸机启动代码
我从这里得到了启发,为手臂皮质M3设计了一个裸机启动代码。但是,我遇到以下问题:假设我声明了一个未初始化的全局变量,例如main.c中的unsigned char类型 #include ... unsigned char var; ... int main() { ... } 这使得STM32 f103中的.bss区域开始于_BSS_START = 0x20000000并结束于_BSS_END = 0x20000001。现在,启动代码 unsigned int * bss_start_p = &_BSS_START; unsigned int * bss_end_p = &_BSS_END; while(bss_start_p != bss_end_p) { *bss_start_p = 0; bss_start_p++; } 尝试将整个.bss区域初始化为零。但是,在while循环内,指针增加了4个字节,因此在执行bss_start_p = 0x20000004的步骤之后,它将始终与bss_end_p不同,从而导致无限循环等。 有什么标准的解决方案吗?我是否想以某种方式“强制” .bss区域的尺寸为4的倍数?还是应该使用指向无符号字符的指针来遍历.bss区域?也许像这样: unsigned char * bss_start_p = …

1
检测哪个瞬时开关导致STM32 cpu唤醒
编辑:这个问题是错误的。stm325105只有一个唤醒引脚。但是其他ST部分具有多个唤醒引脚,因此给定的答案对此有效。 我有一个stm32f105,其中有两个连接到唤醒输入的瞬时按钮。处理器被置于待机模式。当按下任意按钮或RTC计时器触发时,CPU会唤醒。 问题是我希望CPU根据触发的唤醒输入执行不同的操作。根据5.3.5从ST stm32f105xx参考手册,没有寄存器被保留,除了表明我们已经唤醒状态寄存器(但不是以谁)和42个备份寄存器。 待机模式可实现最低功耗。它基于Cortex®-M3深度睡眠模式,禁用了稳压器。因此,1.8 V域已关闭电源。PLL,HSI振荡器和HSE振荡器也被关闭。除了备份域和备用电路中的寄存器外,SRAM和寄存器内容都会丢失。 从待机模式唤醒后,程序执行将以与复位后相同的方式重新开始(启动引脚采样,获取向量复位等)。电源控制/状态寄存器(PWR_CSR)中的SBF状态标志指示MCU处于待机模式。 此ST论坛帖子,如何确定从待机状态唤醒的起源?,表明我无法检测到软件中触发了哪种唤醒。我发现那里没有其他可以给人更多启发的帖子。 唤醒后,如何使用软件或硬件确定触发了哪个唤醒输入?

1
如何从STM32F103C8T6板开始?
几年来,我一直在使用8位AVR MCU与学生一起构建线跟随机器人。现在,我想使用ARM Cortex-M3,因为我想添加一些更多的CPU密集型功能,例如里程表和传感器融合。 要求是: 8个模拟输入, 4个PWM输出 我2 C 2个正交编码器输入, 串行I / O, 无线自编程,无需物理访问机器人。 多平台工具链+ IDE(OS X,Linux,Windows)。 到目前为止,我已采取的步骤是: 我正在使用基于STM32F103C8的电路板。我相信该MCU具有我所需的一切,包括我计划在软件中实现的2 x QEI,但是这个恰好在硬件中具有,所以很棒: 董事会http://eud.dx.com/product/high-quality-cortex-m3-stm32-stm32f103c8t6-development-board-w-swd-interface-844380789 程序员http://eud.dx.com/product/st-link-v2-programmer-emulator-mini-stlink-downloader-for-stm8-stm32-mcu-development-board-844380733 我遵循此步骤来设置我的工具链+ IDE: http://www.davidrojas.co.uk/stm32f3discovery-on-mac-os-x-using-eclipse-gcc-arm-and-openocd/ 我发现该芯片的文档分散在许多PDF中,这些PDF是我下载的: STM32F103x8数据表http://www.st.com/st-web-ui/static/active/zh/resource/technical/document/datasheet/CD00161566.pdf 参考手册http://www.st.com/st-web-ui/static/active/en/resource/technical/document/reference_manual/CD00171190.pdf 我将来可能会需要一些其他文档,例如AN2606(内存启动模式),PM0075(闪存编程手册)和AN3155(串行启动加载程序协议)。 我还下载了STM32F10x标准外围设备库,但这反过来又建议我购买较新的STM32CubeF1,我相信这只是上述产品的市场重命名,因此我同时获得了两者: http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/LN1939/PF257890 http://www.st.com/web/zh/catalog/tools/PF260820 最后,我还收到了Joseph Yiu撰写的“ ARM Cortex-M3权威指南”,我在等这些板到达时正在阅读。 我的问题是: 至少可以说,我对文档有点不知所措,而且我甚至不确定我是否掌握了全部内容。例如,数据表和参考手册指出该芯片具有3个能够正交编码输入的定时器。但是,我无法在上述PDF的任何地方找到控制定时器的寄存器的文档。我想念什么? 我应该使用(较旧?)标准外围设备库还是(较新?)多维数据集?有什么不同?我知道这两个库都使我免于直接操作寄存器,这是推荐的方法。我对吗? 库的文档在哪里(除了嵌入式doxygen注释之外,这些注释很好,除了我自己,我宁愿拥有可搜索的html / pdf)? 我选择Eclipse + GCC ARM + OpenOCD作为我的工具链,因为我认为这是唯一可以在3个主要OS上运行且没有代码大小或其他限制的选项。还有其他选择吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.