STM32:自己的功能不起作用。我该如何解决?

Posted

技术标签:

【中文标题】STM32:自己的功能不起作用。我该如何解决?【英文标题】:STM32: An own function does not work. How can I fix it? 【发布时间】:2022-01-10 00:44:44 【问题描述】:

最近一直在做STM32编程。我尝试编写自己的函数并将其插入生成的代码中,但奇怪的是该函数不起作用。调试时,控制器在函数调用点挂起。 谁能帮我这个? 如果有任何帮助,我将不胜感激! 附上代码。 (不相关部分被剪掉)[iOut_ref 不用于 DMA 例程]

/* USER CODE BEGIN PD */
#define MAX_MEASURED_VALUE 3.3
#define MAX_VALUE 4095
/* USER CODE END PD */

/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
uint16_t iOut_ref = 0;
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN PFP */
void ChangeRefValue(uint16_t*, float);
/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void ChangeRefValue(uint16_t* valueRef, float fValueRef)

    *valueRef = (int)(MAX_VALUE * (fValueRef / MAX_MEASURED_VALUE));

/* USER CODE END 0 */
int main(void)

  /* USER CODE BEGIN 1 */
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */

  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  
    /* USER CODE END WHILE */

    ChangeRefValue(&iOut_ref, 3.3);

    /* USER CODE BEGIN 3 */
  
  /* USER CODE END 3 */

... ```

【问题讨论】:

您的程序在无限循环中调用相同的函数。这个函数也可以完全优化掉,因为它产生了一个恒定的结果。不确定您所说的“控制器挂起”是什么意思,但这几乎就是它的样子——一个无所事事的无限循环。 挂起是什么意思?你能中断程序执行吗? 调试时,变量的变化应该是可见的,并且应该可以“跳过”。但是什么也没发生,我只能取消调试。 @EugeneSh。如果使用浮点指令且未启用 FPU,则可能导致 HF。但在这种微不足道的情况下不太可能 @AlexanderMenzel 不,它不必是可见的,因为这个变量很可能会被优化掉。所以你不会看到它。 【参考方案1】:

很可能编译器已经完全优化了函数和你的变量,因为它没有在任何地方使用。

所以你的循环很可能会编译成单个分支指令。

https://godbolt.org/z/cYoTWfY1a

ChangeRefValue:
        push    r4, lr
        mov     r4, r0
        mov     r0, r1
        bl      __aeabi_f2d
        adr     r3, .L2
        ldrd    r2, [r3]
        bl      __aeabi_ddiv
        adr     r3, .L2+8
        ldrd    r2, [r3]
        bl      __aeabi_dmul
        bl      __aeabi_d2iz
        strh    r0, [r4]        @ movhi
        pop     r4, pc
.L2:
        .word   1717986918
        .word   1074423398
        .word   0
        .word   1085275648
main:
        push    r3, lr
        bl      HAL_Init
        bl      SystemClock_Config
.L5:
        b       .L5
iOut_ref:

或启用 FPU:

ChangeRefValue:
        vldr.32 s15, .L2
        vmul.f32        s0, s0, s15
        vcvt.s32.f32    s0, s0
        vmov    r3, s0  @ int
        strh    r3, [r0]        @ movhi
        bx      lr
.L2:
        .word   1151016216
main:
        push    r3, lr
        bl      HAL_Init
        bl      SystemClock_Config
.L5:
        b       .L5
iOut_ref:

你只需要编写一个稍微复杂一点的程序,然后在某处使用函数的结果。

【讨论】:

以上是关于STM32:自己的功能不起作用。我该如何解决?的主要内容,如果未能解决你的问题,请参考以下文章

CSS3:为啥这个过渡不起作用,我该如何解决?

STM32F4 SPI接收中断不起作用

jQuery DataTables iDisplayLength 不起作用。我该如何解决?

STM32:使用 DMA 时 I2S 输入不起作用

PROTUSE 仿真STM32按键控制LED,按键不起作用

stm32f103c8 跳转到应用程序不起作用