小编Han*_*ans的帖子

如何更改闪存的起始地址?

我正在使用 STM32F746ZG 和 FreeRTOS。flash 的起始地址是 0x08000000。但我想把它改成 0x08040000。我已经通过谷歌搜索了这个问题,但没有找到解决方案。

我更改了链接器脚本,如下所示。

MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 320K
/* FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 1024K */
FLASH (rx)      : ORIGIN = 0x8040000, LENGTH = 768K
}
Run Code Online (Sandbox Code Playgroud)

如果我只更改它并运行调试器,就会出现问题。如果我将 VECT_TAB_OFFSET 从 0x00 更改为 0x4000,它工作正常。

/* #define VECT_TAB_SRAM */
#define VECT_TAB_OFFSET  0x40000  /* 0x00 */

SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; 
Run Code Online (Sandbox Code Playgroud)

但是如果我不使用调试器,它就不起作用。这意味着它仅在使用 ST-Linker 时有效。

如果您知道解决方案,请告诉我。提前感谢您的回复。

stm32 stm32f4discovery stm32f7 stm32f0

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

在STM32板上运行后如何更改UART波特率?

我正在使用STM32F746ZG并使用五个UARTs. All UARTs工作正常。有人可以告诉我在USART初始化后更改波特率的程序吗?我正在使用USART6和初始化9600波特率。开机后,没有任何通讯USART。我想将波特率从9600 to 57600 or 115200. 对于这个改变,我打了电话HAL_UART_DeInit()MX_USART6_UART_Init_57600()但它不起作用。如果我没有改变波特率,它工作正常。但是如果我改变了波特率,我无法通过以下方式接收数据USART. 如果有人知道解决方案,请告诉我。

以下是我的代码。

int main(void)
{
  HAL_Init();

  SystemClock_Config();


  MX_UART7_Init();
  MX_UART8_Init();
  MX_USART2_UART_Init();
  MX_USART3_UART_Init();
  MX_USART6_UART_Init();

}

void MX_USART6_UART_Init(void)
{
  huart6.Instance = USART6;
  huart6.Init.BaudRate = 9600;
  huart6.Init.WordLength = UART_WORDLENGTH_8B;
  huart6.Init.StopBits = UART_STOPBITS_1;
  huart6.Init.Parity = UART_PARITY_NONE;
  huart6.Init.Mode = UART_MODE_TX_RX;
  huart6.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart6.Init.OverSampling = UART_OVERSAMPLING_16;
  huart6.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart6.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart6) != HAL_OK)
  {
    Error_Handler(); …
Run Code Online (Sandbox Code Playgroud)

stm32 stm32f4discovery stm32f4 stm32f7

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

FreeRTOS 任务优先级和堆栈大小

我有 STM32F746ZG Nucleo-144pin 板并使用 STMCubeMx 生成代码。我选择了 CubeMx 提供的 10.0.0 版本的 FreeRTOS,工具链是 SW4STM32。

我做了两个任务,以下是我的功能。我的代码在这里:

void led1_task(void)
{
    while(1)
    {
        HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7);
        HAL_Delay(1000);
    }
}

void led2_task(void)
{
    while(1)
    {
        HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_14);
        HAL_Delay(4100);
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 任务优先。

我发现如果两个任务具有相同的任务优先级,则这两个任务可以正常工作,但是如果它们的任务优先级不同,则低任务不起作用。

  xTaskCreate(led1_task, "led1_task", 1024, NULL, 2, NULL);  ==> Works fine.
  xTaskCreate(led2_task, "led2_task", 1024, NULL, 2, NULL);  ==> Works fine.

----------------------------------------------------------------------------

  xTaskCreate(led1_task, "led1_task", 1024, NULL, 2, NULL);  ==> This task is not working.
  xTaskCreate(led2_task, "led2_task", 1024, NULL, 3, NULL);  ==> Works fine.

Run Code Online (Sandbox Code Playgroud)
  1. 任务堆栈大小。

如果两个任务的堆栈大小加起来大于 3 KB,则确认任务未正常工作。下面的代码工作正常。

  xTaskCreate(led1_task, …
Run Code Online (Sandbox Code Playgroud)

stm32 freertos stm32f7 cubemx stm32cubemx

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