TL;DR:文档说明我必须先在微控制器中启用特定的内存区域,然后才能使用它。但是,我可以在启用它之前使用它,甚至可以在禁用它之后使用它。这怎么可能?
我目前正在为 STM32H743 微控制器开发一个应用程序。我不明白当时钟被禁用时 RAM 似乎如何正常工作。
该 MCU 具有多个存储器,分布在多个电源域中:
我想使用SRAM1。在参考手册 ( RM0433 Rev. 7) 中,第 366 页指出:
如果 CPU 要使用位于 D2 域(SRAM1、SRAM2 和 SRAM3)中的存储器,则必须启用它们。
在第 452 页的寄存器设置中描述了如何执行此操作:
RCC AHB2 时钟寄存器(RCC_AHB2ENR):
SRAM1EN: SRAM1 块使能
由软件置位和复位。置位时,该位表示 SRAM1 由 CPU 分配。它使 D2 …
我想从我的用户代码写入 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) 我正在使用stm32f0 MCU.
我想传输从uart收到的每个字节.我在从uart收到的每个字节上启用一个中断.
我的代码非常简单.
uint8_t Rx_data[5];
//Interrupt callback routine
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART1) //current UART
{
HAL_UART_Transmit(&huart1, &Rx_data[0], 1, 100);
HAL_UART_Receive_IT(&huart1, Rx_data, 1); //activate UART receive interrupt every time on receiving 1 byte
}
}
Run Code Online (Sandbox Code Playgroud)
我的PC将ASCII传输12345678到stm32.如果事情按预期工作,PC应该12345678收回.但是,PC收到了1357.代码有什么问题?
我正在使用stm32f0 MCU.
我有一个简单的UART回声代码,其中接收的每个字节都将被传输出去.我测试它是否有效.这里是;
uint8_t Rx_data[5];
uint32_t tx_timeout = 0;
//Interrupt callback routine
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART1) //current UART
{
HAL_UART_Transmit(&huart1, &Rx_data[0], 1, tx_timeout);
HAL_UART_Receive_IT(&huart1, Rx_data, 1); //activate UART receive interrupt every time on receiving 1 byte
}
}
Run Code Online (Sandbox Code Playgroud)
即使它有效,我对代码感到不舒服.首先,tx_timeout是0并且大多数代码示例都是非零的.我不知道副作用.其次,HAL_UART_Transmit()是一个阻塞调用,不建议在中断中使用阻塞调用.所以,我决定使用中断进行uart传输HAL_UART_Transmit_IT()而不是阻塞调用.这是修改后的代码;
uint8_t Rx_data[5];
uint32_t tx_timeout = 0;
//Interrupt callback routine
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART1) //current UART
{
HAL_UART_Transmit_IT(&huart1, &Rx_data[0], 1);
HAL_UART_Receive_IT(&huart1, Rx_data, 1); //activate UART receive interrupt every …Run Code Online (Sandbox Code Playgroud) 我的微控制器项目上的闪存刚刚用完。如何减小 HAL 库的大小或以其他方式减少它在我的项目中所占的比例?