OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1103|回复: 2

折腾两周了,求大神帮忙分析一下,H750串口DMA无法发送,开发板原版程序copy改写也不行

[复制链接]

4

主题

7

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2023-1-20
在线时间
6 小时
发表于 2023-12-2 21:49:03 | 显示全部楼层 |阅读模式
10金钱
调试H750串口DMA发送两周了,还是不能启动发送,但是用HAL_UART_Transmit()函数是可以发送的。
用正点原子的例程没有问题,但是将烧写算法改为“STM32H750XX”后就不能发送了,难道DMA发送和烧写算法有关系?
将正点原子的例程简化了,只提出串口DMA发送的相关部分,也是不行。
还用了“野火”的DMA串口发送例程,是可以正常发送的,但将“野火”例程移植到正点原子的模版里就不行了。
哪位大神指点一下到底是怎么回事。
下面是源程序:变量定义部分就没有列出了。
//**********************************************************************************//int main(void)
{
        Cache_Enable();                                                        //打开L1-Cache
        HAL_Init();                                                                //初始化HAL库
        Stm32_Clock_Init(160,5,2,4);                        //设置时钟,400Mhz
        delay_init(400);                                                //延时初始化
        LED_Init();                                                                //初始化LED时钟  
        uart_init(115200);                                                //串口初始化
        USART_DMA_Config();                                                //DMA配置
       
        for (i=0; i<Send_SUM; i++)
                USART1_Tx[i] = 0xAA;
       
        while(1)
        {
                HAL_UART_DMAStop(&UART1_Handler);                                                                                      //必须先关闭一次DMA
                HAL_UART_Transmit_DMA (&UART1_Handler, (uint8_t *)USART1_Tx, Send_SUM);                //启动DMA传输
                delay_ms(1000);
        }       
}

//**********************************************************************************//

//************** 初始化串口1及相关配置STAR ***************************//
void uart_init(u32 bound)
{       
      GPIO_InitTypeDef GPIO_Initure;
        __HAL_RCC_GPIOA_CLK_ENABLE();                                        //使能GPIOA时钟
        __HAL_RCC_USART1_CLK_ENABLE();                                        //使能USART1时钟
       
        GPIO_Initure.Pin = GPIO_PIN_9;                                        //PA9
        GPIO_Initure.Mode = GPIO_MODE_AF_PP;                                //复用推挽输出
        GPIO_Initure.Pull=GPIO_PULLUP;                                        //上拉
        GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;                //高速
        GPIO_Initure.Alternate=GPIO_AF7_USART1;                        //复用为USART1
        HAL_GPIO_Init(GPIOA,&GPIO_Initure);                                   //初始化PA9
        GPIO_Initure.Pin=GPIO_PIN_10;                                                                //PA10
        HAL_GPIO_Init(GPIOA,&GPIO_Initure);                                   //初始化PA10

        UART1_Handler.Instance=USART1;                                            //USART1
        UART1_Handler.Init.BaudRate=bound;                                    //波特率
        UART1_Handler.Init.WordLength=UART_WORDLENGTH_8B;   //字长为8位数据格式
        UART1_Handler.Init.StopBits=UART_STOPBITS_1;            //一个停止位
        UART1_Handler.Init.Parity=UART_PARITY_NONE;                    //无奇偶校验位
        UART1_Handler.Init.Mode=UART_MODE_TX_RX;                    //收发模式
        UART1_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;   //无硬件流控
        UART1_Handler.Init.OverSampling = UART_OVERSAMPLING_16;
       UART1_Handler.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED;
       UART1_Handler.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
        HAL_UART_Init(&UART1_Handler);                                                                                                                            //使能UART1
}

//************** 初始化串口1及相关配置END ***************************//

//************** DMA配置START ***************************//
void USART_DMA_Config(void)
{
   __DMA2_CLK_ENABLE();                                                                                                 /*开启DMA时钟*/
  UART1DMA_Handle.Instance = DMA2_Stream7;
  HAL_DMA_DeInit(&UART1DMA_Handle);
  UART1DMA_Handle.Init.Request = DMA_REQUEST_USART1_TX;
  UART1DMA_Handle.Init.Direction= DMA_MEMORY_TO_PERIPH;       
  UART1DMA_Handle.Init.PeriphInc = DMA_PINC_DISABLE;
  UART1DMA_Handle.Init.MemInc = DMA_MINC_ENABLE;       
  UART1DMA_Handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  UART1DMA_Handle.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;       
  UART1DMA_Handle.Init.Mode = DMA_NORMAL;         
  UART1DMA_Handle.Init.Priority = DMA_PRIORITY_MEDIUM;      
  UART1DMA_Handle.Init.FIFOMode = DMA_FIFOMODE_DISABLE;        
  UART1DMA_Handle.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;   
  UART1DMA_Handle.Init.MemBurst = DMA_MBURST_SINGLE;   
  UART1DMA_Handle.Init.PeriphBurst = DMA_PBURST_SINGLE;   
  HAL_DMA_Init(&UART1DMA_Handle);
  __HAL_LINKDMA(&UART1_Handler, hdmatx, UART1DMA_Handle);
}

//************** DMA配置END ***************************//

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

7

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2023-1-20
在线时间
6 小时
 楼主| 发表于 2023-12-4 20:06:40 | 显示全部楼层
已解决,串口发送数据地址不能分配在DTCM中
回复

使用道具 举报

77

主题

521

帖子

0

精华

高级会员

Rank: 4

积分
729
金钱
729
注册时间
2014-9-30
在线时间
124 小时
发表于 2023-12-23 11:17:31 | 显示全部楼层
forxy 发表于 2023-12-4 20:06
已解决,串口发送数据地址不能分配在DTCM中

哦 , 谢谢 楼主 , H750  的 内部 RAM  分类不同 。有限制 。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 21:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表