Questions tagged «stm32»

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

3
Eclipse + GNU ARM + STM32-HAL或SPL
我将开始进行ARM开发(经过2年的AVR),并选择了带有stm32f4微处理器的STM DISCOVERY板。 我决定使用eclipse + ARM gcc,因为我不喜欢Keil上的代码限制,而且我没有钱来获得付费版本。 按照教程,我已经将eclipse与gcc ARM工具+ openocd + make utils一起安装了。 我的问题是关于“包装”插件的。像每个初学者一样,对于使用新的STM HAL还是旧的SPL感到困惑。 我的理解是HAL已经将抽象实现到了可以称为arm的Arduino等效级别。另一方面,SPL提供了足够的抽象来提高编码速度,但是您仍然需要处理芯片级的问题。 有了这种了解,我想坚持使用SPL来更好地理解事物,而不是使用HAL。 我想知道的是,是否为STM使用软件包会隐式迫使我使用HAL?如果是这样,有人可以指出我如何在我的设置中使用SPL吗?
10 arm  stm32  gcc  cortex  hal-library 

3
软件中断与功能
在使用MCU大约三年后,我仍然不知道软件中断的用途是什么?我已经用STM32做过几项工作,但从未使用过软件中断。确实,这对我来说是一个大问题: 为什么当我们可以使用简单功能执行任务时,应该使用软件中断吗?软件中断和功能之间有什么区别? 每次您喜欢时,都可以调用一个函数(为工作编写的函数)。使用软件中断而不是简单的功能应该会带来一些好处。我不确定,但是我认为软件中断有好处:您可以为软件中断分配优先级,然后可以为软件中断赋予更高的优先级,以避免硬件中断破坏您的任务。
10 arm  stm32  interrupts 

3
选择SDRAM pcb布局
我正在使用带有LQFP208封装的全新STM32F429的项目进行开发。 由于预算低,我需要自己焊接前几个原型。我选择此包装,以便检查是否是布线/固件问题还是焊接问题。 在该项目中,有LCD,CAMERA,ULPI和32b SDRAM总线以及其他一些较慢的接口。 FMC BUS仅用于SDRAM,项目不需要其他存储器。 PCB堆叠是标准的4层S-GND-VCC-S。 我需要有关路由SDRAM / MCU接口的最佳方法的建议。 这里有两种可以完成的设计: 左迹线的走线最好是短的,但最好不要留出太多的长度,因为短走线的传播延迟很低,因此不需要。LCD / ULPI / CAMERA总线可能在外部路由很多问题。 正确的选择可能会更好,走线稍长,但长度匹配的空间很大,而且仍然不需要终止。LCD / ULPI / CAMERA总线将在外部布线,但它们将在很多方面满足SDRAM总线的要求,因此这些总线上的通孔数将增加,并且布局将更加复杂! 编辑: 由于其他一些因素,双方组装都是必须的。 您能解释一下选择哪一个,为什么吗? 编辑2: 在填充pcb之后,我选择了左边的那个,所以右边的没有太多的空间。 这是初步结果。 仍接受建议以改善布局: 编辑3: 增加了电源和接地过孔: 谢谢!
10 pcb  stm32  layout  sdram 



2
四路SPI PCB布局
我正在尝试为带有STM32 MCU的Quad SPI NOR闪存MT25QL256ABA1EW9-0SIT做好布局。我的问题是我发现存储芯片的引脚分配非常不便。我已经设法以信号彼此相邻的方式交换MCU端的引脚,但这仍然很困难。遵循Micron Quad spi布局指南,我设法: 不拆分下面的接地层(这是2层PCB), 使时钟信号变短,并尽可能减少弯曲, 不使用VIAS进行信号路由 但是,我没有设法: 通过计算带状线来保持任何合理的阻抗(实际上没有多少空间和许多信号) 保持信号长度相似。 这是布局: 放大图像后,您可以在存储芯片焊盘上看到网络名称。我想问您一个,您认为这种设计足以进行80 Mhz的时钟传输。为了进行比较,芯片内部的粉红色形状为18 x 8 mm。将GND多边形浇注架搁置以提高可见性。我将不胜感激。
10 pcb  stm32  spi  layout  high-speed 

4
使用HAL的STM32 ADC转换
我正在尝试学习如何从stm32使用“新” HAL库。 当我尝试进行简单的ADC转换时,它只能运行一次,但随后会停止转换。我想转换结束标志未设置。我正在使用STM32f429I发现板,板上有STM32f429ZI。 请注意,我知道sprintf是一种不好的做法,并且使带有中断的adc更好,我知道,请不要指出这一点,这与问题无关,我只是在这里测试HAL。 所以问题是为什么未设置EOC标志,或者我应该怎么做才能使其正常工作?谷歌搜索没有太大帮助,因为那里关于HAL的好材料很少。 这是代码: __IO uint16_t ADCValue=0; void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc); int main(void) { char str[15]; /* Various initializations */ HAL_ADC_Start(&hadc1); while (1) { if (HAL_ADC_PollForConversion(&hadc1, 1000000) == HAL_OK) { ADCValue = HAL_ADC_GetValue(&hadc1); sprintf(str, "%d", ADCValue); BSP_LCD_DisplayStringAt(130,30, (uint8_t*)str, LEFT_MODE); } } void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { ADCValue = HAL_ADC_GetValue(&hadc1); } …

4
STM32:定时器中断立即起作用
这是我的STM32F429项目中的计时器代码: //timer initialization void timerInit() { uwPrescalerValue2 = (uint32_t) ((SystemCoreClock / 2) / 100000) - 1; RS485Timer.Instance = TIM5; RS485Timer.Init.Period = 67400000; // high value to notice interrupt even without debugging RS485Timer.Init.Prescaler = 400000; RS485Timer.Init.ClockDivision = 0; RS485Timer.Init.CounterMode = TIM_COUNTERMODE_UP; HAL_TIM_Base_Init(&RS485Timer); } void timerReset() { HAL_TIM_Base_Stop_IT(&RS485Timer); HAL_TIM_Base_DeInit(&RS485Timer); HAL_TIM_Base_Init(&RS485Timer); HAL_TIM_Base_Start_IT(&RS485Timer); printf("%d …

1
STM32“ USB设备”与“ USB OTG HS”的区别是什么?
我最近下载了stm32应用进行MCU搜索,发现例如STM32F429在“ USB Device”外设中为“ NO”,而在“ USB OTG FS”和“ USB OTG HS”中为“ YES”。由于STM32F429可以完全作为USB设备使用,即它支持所有库和USB类,因此这非常令人惊讶。 其他一些MCU中标有“ USB设备”,例如。STM32L052 然后我尝试检查CubeMX,发现他们的搜索中有USB_Device外设(同样STM32F429不包含它,USB东西是通过OTG完成的)。 这个问题可能很容易回答,因为我怀疑USB设备只是意味着不支持OTG的设备,但是我不确定,通常MCU还是会使用OTG(而且只有一个库,所以为什么USB中的状态为“ NO”外设)。我在Google或CubeMX文档中找不到有关它的信息。 由于USB OTG HS似乎可以正常使用该库,因此我对此并不十分担心,但是我对术语感到好奇。 我知道ST论坛可能是解决此问题的好地方,但是很多话题只是在两年过去之后才得到解答。:) 谢谢。

3
使用ST-LINK实用程序将RTC配置为当前时间
我在做什么 我正在使用STM32微控制器,对于我的项目,我需要能够在一天的特定时间(例如,上午11点和下午2点)发送数据。微控制器需要知道现在几点才能实现。不幸的是,我只能进行单向通信,因此无法从网络请求当前时间。 因此,我想在编程后直接设置当前时间。我知道我能够使用以下命令使用ST-LINK实用程序命令行界面(ST-LINK_CLI)将数据写入闪存: ST-LINK_CLI.exe -w32 <Address> <data> -Rst 我编写了一个简单的测试脚本,该脚本将Unix时间戳记写入代码当前未使用的某个地址。 我正要编写一个函数来读取时间戳并使用它来设置RTC时间。在我阅读《ST-LINK实用程序用户手册》中的以下内容之前: -w32支持写入闪存,OTP,SRAM和R / W寄存器。 当手册说它支持写入R / W寄存器时,这是否意味着我可以直接访问RTC寄存器并进行设置?我已经尝试过,但是似乎无法写入这些寄存器。 如果愿意,我宁愿使用此方法,因为我不再需要编写特定的函数来在微控制器上处理它。这意味着我可以设置我们当前使用的任何微控制器的RTC时间,而无需更新其代码。 我打算做什么 要设置RTC寄存器,我尝试执行以下步骤,如STM参考手册中所述: 将PWR_CR寄存器中的DPB位置1 将0xCA写入RTC_WPR寄存器 将0x53写入RTC_WPR寄存器 通过将RTC_ISR寄存器中的INIT位置1来停止RTC 通过写入RTC_PRER寄存器选择1Hz时钟 通过写入RTC_TR寄存器加载当前时间 通过写入RTC_DR寄存器加载当前日期 通过复位RTC_ISR寄存器中的INIT位来启动RTC 要访问寄存器,我使用了以下地址: PWR_CR:0x4000 7000 RTC_WPR:0x4000 2824 RTC_ISR:0x4000 280C RTC_PRER:0x4000 2810 RTC_TR:0x4000 2800 RTC_DR:0x4000 2804 什么地方出了错 我无法写这些寄存器中的任何一个。使用ST-LINK实用程序,我收到以下消息: 写入存储器时发生错误! 使用ST-LINK_CLI: 在0x40007000处写入0x00000100 ...错误! 读取这些寄存器没有问题,但是我无法使用ST-LINK实用程序或其命令行界面对其进行写入。 问题 如何使用ST-LINK Utility写入R …
9 stm32  rtc 

2
为什么MCU寄存器中与逻辑相关的位字段通常位于不同的位置?
如果这个问题已经被回答,请原谅我,但是无论是在此页面还是在更广泛的Internet上我都找不到答案。 我是一位经验丰富的开发人员,在底层编程方面拥有丰富的知识,但是对于嵌入式开发而言却相对较新。我一直在自学使用ST-NUCLEO144板进行嵌入式系统开发,该板具有STM32F746ZG MCU。在我看来似乎不是显而易见的一个问题是,为什么寄存器中与逻辑相关的位字段可能位于不同的位置。 一个例子是USART_CR1STM32746ZG上的寄存器。的M0和M1位字段一起控制USART TX / RX的字长,的组合的2比特值0b00指定8位,0b01指定9个比特,等等,这是所有相当简单的,不同之处在于M0在第12位和M1在比特28 ...为什么呢? 是否出于遗留设计的原因,例如将新功能插入到先前保留的空间中?是出于与芯片设计相关的原因而我没有考虑,还是出于更大的目的而没有看到? 显然,使用位屏蔽可以克服这个问题,但是我很好奇。

1
无法对自定义STM32开发板进行编程
我设计了一个简单的STM32开发板。下面是原理图和PCB布局图: 示意图: PCB布局: 突出显示VDD的PCB布局: 突出显示GND的PCB布局: 上图中仅显示了与我的问题有关的设计部分。 我的问题是:我试图使用STM32 Discovery Board的内置ST-Link对该自定义开发板进行编程,但还无法成功。PC上的ST-Link Utility应用程序可以识别编程器,但无法检测到目标MCU。我收到的错误消息是:“目标未连接”和“ ST-Link USB通信错误”。 以下是有关我的问题的一些相关事实: STM32发现板工作正常:我可以使用其内置的ST-Link对其板载STM32 MCU进行编程。还行吧。 STM32 MCU已按照正确的方向焊接在定制板上。我检查了两次。 我已经检查了VDD和SWD迹线。它们连接良好(没有焊接问题)。Boot0引脚为0V。NRST引脚为3.3V。 SWD电缆很短,只有7-8厘米长。 我的自定义板上的STM32与发现板上的STM32具有相同的类型。 我已按照STM32 Discovery Board手册中的说明进行操作,该手册说明了如何使用Discovery Board对外部STM32 MCU进行编程。更具体地说,我卸下了2个CN3跳线,然后按照下表连接板子: 我还卸下了发现板上的电桥SB11(以便NR​​ST引脚可以正常工作)。 我已经尝试过ST-Link Utility应用程序和Keil。我收到的错误消息是相同的。 最初,我没有连接上表(SWO)上的引脚6,因为据我所知这不是必需的。但是在那之后我也将其连接起来,但是仍然无法解决问题。 我还从引脚NRST到GND添加了一个100nF的电容,然后从该引脚向VDD添加了一个100k的上拉电阻。问题仍然存在。 我也尝试过使用ST-Link Utility程序的“重置时连接”模式。也没有运气。 我怀疑设计可能有问题,但是我不确定。请帮我解决问题。 非常感谢你 :)
9 stm32  swd  custom 

2
STM32F4立方体HAL UART。是错误还是我错过了什么?
我正在使用基于中断的UART IO(无DMA)。 HAL_UART_Transmit_IT功能设置寄存器中的EIE位CR3。根据STM32F407数据表(以及实际行为),这仅在多缓冲区模式下(当DMAR位置1 时)产生中断。EIE使能针对帧错误(FE),溢出错误(ORE),噪声错误(NE)的中断生成。据我了解,此错误仅用于接收。 部分HAL_UART_IRQHandler功能: tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_ORE); tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR); /* UART Over-Run interrupt occurred ----------------------------------------*/ if((tmp1 != RESET) && (tmp2 != RESET)) { __HAL_UART_CLEAR_OREFLAG(huart); huart->ErrorCode |= HAL_UART_ERROR_ORE; } if(huart->ErrorCode != HAL_UART_ERROR_NONE) { /* Set the UART state ready to be able to start again the process …

4
rand()函数和RNG(随机数生成器)外设之间有什么区别?
我想知道STM32F4XXXX MCU中的RNG(随机数发生器)外设。请参阅本参考手册(第748页)。另一方面,我们在stdlib库中有rand()函数来执行相同的任务。现在我有两个问题: rand()函数和RNG(随机数生成器)外设之间有什么区别(优点和缺点)? 看这部分: 请说明这两种选择(尤其是第二种选择)。

3
STM32:执行软件重置
我正在尝试对STM32F2进行软件重置。(可在此处找到参考手册。)参考手册的相关页面(第80页)提供的信息很少。基本上,SYSRESETREQ的位Application Interrupt and Reset Control Register必须设置。 现在,此页面说明,要修改SYSRESETREQ,需要将特定的“密钥”写入VECTKEY位。 这两份文件都没有解释这在哪里Application Interrupt and Reset Control Register。它的地址是什么,我该如何访问?
9 stm32  reset 

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.