标签: stm32f4discovery

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

我正在使用 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
查看次数

如何在stm32f4discover上检测按钮按下?

我喜欢按下按钮来切换电路板上的4个LED,就像

Click-1 --> LED 1 on
Click-2 --> LED 2 on
Click-3 --> LED 3 on
Click-4 --> LED 4 on
Click-5 --> LED 1 off
Click-6 --> LED 2 off
Click-7 --> LED 3 off
Click-8 --> LED 4 off
Click-9 --> LED 1 on
…
Run Code Online (Sandbox Code Playgroud)

到目前为止我有这个,但按钮点击检测没有按预期工作:

/*
 * This file is part of the libopencm3 project.
 *
 * Copyright (C) 2009 Uwe Hermann <uwe@hermann-uwe.de>,
 * Copyright (C) 2010 Piotr Esden-Tempski <piotr@esden.net>
 * Copyright (C) 2011 Stephen Caudle <scaudle@doceme.com> …
Run Code Online (Sandbox Code Playgroud)

c stm32f4discovery libopencm3

5
推荐指数
1
解决办法
8590
查看次数

STM32F4板上的SPI Slave设置

我试图通过SPI在Master&Slave配置中在两个STM32F4发现板之间进行通信.我已经有了主机的代码,但我对我需要对从机的SPI初始化所做的更改感到困惑.

我还想在主设备发送数据时实现一个中断,而不是让从设备一直轮询RXNE寄存器.但是,我不确定SPI的NVIC的确切配置.

以下是主配置代码

void init_SPI1(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    SPI_InitTypeDef SPI_InitStruct;

    // enable clock for used IO pins
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

    /* configure pins used by SPI1
     * PA5 = SCK
     * PA6 = MISO
     * PA7 = MOSI
     */
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6 | GPIO_Pin_5;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOA, &GPIO_InitStruct);

    // connect SPI1 pins to SPI alternate function
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);

    // enable clock for …
Run Code Online (Sandbox Code Playgroud)

interrupt spi master-slave stm32f4discovery

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

错误 -3 打开 ST-Link/V2 设备

我正在尝试在 Linux Mint 16 下通过 Eclipse 编译和上传 STM32F4 Discovery 项目。该项目编译正确,但在上传过程中出现错误:

WARN src/stlink-usb.c: Error -3 opening ST-Link/V2 device 003:007
Run Code Online (Sandbox Code Playgroud)

我正在使用 stlink ( https://github.com/texane/stlink ) 并且 ST-LINK/V2 列在总线 003、设备 007 下的 lsusb 上。

其他人遇到了同样的错误并找到了解决方案?

eclipse linux stm32 stm32f4discovery

5
推荐指数
1
解决办法
6573
查看次数

STM32F4 HAL DMA UART TX

我正在尝试让 UART 传输在 stm32f405 上通过 DMA 工作。我的应用程序的这一部分旨在作为命令行界面发送文本字符串。我让 UART 的 RX 部分与 DMA 配合良好(使用 1 字节循环 DMA 来处理传入的任何内容),但 TX 端被证明有点棘手。

我可以使用以下方式发送数据字符串:HAL_UART_Transmit_DMA(&handle, pData[], strlen(pData))前提是函数的连续调用之间存在延迟。一旦我的程序决定依次发送两个字符串,新的数据指针就会被忽略。

通过使用,while(HAL_UART_Transmit_DMA(...) != HAL_OK){}我可以让程序等待所需的时间并发送连续的字符串。

这可以工作一段时间(几十次传输),然后由于 HAL_NOT_OK 而卡住。

作为参考,我的 DMA 设置是:DMA2 stream 7, channel 4, mem to periph, periph inc disabled, mem inc enabled, mem and periph align byte, normal mode (not circular), low priority, fifo disabled

UART 设置为9600 baud, 8 bit word, …

fifo stm32 dma uart stm32f4discovery

5
推荐指数
1
解决办法
3万
查看次数

STM32F4进行DMA传输(RX)时处理外设错误

我正在尝试使用DMA为RX和TX与UART外设进行通信.我正在使用ST提供的HAL库(使用STCubeMX生成).

我正在处理一个1.5MBaud的UART通道 - 所以为了不丢失任何数据,我已经在直接模式下配置DMA,使用循环缓冲器,并处理半传输中断以处理数据,并保持DMA在线获取更多数据.

问题是有时我可以在UART的状态寄存器中看到帧错误位是打开的,有时溢出错误标志也是打开的.

我可以处理丢失的字节(在结构化数据包上使用crc),但问题是外设停止接收数据 - 但DMA不会引发错误,或停止传输.

因此,如果我尝试接收数据,并且系统上的标志挂起.

我看到HAL提供了一个应该处理UART_Error的__weak函数,但它永远不会被调用 - 并且HAL句柄中的状态保持正常.只看一下注册表就可以看出存在问题.

我该如何检测/处理这类错误?

谢谢

embedded microcontroller dma uart stm32f4discovery

5
推荐指数
1
解决办法
2445
查看次数

如何写入STM32 Flash

我想从我的用户代码写入 STM32F407VGT 的闪存扇区 11 以存储一些数据。我用过stm32f4xx_hal_flash.c图书馆。我首先使用以下代码擦除扇区:

void Flash_Init(void)
{        
    FLASH_EraseInitTypeDef pEraseInit;

    pEraseInit.Banks = FLASH_BANK_1;
    pEraseInit.NbSectors = 1;
    pEraseInit.Sector = FLASH_SECTOR_10;
    pEraseInit.VoltageRange = FLASH_VOLTAGE_RANGE_3;
    pEraseInit.TypeErase = FLASH_TYPEERASE_SECTORS;

    if(HAL_FLASH_Unlock() == HAL_OK)
    {
        __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR );
        HAL_FLASHEx_Erase(&pEraseInit,0);
        HAL_FLASH_Lock();
    }
}
Run Code Online (Sandbox Code Playgroud)

程序在到达HAL_FLASHEx_Erase(&pEraseInit,0);函数时挂起。我的分散文件如下所示:

LR_IROM1 0x08000000 0x01000000  {    ; load region size_region
  ER_IROM1 0x08000000 0x01000000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00020000  {  ; RW data …
Run Code Online (Sandbox Code Playgroud)

stm32 flash-memory stm32f4discovery stm32f4 stm32-hal

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

STM32F4 - 我可以在中断例程中使用延迟吗?

我正在为一个项目使用 STM32F4 探索板,我想知道我是否正确地解决了这个问题。当我按下一个按钮时,会触发一个运行例程的外部中断;不使用延迟,这部分工作正常。当例程移动伺服器然后将其返回到其原始位置时,会添加一个延迟,以允许伺服器在返回到原始位置之前赶上新的 PWM 输出。当我运行带有延迟的新中断例程时,电路板锁定。在调试中,代码似乎在延迟循环中停滞。

延迟是一个简单的 sysstick 例程。把它放在我的中断中是不好的做法(因此是我崩溃的原因),我应该使用不同的方法吗?例如,在外部中断程序中设置一个一次性定时器,在设定的时间后返回伺服?

谢谢!

c arm stm32 stm32f4discovery

4
推荐指数
1
解决办法
5043
查看次数

带有HAL库的STM32F4-Discovery(STM32F429ZIT6)上的RS232(UART)?

背景

这是我的一些背景知识,这样你的家伙就可以知道我拥有或者没有相关知识.我完全是这种嵌入式系统的新手.我对电子产品一无所知,我是一个纯粹的软件人.

我唯一的嵌入式系统体验是Raspberry Pi,它与STM32F4 Discovery完全不同.

我可以使用Raspberry Pi上的标准Linux C库实现UART读/写编程,该库连接到带有USB转RS232适配器和电压转换器IC的PC.

我的设备和开发环境

  • 带STM32F429ZIT6 MCU的STM32F429I-DISCO板
  • USB-to-RS232电缆和电压转换器IC,在Raspberry Pi上运行良好.
  • Keil uVision 5 IDE.

我想要实现的目标

我想在STM32F429 Discovery板上实现一个可以向/从PC发送/接收消息的编程.(例如,将字符串发送到PC.当从PC接收到字符串时,点亮板上的LED)

我现在做了什么

现在我已经设置了我的Keil uVision IDE,并且可以编译/运行闪烁LED示例,我也可以编辑该示例以按照我希望的方式控制LED.(例如,按下用户按钮时打开LED,按下按钮时将其关闭)

所以LED部件已经完成了,它是如何使用RS232电缆与STM32F4 Discovery板进行通信的缺失部分.

我的问题

  1. 首先,我想知道我是否正确理解了该板的PIN定义.根据该数据表,我应该将DB9上的TX引脚连接到PD2(UART5_RX),将DB9上的RX引脚连接到PC12(UART5_TX),将DB9上的VCC引脚连接到3.3V,将DB9上的GND连接到GND.这个连接是否正确?

  2. 是否有关于如何在最新版本的Keil uVision上使用新HAL库的UART的示例代码?我在网上搜索过,但是大多数示例代码或教程都使用了一个函数RCC_AHB1PeriphClockCmd,这个函数似乎不存在于来自Keil uVision的新HAL库中.

更新

  1. 我的USB转串口适配器是067b:2303 Prolific Technology, Inc. PL2303 Serial Port一个电平转换器IC.看起来像这样:在此输入图像描述

  2. 当连接到Raspberry Pi时,我遵循了这条指令,因此IC上的VCC/GND连接到Raspberry Pi上的3.3V/GND,我不确定是否需要这样做.

  3. 通过"HAL"库,我的意思是这个stm32f4xx_hal_usart.c文件,根据评论中的许可声明,它似乎来自意法半导体.虽然这个文件中有一些指令,但我仍然很难弄清楚如何使用这个驱动程序.举例来说,我不能告诉之间的区别Enable USARTx interface clockEnable the clock for USART GPIOs,我不知道我怎样才能实现这些功能.因此,如果有一个示例代码,那将是一个很大的帮助,因为我可以将它与这些指令进行比较.

在此输入图像描述 在此输入图像描述

embedded serial-port uart stm32f4discovery

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