提问人:Mendi 提问时间:8/4/2023 最后编辑:Mendi 更新时间:8/4/2023 访问量:69
代码在不同的 STM 微控制器上不起作用
Code is not working on different STM Microcontrollers
问:
我一直在 Nucleo 开发板上测试我的代码(工作完善)。一旦我拥有了我需要的所有功能,我就将我的代码上传到了不同的微控制器,但现在代码(功能)似乎不起作用。
微控制器 STM32C031C6Tx.
- 代码(功能)运行完美!没有问题
微控制器 STM32C011J4Mx
- 将电路板插入具有STM32C011J4Mx微控制器的电源。
- 将我的开关切换到 ON 位置,情况 0:(红色 LED)亮起。(如 意向)
- 关闭开关,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 */
}
答:
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 =
评论
std::vector