代码在不同的 STM 微控制器上不起作用

Code is not working on different STM Microcontrollers

提问人:Mendi 提问时间:8/4/2023 最后编辑:Mendi 更新时间:8/4/2023 访问量:69

问:

我一直在 Nucleo 开发板上测试我的代码(工作完善)。一旦我拥有了我需要的所有功能,我就将我的代码上传到了不同的微控制器,但现在代码(功能)似乎不起作用。

微控制器 STM32C031C6Tx.

  • 代码(功能)运行完美!没有问题

微控制器 STM32C011J4Mx

  1. 将电路板插入具有STM32C011J4Mx微控制器的电源。
  2. 将我的开关切换到 ON 位置,情况 0:(红色 LED)亮起。(如 意向)
  3. 关闭开关,LED 不会熄灭,并且由于 LED 不会熄灭 关闭我的其余代码将不会运行。

我的问题是为什么我的代码在一个微控制器(STM32C031C6Tx)上工作,而在另一个微控制器(STM32C011J4Mx)上工作?两者具有相同的输入、输出、引脚分配和设置。我还应该检查什么?或者我是否需要更改我的代码才能用于我使用的新微控制器?

对这一切非常陌生,所以如果我需要提供更多信息,请告诉我。

这是我的代码:(对不起,很多)。

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 */
  MX_GPIO_Init();
  MX_TIM3_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3); // Red
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2); // Green
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_4); // Blue

    uint8_t sins[360] = {
        127,129,131,134,136,138,140,143,145,147,149,151,154,156,158,160,162,164,166,169,171,173,175,177,179,181,183,185,187,189,191,193,195,196,198,200,
        202,204,205,207,209,211,212,214,216,217,219,220,222,223,225,226,227,229,230,231,233,234,235,236,237,239,240,241,242,243,243,244,245,246,247,248,
        248,249,250,250,251,251,252,252,253,253,253,254,254,254,254,254,254,254,255,254,254,254,254,254,254,254,253,253,253,252,252,251,251,250,250,249,
        248,248,247,246,245,244,243,243,242,241,240,239,237,236,235,234,233,231,230,229,227,226,225,223,222,220,219,217,216,214,212,211,209,207,205,204,
        202,200,198,196,195,193,191,189,187,185,183,181,179,177,175,173,171,169,166,164,162,160,158,156,154,151,149,147,145,143,140,138,136,134,131,129,
        127,125,123,120,118,116,114,111,109,107,105,103,100,98,96,94,92,90,88,85,83,81,79,77,75,73,71,69,67,65,63,61,59,58,56,54,
        52,50,49,47,45,43,42,40,38,37,35,34,32,31,29,28,27,25,24,23,21,20,19,18,17,15,14,13,12,11,11,10,9,8,7,6,
        6,5,4,4,3,3,2,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,2,2,3,3,4,4,5,
        6,6,7,8,9,10,11,11,12,13,14,15,17,18,19,20,21,23,24,25,27,28,29,31,32,34,35,37,38,40,42,43,45,47,49,50,
        52,54,56,58,59,61,63,65,67,69,71,73,75,77,79,81,83,85,88,90,92,94,96,98,100,103,105,107,109,111,114,116,118,120,123,125
    };

  uint32_t led_off_tick;

enum button_state_e {
    BUTTON_NOT_PRESSED,
    BUTTON_JUST_PRESSED,
    BUTTON_PRESSED
};

static enum button_state_e button_state = BUTTON_NOT_PRESSED;
static uint8_t color_sequence = 0;



void red_sequence_full(void) {
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 230); // Red
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 0); // Green
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, 0); // Blue
};

void green_sequence_full(void) {
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 0); // Red
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 230); // Green
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, 0); // Blue
};

void blue_sequence_full(void) {
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 0); // Red
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 0); // Green
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, 230); // Blue
};

void pink_sequence_full(void) {
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 230); // Red
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 0); // Green
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, 50); // Blue
};

void teal_sequence_full(void) {
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 0); // Red
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 230); // Green
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, 230); // Blue
};

void yellow_sequence_full(void) {
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 230); // Red
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 140); // Green
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, 0); // Blue
};

void orange_sequence_full(void) {
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 230); // Red
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 25); // Green
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, 0); // Blue
};

void purple_sequence_full(void) {
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 230); // Red
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 0); // Green
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, 100); // Blue
};

void white_sequence_full(void) {
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 230); // Red
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 230); // Green
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, 230); // Blue
};

void party_sequence_full(void) {

    int i = 0;

    while (1) {
        for (i = 0; i < 360; i++) {
            __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, sins[i]); // Red
            __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, sins[(i + 120) % 360]); // Green
            __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, sins[(i + 240) % 360]); // Blue

            HAL_Delay(2);

            if (HAL_GPIO_ReadPin(Toggle_Switch_GPIO_Port, Toggle_Switch_Pin) != GPIO_PIN_SET)
                return;
        }
    }
};

void red_sequence_half() {
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 115); // Red
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 0); // Green
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, 0); // Blue
}
void green_sequence_half() {
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 0); // Red
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 115); // Green
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, 0); // Blue
}
void blue_sequence_half() {
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 0); // Red
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 0); // Green
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, 115); // Blue
}
void pink_sequence_half() {
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 115); // Red
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 0); // Green
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, 25); // Blue
}
void teal_sequence_half() {
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 0); // Red
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 115); // Green
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, 115); // Blue
}
void yellow_sequence_half() {
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 115); // Red
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 120); // Green
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, 0); // Blue
}
void orange_sequence_half() {
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 115); // Red
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 13); // Green
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, 0); // Blue
}
void purple_sequence_half() {
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 115); // Red
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 0); // Green
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, 50); // Blue
}
void white_sequence_half() {
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 115); // Red
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 115); // Green
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, 115); // Blue
}

void party_sequence_half(void) {

    int i = 0;

    while (1) {
        for (i = 0; i < 360; i++) {
            __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, sins[i] / 2); // Red
            __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, sins[(i + 120) % 360] / 2); // Green
            __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, sins[(i + 240) % 360] / 2); // Blue

            HAL_Delay(2);

            if (HAL_GPIO_ReadPin(Toggle_Switch_GPIO_Port, Toggle_Switch_Pin) != GPIO_PIN_SET)
                  return;
        }
    }
};

void switch_off_all_leds(void)
{
    __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 0); // Red
    __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 0); // Green
    __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, 0); // Blue
};

  /* USER CODE END 2 */

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

    /* USER CODE BEGIN 3 */
          // Sets pressed variable to a boolian value (true or false). In this case its true.
         bool pressed = (HAL_GPIO_ReadPin(Toggle_Switch_GPIO_Port, Toggle_Switch_Pin) == GPIO_PIN_SET);

         if(HAL_GPIO_ReadPin(Main_input_GPIO_Port, Main_input_Pin) == GPIO_PIN_SET) {

            switch (button_state)
            {
                case BUTTON_NOT_PRESSED:
                    if (pressed)
                        button_state = BUTTON_JUST_PRESSED;
                    break;


                case BUTTON_JUST_PRESSED:
                    if (pressed)
                    {
                        button_state = BUTTON_PRESSED;

                        if ((HAL_GetTick() - led_off_tick) < 2000u)
                            color_sequence = (color_sequence + 1) % 10;

                        switch (color_sequence) {

                        case 0:
                            red_sequence_full();
                            break;
                        case 1:
                            green_sequence_full();
                            break;
                        case 2:
                            blue_sequence_full();
                            break;
                        case 3:
                            pink_sequence_full();
                            break;
                        case 4:
                            teal_sequence_full();
                            break;
                        case 5:
                            yellow_sequence_full();
                            break;
                        case 6:
                            orange_sequence_full();
                            break;
                        case 7:
                            purple_sequence_full();
                            break;
                        case 8:
                            white_sequence_full();
                            break;
                        case 9:
                            party_sequence_full();
                            break;
                        }
                    }
                    else
                        button_state = BUTTON_NOT_PRESSED;
                    break;

                case BUTTON_PRESSED:
                    if (!pressed)
                    {
                        button_state = BUTTON_NOT_PRESSED;
                        switch_off_all_leds();
                        led_off_tick = HAL_GetTick();
                    }
                    break;
            }

         } else {

                switch (button_state)
                {
                    case BUTTON_NOT_PRESSED:
                        if (pressed)
                            button_state = BUTTON_JUST_PRESSED;
                        break;


                    case BUTTON_JUST_PRESSED:
                        if (pressed)
                        {
                            button_state = BUTTON_PRESSED;

                            if ((HAL_GetTick() - led_off_tick) < 2000u)
                                color_sequence = (color_sequence + 1) % 10;

                            switch (color_sequence) {

                            case 0:
                                red_sequence_half();
                                break;
                            case 1:
                                green_sequence_half();
                                break;
                            case 2:
                                blue_sequence_half();
                                break;
                            case 3:
                                pink_sequence_half();
                                break;
                            case 4:
                                teal_sequence_half();
                                break;
                            case 5:
                                yellow_sequence_half();
                                break;
                            case 6:
                                orange_sequence_half();
                                break;
                            case 7:
                                purple_sequence_half();
                                break;
                            case 8:
                                white_sequence_half();
                                break;
                            case 9:
                                party_sequence_half();
                                break;
                            }
                        }
                        else
                            button_state = BUTTON_NOT_PRESSED;
                        break;

                    case BUTTON_PRESSED:
                        if (!pressed)
                        {
                            button_state = BUTTON_NOT_PRESSED;
                            switch_off_all_leds();
                            led_off_tick = HAL_GetTick();
                        }

                        break;
                }

         }

            HAL_Delay(10);
  }
  /* USER CODE END 3 */
}
C STM32

评论

0赞 Craig Estey 8/4/2023
生成的网络搜索(很少,但):st.com/resource/en/application_note/......
1赞 pmacfarlane 8/4/2023
当您说“相同的代码”时,您指的是相同的二进制文件,还是为不同的微控制器编译的相同源代码?
2赞 user4581301 8/4/2023
建议:备份它,然后拿斧头。将其减少到演示问题的最小代码。使用最少可重复的例子作为灵感。如果您在完成后仍有问题(或者如果问题仍然有趣),请将最小示例添加到问题中(如果您自己回答了问题,则自答)。
0赞 Thomas Matthews 8/4/2023
在桌面上混合 C 和 C++ 很困难;在嵌入式系统上混合使用它们更加困难。例如,C++ 具有 ,它使用动态内存。在大多数嵌入式系统中,不允许使用动态内存,因为它会导致内存碎片。解决碎片的唯一方法是垃圾回收或重新启动。这些都不是很好,取决于恢复能力。例如,将航空公司系统重置为 60000 英尺高并不是一个好主意。选择一种语言并更新标签。std::vector
0赞 pmacfarlane 8/4/2023
@ThomasMatthews 他们错误地标记了C++。我已经删除了它。

答:

0赞 0___________ 8/4/2023 #1

您需要修改链接器脚本,因为堆栈放置在SRAM的最后一个地址。

STM32C031有 12kB 的 SRAM,只有 6kB,堆栈指针将放置在 SRAM 外部。任何堆栈操作都会导致 HF(硬故障)。STM32C011

查找衬里脚本(扩展名)并找到 Assign it with the initial position of the stack pointer(它必须在 SRAM 中,并且必须是 8 字节对齐的).ld_estack =