问题标签 [stm32f1]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
arm - IAR Embedded Workbench for ARM - 如何定义中断服务程序?
我试图为 Timer2 溢出中断创建一个中断服务程序,如下所示:
我正在使用 IAR Embedded Workbench for ARM v8.22.2(最新版本)。但是 TIM2_IRQHandler 永远不会被调用——它甚至可以从 C 编译器中得到优化(所以在 dissasembly 中不再有 TIM2_IRQHandler 了)。
那么如何在 IAR Workbench 中正确定义 ISR?
assembly - 从 Flash 启动时的 STM32 HardFault
我有一个简单的 STM32F103 ARM 芯片裸机程序(我使用 GNU 工具链和 openocd 调试器)。
当我从 RAM 运行它时,它工作正常。当我使用预装的引导加载程序引导芯片并直接跳转到Reset_Handler
闪存中的位置时,它也可以工作。但是当我尝试从 Flash 启动时,处理器进入 HardFault 模式。
处理器复位后,pc
寄存器立即指向该Reset_Handler
位置。当我迈出一步时,如果陷入Hardfault_Handler
.
为什么会这样?我怀疑这是一个糟糕的内存访问,但一切似乎都是对齐的。
汇编代码:
RAM 链接描述文件:
Flash 链接描述文件:
部分拆卸.text
:
部分拆卸.isr_vector
(部分):
spi - stm32F1 dma关于spi循环模式传输数据量
我目前正在使用循环模式的 DMA 和 SPI 学习 STM32F1xx。我的目标是让 STM32F1 重复发送相同的数据。
我正在使用 cubeMX 生成的代码,使用循环模式设置 SPI-DMA 并使用HAL_SPI_Transmit_DMA()来激活 DMA 传输。
我有一个像这里的数据缓冲区:
当我使用HAL_SPI_Transmit_DMA(&hspi1,dataBuf,10) 时;它工作正常。STM32F1通过SPI重复发送字符,我可以使用HAL_SPI_DMAStop(&hspi1); 阻止它。
但是如果我只想重复发送 5 个字节的dataBuf,使用HAL_SPI_Transmit_DMA(&hspi1,dataBuf,5),STM32 无法对此做出反应。它只是挂在某个地方,什么也没做。
我想知道为什么会这样。数据量是否需要与声明的缓冲区数组大小相同(实际上,这对我来说没有意义)?如何使用循环模式发送所需的数据量?
更新1
我应该附上我的 SPI 和 DMA 设置,在这里。
SPI设置:
DMA设置:
更新2
这是我的代码测试设置:
和逻辑输出:当我设置 10 个字节发送时,它工作正常,STM32 重复发送 abc.. 并按预期暂停。逻辑捕获请看下面的图片。
但是当我发送 5 个字节时,它似乎无法停止。逻辑捕获请参见以下图像。
我的问题仍然存在,为什么当我设置 5 个字节发送时无法停止 DMA?
我确实测试了其他字节数。10、9、8 字节有效。但是 7, 6, 5, 4, 3 ,2 ,1 字节不起作用。SPI DMA 是那些无法停止的情况。
如果需要提供更多信息,请告诉我。
谢谢。
此致。
stm32 - mbedTLS 是否适用于 STM32 F1?
堆栈mbedTLS
由ST
for its提供,STM32 F7 microcontrollers
但不是 for STM32 F1
。
所以我想知道是否有原因,是否有可能mbedTLS
在STM32 F1
.
谢谢你。
gcc - STM32代码上传成功但不运行
我是 STM32 的新手,我按照此处的说明在 Ubuntu 中编程我的第一个 stm32f103c8t6 板。
这是我添加到源代码中的代码:
当然,我已经将PA0
端口设置GPIO_output
为STM32CubeMX
. 这是函数的输出MX_GPIO_Init
:
代码成功构建并上传到开发板。以下是用于重建构建和上传代码的代码的输出:
但是,LED 没有按预期开始闪烁。当我将它连接到 5 伏时,LED 工作正常。我用 AVO 表检查了电路板的引脚,它们都连接到微控制器。
经过一些研究,我认为它必须与Boot0
和引脚有关,所以我从这里Boot1
尝试了不同的选项,但没有一个有效。
这是我的董事会的形象:
我该如何解决?
stm32 - STM32 SPI数据反向发送
我一直在尝试使用 SPI 写入外部EEPROM,但我取得了好坏参半。数据确实以相反的方式移出。EEPROM 需要一个起始位,然后是一个操作码,该操作码本质上是用于读取、写入和擦除的 2 位代码。本质上,起始位和操作码组合成一个字节。我正在创建一个 32 位无符号整数,然后将值移位到其中。当我传输这些时,我看到首先看到的是实际数据,然后是 SB+操作码,然后是内存地址。我如何反转这个以首先查看操作码,然后是内存地址,然后是实际数据。如下图所示,数据为BCDE,SB+opcode为07,内存地址为3F。正确的顺序应该是 07、3F 和 BCDE(我认为!)。
这是代码:
stm32 - 无法使用 STM32F103C8 从外部 EEPROM 读取
我正在尝试从外部EEPROM写入和读取。有一个起始位 (SB),后跟一个操作码,然后是一个 6 位地址,然后是实际数据。我已将 SB 和操作码组合成一个字节,我可以将其作为开始条件发送。我能够启用、擦除然后写入 EEPROM。我假设这是有效的,因为 HAL 函数返回 HAL_OK 并且我可以在示波器上看到有效波形。
我似乎无法做的是读回数据。对于 READ 操作,我在示波器上看不到任何波形。所需的时钟周期数是奇数,而不是 8 的倍数。我不知道如何发送奇数时钟周期,因为所有数据都是 8、16 或 32 位。在需要 25 或 29 个时钟周期的地方,我似乎发送 32 个,而在所需周期为 9 个的地方,我似乎发送 16 个。我真的希望避免按照该线程中的建议进行位碰撞。
这是主要代码:
SPI 初始化为处理 16 位数据值
这些是 EEPROM 功能
编辑:我在这里也附上了波形。
使能够
擦除
写
arm - stm32f103:强制 DMA 传输完成中断
我正在尝试使用 FreeRTOS(互斥体和流缓冲区)、DMA 和 USART3 实现 stm32f103 和 SIM900A 之间的通信。
我已启用 USART_IT_IDLE USART3 中断,以便能够检测 SIM900 传输结束并强制触发 DMA 传输完成中断以将数据从内存复制到 FreeRtos 的流缓冲区。
这篇文章说这是可能的。
但我的调试器说:不
这是我的代码:
为什么我不能强制 DMA1_IT_TC3 中断?还是可以强制在STM32F103上?
c - STM32 µC:SysTick 延迟在中断处理程序中不起作用
所以我用 C 语言为微控制器编写了一个程序STM32F103C8T6
,使用 RTC(实时时钟)和一个显示模块。
RTC 和显示器都工作正常,但是当我尝试从 RTC 中断处理程序内部更新显示器时,它不起作用。
当我从 中向显示器写入内容时main()
,它工作得很好。
中断处理程序也可以正常工作,所以我认为问题出在写入显示器的函数中。
此函数使用小的延迟来对与显示控制器的通信进行位爆炸。
我以前使用SysTick
来生成这样的延迟:
但不知何故,在 RTC 的中断处理程序内部它不起作用。所以我用这个替换了我的延迟函数,而不是使用 SysTick:
现在一切正常。
我试图理解,为什么SysTick
在 RTC 中断处理程序中显然不起作用。
我认为这可能是由中断优先级引起的,但根据数据表,默认情况下SysTick Interrupt
' 的优先级高于 RTC 中断优先级。
也许有人可以解释,为什么会这样?
EDIT1:好的,所以我已经阅读了更多关于中断优先级的内容,看来我需要正确配置 NVIC_IRQChannelPreemptionPriority 。我会尽快尝试这个...
关于中断内部的延迟,我知道这不是正确的做法,但我仍然想了解程序的行为
EDIT2:我只是尝试通过以下方式更改中断优先级:
现在 SysTick 延迟在 RTC 中断处理程序中起作用。