新手上路
- 积分
- 40
- 金钱
- 40
- 注册时间
- 2018-10-26
- 在线时间
- 8 小时
|

楼主 |
发表于 2018-10-26 11:47:14
|
显示全部楼层
因为STM32H7的总线变得复杂了,然后dma传输方式从内存到外设的时候没有注意到发送缓存是分配到了DTCM(mapped at address 0x2000 0000),然后在.map文件当中找到的变量地址确实是分配到了这个储存区域,然后dma发送移植是transfer error。需要使用绝对定位指令分配到D2 domain区域,dma发送功能正常。
也是因为STM32H7的dma不能够访问DTCM造成的。这个提供了一个DMA传输错误解决的思路就是首先确定变量地址DMA是否能够到达,若是不能够,需要使用绝对定位将变量分配至能够到达的储存区域。
__attribute__ ((at(0x30000000)));//D2 domain 区域从0x30000000 开始。修改之后功能正常
/**
* @brief USART1串口打印(结合HAL_UART_Transmit_DMA的重定义)
* @param *fmt,... 要打印的数据内容,用法类似printf
* @retval void
*/
void u1_printf(char* fmt,...)
{
static __align(8) uint8_t USART1_TX_BUF[512] __attribute__ ((at(0x30000000)));
va_list ap;
va_start(ap,fmt);
vsnprintf((char*)USART1_TX_BUF,512,fmt,ap);
va_end(ap);
if(HAL_UART_Transmit_DMA(&huart1,USART1_TX_BUF,strlen((const char*)USART1_TX_BUF)) == HAL_OK)usart1dma_tx_flag = 0;
}
|
|