找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2744|回复: 2
收起左侧

STM32 rs485 DMA接收没法进入中断的问题

[复制链接]
ID:393586 发表于 2018-12-4 11:13 | 显示全部楼层 |阅读模式
用usart2配置485,发现发送没问题,接收的时候没法进入中断。这是为什么呢?
  1. void USART2_UART_Init(uint32_t bound)
  2. {
  3.         HAL_UART_DeInit(&huart2);
  4.         __HAL_RCC_GPIOD_CLK_ENABLE();
  5.         __HAL_RCC_USART2_CLK_ENABLE();
  6.         __HAL_RCC_DMA1_CLK_ENABLE();               
  7.         
  8.         GPIO_Init2.Pin = GPIO_PIN_4;                     //485_RTS
  9.   GPIO_Init2.Mode =GPIO_MODE_AF_PP;
  10.   GPIO_Init2.Pull = GPIO_NOPULL;
  11.   GPIO_Init2.Speed = GPIO_SPEED_FREQ_HIGH;
  12.         GPIO_Init2.Alternate = GPIO_AF7_USART2;
  13.         HAL_GPIO_Init(GPIOD,&GPIO_Init2);

  14.         GPIO_Init2.Pin = GPIO_PIN_5;                     //485 TX config
  15.   GPIO_Init2.Mode = GPIO_MODE_AF_PP;
  16.   GPIO_Init2.Pull = GPIO_NOPULL;
  17.   GPIO_Init2.Speed = GPIO_SPEED_FREQ_HIGH;
  18.         GPIO_Init2.Alternate = GPIO_AF7_USART2;
  19.         HAL_GPIO_Init(GPIOD,&GPIO_Init2);

  20.         GPIO_Init2.Pin = GPIO_PIN_6;                    //485 RX config
  21.         GPIO_Init2.Mode = GPIO_MODE_AF_PP;
  22.         GPIO_Init2.Pull = GPIO_NOPULL;
  23.         GPIO_Init2.Speed = GPIO_SPEED_FREQ_HIGH;
  24.         GPIO_Init2.Alternate = GPIO_AF7_USART2;
  25.         HAL_GPIO_Init(GPIOD,&GPIO_Init2);        //USART2_GPIO配置
  26.   RS485_R;

  27.         huart2_dma_rx.Instance=DMA1_Stream5;                     //RX_DMA_config
  28.         huart2_dma_rx.Init.Channel=DMA_CHANNEL_4;
  29.         huart2_dma_rx.Init.Direction=DMA_PERIPH_TO_MEMORY;
  30.         huart2_dma_rx.Init.PeriphInc=DMA_PINC_DISABLE;
  31.         huart2_dma_rx.Init.MemInc=DMA_MINC_ENABLE;
  32.         huart2_dma_rx.Init.MemDataAlignment= DMA_MDATAALIGN_BYTE;
  33.         huart2_dma_rx.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE;
  34.         huart2_dma_rx.Init.Mode=DMA_NORMAL;
  35.         huart2_dma_rx.Init.Priority=DMA_PRIORITY_LOW;
  36.         huart2_dma_rx.Init.FIFOMode=DMA_FIFOMODE_DISABLE;
  37.         HAL_DMA_Init(&huart2_dma_rx);
  38.   __HAL_LINKDMA(&huart2, hdmarx, huart2_dma_rx);           //关联USART2和DMA
  39.         
  40.         huart2_dma_tx.Instance=DMA1_Stream6;                    //TX_DMA_config
  41.         huart2_dma_tx.Init.Channel=DMA_CHANNEL_4;
  42.         huart2_dma_tx.Init.Direction=DMA_MEMORY_TO_PERIPH;
  43.         huart2_dma_tx.Init.PeriphInc=DMA_PINC_DISABLE;
  44.         huart2_dma_tx.Init.MemInc=DMA_MINC_ENABLE;
  45.         huart2_dma_tx.Init.MemDataAlignment= DMA_MDATAALIGN_BYTE;
  46.         huart2_dma_tx.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE;
  47.         huart2_dma_tx.Init.Mode=DMA_NORMAL;
  48.         huart2_dma_tx.Init.Priority=DMA_PRIORITY_HIGH;
  49.         huart2_dma_tx.Init.FIFOMode=DMA_FIFOMODE_DISABLE;
  50.         HAL_DMA_Init(&huart2_dma_tx);
  51.         __HAL_LINKDMA(&huart2, hdmatx, huart2_dma_tx);  //关联USART2和DMA        
  52.         
  53.         huart2.Instance = USART2;              
  54.   huart2.Init.BaudRate = bound;
  55.   huart2.Init.WordLength = UART_WORDLENGTH_8B;
  56.   huart2.Init.StopBits = UART_STOPBITS_1;
  57.   huart2.Init.Parity = UART_PARITY_NONE;
  58.   huart2.Init.Mode = UART_MODE_TX_RX;
  59.   huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  60.   huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  61.   huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  62.         HAL_UART_Init(&huart2);    //串口配置
  63.         
  64.         HAL_NVIC_SetPriority(USART2_IRQn,3,3);            //配置USART2的中断并使能
  65.   HAL_NVIC_EnableIRQ(USART2_IRQn);        
  66.   HAL_NVIC_SetPriority(DMA1_Stream6_IRQn,3,3);          //配置DMA通道的中断并使能
  67.   HAL_NVIC_EnableIRQ(DMA1_Stream6_IRQn);
  68.   HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 3, 3);
  69.   HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);
  70. }


  71. int main(void)   
  72. {
  73.   HAL_Init();
  74.   Sysclk_config();
  75.         USART2_UART_Init(38400);
  76.         RS485_Send_data(buffer1,4);
  77.         HAL_Delay(1000);
  78.         HAL_UART_Receive_DMA(&huart2,buffer2,data_length);//打开DMA接收
  79.   while(1)
  80.   {
  81.            if(flag==1)
  82.           {
  83.            RS485_Send_data(buffer2,data_length);
  84.                  flag=0;
  85.           }
  86. }
  87. }


  88. void USART2_IRQHandler(void)
  89. {
  90.         HAL_UART_IRQHandler(&huart2);
  91. }

  92. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  93. {
  94.                 flag=1;
  95.           HAL_Delay(1000);
  96.                 HAL_UART_Receive_DMA(&huart2,buffer2,data_length);//打开DMA接收
  97. }
复制代码


回复

使用道具 举报

ID:393586 发表于 2018-12-5 11:37 | 显示全部楼层
问题已解决,还是485管脚配置的问题
回复

使用道具 举报

ID:393586 发表于 2018-12-5 11:37 | 显示全部楼层
基本配置要保证不能出错
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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