本帖最后由 Penguins 于 2025-5-4 12:26 编辑
使用Keil5 AC6环境将G4可运行的串口程序移植到H7,发送正常但接收失败,经查为未进入void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size),各位大神帮忙看看。
工程使用CubeMX生成,芯片为V版,未使用I-Cache和D-Cache,未配置MPU,改写sct文件如下。
[C] 纯文本查看 复制代码 LR_IROM1 0x08000000 0x00200000 { ; load region size_region
ER_IROM1 0x08000000 0x00200000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
RW_IRAM1 0x20000000 0x00020000 { ; RW data - 128KB DTCM
.ANY (+RW +ZI)
}
RW_IRAM2 0x24000000 0x00080000 { ; RW data - 512KB AXI SRAM
*(.bss.RAM_D1)
*(.data.RAM_D1)
}
RW_IRAM3 0x30000000 0x00048000 { ; RW data - 128KB SRAM1 + 128KB SRAM2 + 32KB SRAM3
*(.bss.RAM_D2)
*(.data.RAM_D2)
}
RW_IRAM4 0x38000000 0x00010000 { ; RW data - 64KB SRAM4
*(.bss.RAM_D3)
*(.data.RAM_D3)
}
}
以下为G4已验证的UART+DMA驱动,带可变参数列表,支持连发。
[C] 纯文本查看 复制代码 #include "stdio.h"
#include "string.h"
#include "stdarg.h"
#define UART_BufSize 101
typedef struct {
UART_HandleTypeDef *huart;
char TxMsg[UART_BufSize];
char RxMsg[UART_BufSize];
} myUART_HandleTypeDef;
void myUART_Start_Receive_DMA(myUART_HandleTypeDef *myhuart)
{
memset(myhuart->RxMsg, 0, UART_BufSize);
HAL_UARTEx_ReceiveToIdle_DMA(myhuart->huart, (uint8_t *)myhuart->RxMsg, UART_BufSize - 1);
}
void myUART_Transmit_DMA(myUART_HandleTypeDef *myhuart, const char *format, ...)
{
va_list ap;
va_start(ap, format);
while (myhuart->huart->gState != HAL_UART_STATE_READY || myhuart->huart->hdmatx->State != HAL_DMA_STATE_READY);
vsnprintf(myhuart->TxMsg, UART_BufSize, format, ap);
va_end(ap);
HAL_UART_Transmit_DMA(myhuart->huart, (uint8_t *)myhuart->TxMsg, strlen(myhuart->TxMsg));
}
以下为CubeMX生成的main.c文件中添加的部分,已确认myUART位于AXI SRAM,可被通用DMA读写。
[C] 纯文本查看 复制代码 __attribute__((section(".data.RAM_D1"))) myUART_HandleTypeDef myUART = { .huart = &huart1 };
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
if (huart == myUART.huart && huart->RxEventType != HAL_UART_RXEVENT_HT)
{
myUART_Transmit_DMA(&myUART, "RxMsg: %s", myUART.RxMsg);
myUART_Start_Receive_DMA(&myUART);
}
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
myUART_Transmit_DMA(&myUART, "H743VET6 UART1 Connected.\n");
myUART_Transmit_DMA(&myUART, "Continuous sending test.\n");
myUART_Start_Receive_DMA(&myUART);
while (1)
{
}
}
|