我正在使用 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 时有效。
如果您知道解决方案,请告诉我。提前感谢您的回复。
我正在使用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) 我喜欢按下按钮来切换电路板上的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) 我试图通过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) 我正在尝试在 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 上。
其他人遇到了同样的错误并找到了解决方案?
我正在尝试让 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, …
我正在尝试使用DMA为RX和TX与UART外设进行通信.我正在使用ST提供的HAL库(使用STCubeMX生成).
我正在处理一个1.5MBaud的UART通道 - 所以为了不丢失任何数据,我已经在直接模式下配置DMA,使用循环缓冲器,并处理半传输中断以处理数据,并保持DMA在线获取更多数据.
问题是有时我可以在UART的状态寄存器中看到帧错误位是打开的,有时溢出错误标志也是打开的.
我可以处理丢失的字节(在结构化数据包上使用crc),但问题是外设停止接收数据 - 但DMA不会引发错误,或停止传输.
因此,如果我尝试接收数据,并且系统上的标志挂起.
我看到HAL提供了一个应该处理UART_Error的__weak函数,但它永远不会被调用 - 并且HAL句柄中的状态保持正常.只看一下注册表就可以看出存在问题.
我该如何检测/处理这类错误?
谢谢
我想从我的用户代码写入 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) 我正在为一个项目使用 STM32F4 探索板,我想知道我是否正确地解决了这个问题。当我按下一个按钮时,会触发一个运行例程的外部中断;不使用延迟,这部分工作正常。当例程移动伺服器然后将其返回到其原始位置时,会添加一个延迟,以允许伺服器在返回到原始位置之前赶上新的 PWM 输出。当我运行带有延迟的新中断例程时,电路板锁定。在调试中,代码似乎在延迟循环中停滞。
延迟是一个简单的 sysstick 例程。把它放在我的中断中是不好的做法(因此是我崩溃的原因),我应该使用不同的方法吗?例如,在外部中断程序中设置一个一次性定时器,在设定的时间后返回伺服?
谢谢!
背景
这是我的一些背景知识,这样你的家伙就可以知道我拥有或者没有相关知识.我完全是这种嵌入式系统的新手.我对电子产品一无所知,我是一个纯粹的软件人.
我唯一的嵌入式系统体验是Raspberry Pi,它与STM32F4 Discovery完全不同.
我可以使用Raspberry Pi上的标准Linux C库实现UART读/写编程,该库连接到带有USB转RS232适配器和电压转换器IC的PC.
我的设备和开发环境
我想要实现的目标
我想在STM32F429 Discovery板上实现一个可以向/从PC发送/接收消息的编程.(例如,将字符串发送到PC.当从PC接收到字符串时,点亮板上的LED)
我现在做了什么
现在我已经设置了我的Keil uVision IDE,并且可以编译/运行闪烁LED示例,我也可以编辑该示例以按照我希望的方式控制LED.(例如,按下用户按钮时打开LED,按下按钮时将其关闭)
所以LED部件已经完成了,它是如何使用RS232电缆与STM32F4 Discovery板进行通信的缺失部分.
我的问题
首先,我想知道我是否正确理解了该板的PIN定义.根据该数据表,我应该将DB9上的TX引脚连接到PD2(UART5_RX),将DB9上的RX引脚连接到PC12(UART5_TX),将DB9上的VCC引脚连接到3.3V,将DB9上的GND连接到GND.这个连接是否正确?
是否有关于如何在最新版本的Keil uVision上使用新HAL库的UART的示例代码?我在网上搜索过,但是大多数示例代码或教程都使用了一个函数RCC_AHB1PeriphClockCmd,这个函数似乎不存在于来自Keil uVision的新HAL库中.
更新
我的USB转串口适配器是067b:2303 Prolific Technology, Inc. PL2303 Serial Port一个电平转换器IC.看起来像这样:
当连接到Raspberry Pi时,我遵循了这条指令,因此IC上的VCC/GND连接到Raspberry Pi上的3.3V/GND,我不确定是否需要这样做.
通过"HAL"库,我的意思是这个stm32f4xx_hal_usart.c文件,根据评论中的许可声明,它似乎来自意法半导体.虽然这个文件中有一些指令,但我仍然很难弄清楚如何使用这个驱动程序.举例来说,我不能告诉之间的区别Enable USARTx interface clock和Enable the clock for USART GPIOs,我不知道我怎样才能实现这些功能.因此,如果有一个示例代码,那将是一个很大的帮助,因为我可以将它与这些指令进行比较.
stm32f4discovery ×10
stm32 ×6
uart ×3
c ×2
dma ×2
embedded ×2
stm32f4 ×2
stm32f7 ×2
arm ×1
eclipse ×1
fifo ×1
flash-memory ×1
interrupt ×1
libopencm3 ×1
linux ×1
master-slave ×1
serial-port ×1
spi ×1
stm32-hal ×1
stm32f0 ×1