标签: stm32-hal

为什么即使禁用时钟 D2 RAM 也能正常工作?

TL;DR:文档说明我必须先在微控制器中启用特定的内存区域,然后才能使用它。但是,我可以在启用它之前使用它,甚至可以在禁用它之后使用它。这怎么可能?


我目前正在为 STM32H743 微控制器开发一个应用程序。我不明白当时钟被禁用时 RAM 似乎如何正常工作。

该 MCU 具有多个存储器,分布在多个电源域中:

  • 在 D1 域中,它具有 ITCMRAM + DTCMRAM + AXI SRAM (64 + 128 + 512 kB)
  • 在 D2 域中,它有 SRAM1 + SRAM2 + SRAM3 (128 + 128 + 32 kB)
  • 在 D3 域中,它具有 SRAM4 + 备份 SRAM (64 + 4 kB)

我想使用SRAM1。在参考手册 ( RM0433 Rev. 7) 中,第 366 页指出:

如果 CPU 要使用位于 D2 域(SRAM1、SRAM2 和 SRAM3)中的存储器,则必须启用它们。

在第 452 页的寄存器设置中描述了如何执行此操作:

RCC AHB2 时钟寄存器(RCC_AHB2ENR):

SRAM1EN: SRAM1 块使能
由软件置位和复位。置位时,该位表示 SRAM1 由 CPU 分配。它使 D2 …

microcontroller clock stm32 stm32-hal stm32h7

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

如何写入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万
查看次数

无法通过UART传输每个字符

我正在使用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.代码有什么问题?

interrupt stm32 uart stm32f0 stm32-hal

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

为什么UART发送中断在这种情况下无效?

我正在使用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)

interrupt stm32 uart stm32f0 stm32-hal

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

STM32F HAL库太大

我的微控制器项目上的闪存刚刚用完。如何减小 HAL 库的大小或以其他方式减少它在我的项目中所占的比例?

stm32 stm32-hal

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