标签: stm32

关于链接描述文件创建和验证的建议

长话短说.我希望学习如何创建一个好的链接器脚本,这样我就可以更改平台/架构/供应商,我不会再知道该做什么而再次停留在零点.我并不关心任务的难度,而是关心它.

我已经开始了一个项目,就是为STM的32位Cortex-M3芯片编程和开发创建基础或骨架.在jsiei97的帮助下,从STM32F103RB开始(我还有TI Stellaris LM3S828,但这是另一个问题),无需经过许可的IDE.由于我是学生,而且大多数学生都买不起这样的东西.

我知道有ODev,Eclipse插件和什么不是,并且已经阅读了各种博客,wiki,docs/man页面,大多数项目为您提供了一个链接器脚本,几乎无法解释为什么以及在哪里定义了事物.

我已经为STM32编译了一个arm-none-eabi工具链,但我挂起的是链接器脚本.CodeSourcery也需要一个.我有一个基本的概念,如何在阅读gnu手册页后创建它们和它们的语法,但我根本没有线索从哪个开始添加除了显而易见的.text,.bss和.data之外的各种额外部分.

我创建了一个基本版本,但是我得到链接错误,要求分区定义,这就是我遇到的问题.我知道如何定义它们,但知道我正在做的事情是否接近正确就是问题所在.

arm compilation cortex-m3 stm32 linker-scripts

7
推荐指数
2
解决办法
6766
查看次数

处理器指令周期执行时间

  • 我的猜测是__no_operation()内部(ARM)指令应该执行1 /(168 MHz),前提是每个NOP指令在一个时钟周期内执行,我想通过文档验证.

  • 是否有关于处理器的指令周期执行时间的信息的标准位置?我试图确定STM32f407IGh6处理器执行运行在168 MHz的NOP指令应该花多长时间.

  • 某些处理器每个指令周期需要多次振荡,有些处理器在将时钟周期与指令周期进行比较时为1比1.

  • 术语"指令周期"甚至不存在于STMicro提供的整个数据表中,也不存在于他们的编程手册中(列出处理器的指令集,顺便说一下).但是,8051文档明确定义了其指令周期执行时间,以及其机器周期特性.

stm32 execution-time machine-instruction nop cortex-m

6
推荐指数
2
解决办法
2万
查看次数

STM32 I-CODE 和 D-CODE 总线

STM32 文档说 I-CODE 和 D-CODE 总线连接到内部闪存。I-CODE 总线用于获取指令,D-CODE 总线用于代码存储区中的数据访问(文字加载)。

问题是为什么要使用两条独立的总线?它们能否提供对闪存的同时且绝对独立的访问?

arm stm32 cortex-m

6
推荐指数
1
解决办法
3705
查看次数

设置引脚后触发外部中断

我试图让外部中断在 Nucleo-F030R8上运行 ,但遇到了困难。

一切都已配置并在单步模式下运行得很好,但是当我使用简单的跳线将我的板连接到另一个测试板并运行相同的代码时,即使该测试板(第二个 Nucleo-F302R8,应该只产生一个我想用第一个信号峰值来测量的信号峰值)未打开。

我混合使用了 STM 的 HAL 库和我自己的一些代码。

有人最终遇到过类似的问题吗?我正在使用 STM32 的系统工作台。

部分ISR、Interrupthandler被删掉

void EXTI0_1_IRQHandler(void)
{
   /* USER CODE BEGIN EXTI0_1_IRQn 0 */
   if ((EXTI->IMR & EXTI_IMR_MR0) && (EXTI->PR & EXTI_PR_PR0))
   {
       int_flag_pin.copen = 1;
   }
   if ((EXTI->IMR & EXTI_IMR_MR1) && (EXTI->PR & EXTI_PR_PR1))
   {
      int_flag_pin.ma1 = 1;
   }

   /* USER CODE END EXTI0_1_IRQn 0 */
   HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
   HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);
   /* USER CODE BEGIN EXTI0_1_IRQn 1 */

   /* USER CODE END EXTI0_1_IRQn 1 */
}
Run Code Online (Sandbox Code Playgroud)

在将引脚设置为低电平和改变上升电平之间,中断被触发。

TEST_GPIO_Port->BSRR = (uint32_t) …
Run Code Online (Sandbox Code Playgroud)

c stm32 stm32f0 stm32f3

6
推荐指数
1
解决办法
850
查看次数

STM32H743 微控制器 (Cortex-M7) 的此链接描述文件中是否使用了所有 RAM 部分?

我知道最新的 STM32 微控制器中的 RAM 存储器包含几个具有显着速度差异的部分。这就是为什么我试图围绕这些设备的链接描述文件(注意:arm-none-eabi-gcc工具链)。不幸的是,CubeMX 为 STM32F767ZI 生成的链接描述文件只是忽略了 RAM 中的不同部分:

/* Specify the memory areas */
MEMORY
{
  RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 512K
  FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 2048K
}
Run Code Online (Sandbox Code Playgroud)

 
STMicroelectronics 似乎已经做了一些努力,使其最新的STM32H743ZI的链接描述文件更加复杂:

/* Specify the memory areas */
MEMORY
{
  DTCMRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 128K
  RAM_D1 (xrw)      : ORIGIN = 0x24000000, LENGTH = 512K
  RAM_D2 (xrw)      : ORIGIN = 0x30000000, LENGTH = 288K …
Run Code Online (Sandbox Code Playgroud)

microcontroller gcc arm stm32 linker-scripts

6
推荐指数
1
解决办法
3124
查看次数

内核耦合存储器 (CCM)、中断和 STM32F3xx

我目前正在使用 STM32F303xx 系列芯片。它们具有核心耦合存储器 (CCMRAM),可以执行与 F4 系列上的 CCM 不同的代码。我已将关键例程(例如 ISR)放入 CCM 并想知道什么是最有效的设置,将中断向量表也放入 CCM 或普通 SRAM 中,但我有点坚持那个。任何人都可以向我暗示正确的方向吗?

embedded stm32

6
推荐指数
1
解决办法
1838
查看次数

uint32_t 未命名类型 - Windows 中使用 STM32 的 VSCode

我目前正在为一个项目编写代码,特别是通过 STM32 Nucleo F411RE 板与传感器连接。我使用 STM32CubeMX 设置引脚/外设等,然后使用 Makefile 工具链生成代码,以便在 Visual Studio Code 中进行编程。一切都编译得很好,但 IDE/Intellisense 由于某种原因没有使用uint32_t; 任何发生的情况都会以红色波浪线显示,错误读数为variable "uint32_t" is not a type name

#include <stdint.h>在顶部, 和uint16_tuint8_t在同一个文件中被识别。偷看这些定义会揭示它们的行stdint.h,而同样不适用于uint32_t. 我已经尝试了此处此处建议的解决方案,但都不起作用。

我正在 Windows 上使用 C11(不是 c++,这不是我的项目的选项),这是我的c_cpp_properties.json文件(为了紧凑性,所有额外的定义都被删除):

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "databaseFilename": "${workspaceFolder}/.vscode/browse.vc.db",
            "windowsSdkVersion": "10.0.17763.0",
            "compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.16.27023/bin/Hostx64/x64/cl.exe",
            "cStandard": "c11",
            "cppStandard": "c++17", …
Run Code Online (Sandbox Code Playgroud)

c intellisense stm32 uint32 visual-studio-code

6
推荐指数
2
解决办法
1万
查看次数

HAL_Delay() 陷入无限循环

我被 HAL_Delay() 函数困住了。当我调用这个函数 HAL_Delay() 时,控制陷入无限循环。在搜索问题时,我发现了这个

http://www.openstm32.org/forumthread2145#threadId2146

在这个特定的评论中,我引用了“链接器文件有问题,请使用附件。你需要分别映射两个内存库,所以首先是 SRAM1 96K,然后是 32K 的 SRAM2。我认为这应该报告为错误CubeMX,因为它会生成错误的链接器文件。” 并且有两个扩展名为 .ld 的文件。

我正在寻找的是如何在我的项目中使用这个文件或任何其他更好的选择来处理这个问题。

附注。我正在使用 stm32l476 发现板、Cube Mx 5.0.0 和 Attolic True Studio。

编辑

我的项目有一个 RS485 通信,我从那里获取数据,我有两个任务处理这些数据,在 MAX7219 显示器上显示它并使用 sim800 gsm 模块将它发送到互联网。

控件卡住的代码。请注意,此函数仅在执行 GSM 任务时调用。

void vMyDelay(uint16_t ms)
{
    HAL_UART_Transmit(&huart2, (uint8_t*)"\r\n", strlen("\r\n"), 1000);
    HAL_UART_Transmit(&huart2, (uint8_t*)"In Delay", strlen("In Delay"), 1000);
    HAL_UART_Transmit(&huart2, (uint8_t*)"\r\n", strlen("\r\n"), 1000);
    for (int i = 0; i < ms; i++ )       HAL_Delay(1);
    HAL_UART_Transmit(&huart2, (uint8_t*)"\r\n", strlen("\r\n"), 1000);
    HAL_UART_Transmit(&huart2, (uint8_t*)"Out Delay", strlen("Out Delay"), 1000);
    HAL_UART_Transmit(&huart2, (uint8_t*)"\r\n", strlen("\r\n"), 1000); …
Run Code Online (Sandbox Code Playgroud)

c linker hal stm32 infinite-loop

6
推荐指数
2
解决办法
1万
查看次数

Qemu:致命:锁定:无法将 3 升级为硬故障(当前优先级 -1)错误 - 核心转储

我正在尝试在 QEMU 上使用 Cortex M4 处理器模拟 STM32F407XX 控制器。我编写了 .ld 文件,如下所示:

ENTRY(_Reset)

MEMORY
{
  FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 512K
  RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 128K
  CCMRAM (rw)     : ORIGIN = 0x10000000, LENGTH = 64K
  PERIPHERALS(rw) : ORIGIN = 0x40000000, LENGTH = 128K
}

SECTIONS
{

 .startup . : { stm32.o(.text) } >FLASH
 .text : { *(.text) } 
 .data : { *(.data) } >RAM AT> FLASH
 .bss : { *(.bss COMMON) } >RAM
 . = …
Run Code Online (Sandbox Code Playgroud)

c linux embedded qemu stm32

6
推荐指数
1
解决办法
3241
查看次数

测量 ARM MCU 中断延迟的问题

介绍

\n

我是一名学生,想在不使用示波器的情况下粗略测量ARM Cortex-M系列芯片的中断延迟。然而,我遇到了一个非常奇特的问题,让我非常困惑。

\n

首先,让我简要概述一下我的测量方法。我尝试使用MCU的内置定时器粗略地测量中断延迟。我的基本想法如下:在进入中断服务程序(ISR)之前,我将计时器重置为零。然后,我将生成一个中断请求并进入 ISR。进入 ISR 后,我会立即读取计时器的值。此时,计时器值可以作为中断延迟的非常粗略的估计。

\n

由于某些原因,我需要使用汇编语言编写上述ISR函数。在主函数中,我使用 SWIER 寄存器生成一个软件中断,这允许我进入我编写的 ISR。

\n

I encountered a peculiar issue during this process. When writing an ISR in Assembly language, it is customary to push several registers onto the stack upon entering the function, such as R4 to R11, and pop them back when exiting the function. Therefore, in theory, if I don\'t push the registers onto the stack upon entering the ISR (assuming I don\'t use those registers within …

c assembly arm stm32 cortex-m

6
推荐指数
1
解决办法
175
查看次数