OpenEdv-开源电子网

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

stm32H750 MiniPro串口DMA接收不到数据(LL库),求助!!

[复制链接]

2

主题

16

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2020-8-17
在线时间
19 小时
发表于 2022-12-29 19:49:00 | 显示全部楼层 |阅读模式
20金钱
本帖最后由 744615811 于 2023-1-4 00:12 编辑

正点原子的MiniH750开发板,想用串口1设置DMA+空闲中断接收,用hal库可以完成,但是LL库不知道为什么就是没有数据,cubeIDE+MX生成的初始化,也做了地址绑定。求大佬帮忙指点下哪里的问题,DMA没用中断所以没开,求助!!!部分代码如下:void void MX_USART1_UART_Init(void){

  /* USER CODE BEGIN USART1_Init 0 */

  /* USER CODE END USART1_Init 0 */

  LL_USART_InitTypeDef USART_InitStruct = {0};

  LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

  LL_RCC_SetUSARTClockSource(LL_RCC_USART16_CLKSOURCE_PCLK2);

  /* Peripheral clock enable */
  LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA1);

  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1);

  LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOA);
  /**USART1 GPIO Configuration
  PA9   ------> USART1_TX
  PA10   ------> USART1_RX
  */
  GPIO_InitStruct.Pin = LL_GPIO_PIN_9|LL_GPIO_PIN_10;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_7;
  LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* USART1 DMA Init */

  /* USART1_RX Init */
  LL_DMA_DisableStream(DMA1, LL_DMA_STREAM_0);

  LL_DMA_SetPeriphAddress(DMA1, LL_DMA_STREAM_0, LL_USART_DMA_GetRegAddr(USART1, LL_USART_DMA_REG_DATA_RECEIVE));
  LL_DMA_SetMemoryAddress(DMA1, LL_DMA_STREAM_0, buffer);
  LL_DMA_SetDataLength(DMA1, LL_DMA_STREAM_0, 256);

  LL_DMA_SetPeriphRequest(DMA1, LL_DMA_STREAM_0, LL_DMAMUX1_REQ_USART1_RX);

  LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_STREAM_0, LL_DMA_DIRECTION_PERIPH_TO_MEMORY);

  LL_DMA_SetStreamPriorityLevel(DMA1, LL_DMA_STREAM_0, LL_DMA_PRIORITY_LOW);

  LL_DMA_SetMode(DMA1, LL_DMA_STREAM_0, LL_DMA_MODE_NORMAL);

  LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_STREAM_0, LL_DMA_PERIPH_NOINCREMENT);

  LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_STREAM_0, LL_DMA_MEMORY_INCREMENT);

  LL_DMA_SetPeriphSize(DMA1, LL_DMA_STREAM_0, LL_DMA_PDATAALIGN_BYTE);

  LL_DMA_SetMemorySize(DMA1, LL_DMA_STREAM_0, LL_DMA_MDATAALIGN_BYTE);

  LL_DMA_DisableFifoMode(DMA1, LL_DMA_STREAM_0);

  LL_DMA_EnableStream(DMA1, LL_DMA_STREAM_0);

  /* USART1 interrupt Init */
  NVIC_SetPriority(USART1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
  NVIC_EnableIRQ(USART1_IRQn);

  /* USER CODE BEGIN USART1_Init 1 */

  /* USER CODE END USART1_Init 1 */
  USART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1;
  USART_InitStruct.BaudRate = 9600;
  USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
  USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
  USART_InitStruct.Parity = LL_USART_PARITY_NONE;
  USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
  USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
  USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
  LL_USART_Init(USART1, &USART_InitStruct);
  LL_USART_SetTXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8);
  LL_USART_SetRXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8);
  LL_USART_DisableFIFO(USART1);
  LL_USART_ConfigAsyncMode(USART1);

  /* USER CODE BEGIN WKUPType USART1 */

  LL_USART_ClearFlag_IDLE(USART1);
  LL_USART_EnableIT_RXNE_RXFNE(USART1);
  LL_USART_EnableIT_IDLE(USART1);
  LL_USART_EnableDMAReq_RX(USART1);
  /* USER CODE END WKUPType USART1 */

  LL_USART_Enable(USART1);

  /* Polling USART1 initialisation */
  while((!(LL_USART_IsActiveFlag_TEACK(USART1))) || (!(LL_USART_IsActiveFlag_REACK(USART1))))
  {
  }
  /* USER CODE BEGIN USART1_Init 2 */


  /* USER CODE END USART1_Init 2 */

}


void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
        if (LL_USART_IsEnabledIT_IDLE(USART1) && LL_USART_IsActiveFlag_IDLE(USART1)) {
                LL_DMA_DisableStream(DMA1, LL_DMA_STREAM_0);
                flag = 1;//断点处----------------------------------------------------------
                LL_DMA_SetDataLength(DMA1, LL_DMA_STREAM_0, 256);
                LL_DMA_EnableStream(DMA1, LL_DMA_STREAM_0);
                LL_USART_ClearFlag_IDLE(USART1);
        }
  /* USER CODE END USART1_IRQn 0 */
  /* USER CODE BEGIN USART1_IRQn 1 */

  /* USER CODE END USART1_IRQn 1 */
}


主程序初始化顺序应该也没问题
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART1_UART_Init();


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

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2020-8-17
在线时间
19 小时
 楼主| 发表于 2022-12-29 20:02:48 | 显示全部楼层
buffer的地址也是运行在RAM1
Name : buffer
        Details:'\0' <repeats 255 times>
        默认:0x24000020 <buffer>
        十进制:603979808
        十六进制:0x24000020
        二进制:100100000000000000000000100000
        Octal:04400000040
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2020-8-17
在线时间
19 小时
 楼主| 发表于 2022-12-29 20:25:52 | 显示全部楼层
类似的步骤DMA发送倒是没问题, 求大佬帮忙解答下
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3447
金钱
3447
注册时间
2017-7-4
在线时间
869 小时
发表于 2022-12-30 19:03:43 | 显示全部楼层
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2020-8-17
在线时间
19 小时
 楼主| 发表于 2023-1-3 02:01:59 | 显示全部楼层
Acuity 发表于 2022-12-30 19:03
参考H743 LL库实现:
https://acuity.blog.csdn.net/article/details/125108990

谢谢大佬回复,有看到您的文章,准备后续参考,目前是卡在buffer收不到数据。参照过您的配置初始化过程还是没有效果。
回复

使用道具 举报

3

主题

117

帖子

0

精华

高级会员

Rank: 4

积分
559
金钱
559
注册时间
2018-10-3
在线时间
107 小时
发表于 2023-1-3 11:14:18 | 显示全部楼层
H7的话。有没有开启CACHE。开启了的话注意DMA的缓冲区命中问题。没命中的话就去读取基本都是0
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2020-8-17
在线时间
19 小时
 楼主| 发表于 2023-1-4 00:10:04 | 显示全部楼层
wklhwkl 发表于 2023-1-3 11:14
H7的话。有没有开启CACHE。开启了的话注意DMA的缓冲区命中问题。没命中的话就去读取基本都是0

没有开启cache, 然后内存加载的位置也是DMA可以访问的。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 19:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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