
在CUBEMX生成的STM32F407VET6的I2S主机接收模式与I2S主机发送模式 如何进行动态调整 或者如何实现主机全双工? 初始化如下: I2S_HandleTypeDef hi2s2; DMA_HandleTypeDef hdma_spi2_tx; / I2S2 init function / void MX_I2S2_Init(void) { / USER CODE BEGIN I2S2_Init 0 / / USER CODE END I2S2_Init 0 / / USER CODE BEGIN I2S2_Init 1 / / USER CODE END I2S2_Init 1 / hi2s2.Instance = SPI2; hi2s2.Init.Mode = I2S_MODE_MASTER_TX; hi2s2.Init.Standard = I2S_STANDARD_PHILIPS; hi2s2.Init.DataFormat = I2S_DATAFORMAT_16B; hi2s2.Init.MCLKOutput = I2S_MCLKOUTPUT_ENABLE; hi2s2.Init.AudioFreq = I2S_AUDIOFREQ_48K; hi2s2.Init.CPOL = I2S_CPOL_LOW; hi2s2.Init.ClockSource = I2S_CLOCK_PLL; hi2s2.Init.FullDuplexMode = I2S_FULLDUPLEXMODE_DISABLE; if (HAL_I2S_Init(&hi2s2) != HAL_OK) { Error_Handler(); } / USER CODE BEGIN I2S2_Init 2 / / USER CODE END I2S2_Init 2 / } void HAL_I2S_MspInit(I2S_HandleTypeDef* i2sHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; if(i2sHandle->Instance==SPI2) { / USER CODE BEGIN SPI2_MspInit 0 / / USER CODE END SPI2_MspInit 0 / /** Initializes the peripherals clock */ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_I2S; PeriphClkInitStruct.PLLI2S.PLLI2SN = 72; PeriphClkInitStruct.PLLI2S.PLLI2SR = 3; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { Error_Handler(); } / I2S2 clock enable / __HAL_RCC_SPI2_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /**I2S2 GPIO Configuration PC3 ------> I2S2_SD PB12 ------> I2S2_WS PB13 ------> I2S2_CK PC6 ------> I2S2_MCK */ GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); / I2S2 DMA Init / / SPI2_TX Init / hdma_spi2_tx.Instance = DMA1_Stream4; hdma_spi2_tx.Init.Channel = DMA_CHANNEL_0; hdma_spi2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; hdma_spi2_tx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_spi2_tx.Init.MemInc = DMA_MINC_ENABLE; hdma_spi2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; hdma_spi2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; hdma_spi2_tx.Init.Mode = DMA_CIRCULAR; hdma_spi2_tx.Init.Priority = DMA_PRIORITY_LOW; hdma_spi2_tx.Init.FIFOMode = DMA_FIFOMODE_ENABLE; hdma_spi2_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; hdma_spi2_tx.Init.MemBurst = DMA_MBURST_SINGLE; hdma_spi2_tx.Init.PeriphBurst = DMA_PBURST_SINGLE; if (HAL_DMA_Init(&hdma_spi2_tx) != HAL_OK) { Error_Handler(); } __HAL_LINKDMA(i2sHandle,hdmatx,hdma_spi2_tx); / USER CODE BEGIN SPI2_MspInit 1 / // hdma_spi2_rx.Instance->CR |= (DMA_IT_HT | DMA_IT_TC); // 或通过HAL_DMA_Init() // __HAL_DMA_ENABLE_IT(&hdma_spi2_rx,DMA_IT_TC|DMA_IT_HT); / USER CODE END SPI2_MspInit 1 / } } void HAL_I2S_MspDeInit(I2S_HandleTypeDef* i2sHandle) { if(i2sHandle->Instance==SPI2) { / USER CODE BEGIN SPI2_MspDeInit 0 / / USER CODE END SPI2_MspDeInit 0 / / Peripheral clock disable / __HAL_RCC_SPI2_CLK_DISABLE(); /**I2S2 GPIO Configuration PC3 ------> I2S2_SD PB12 ------> I2S2_WS PB13 ------> I2S2_CK PC6 ------> I2S2_MCK */ HAL_GPIO_DeInit(GPIOC, GPIO_PIN_3|GPIO_PIN_6); HAL_GPIO_DeInit(GPIOB, GPIO_PIN_12|GPIO_PIN_13); / I2S2 DMA DeInit / HAL_DMA_DeInit(i2sHandle->hdmatx); / USER CODE BEGIN SPI2_MspDeInit 1 / / USER CODE END SPI2_MspDeInit 1 / } } 接收配置 I2S_HandleTypeDef hi2s2; DMA_HandleTypeDef hdma_spi2_rx; / I2S2 init function / void MX_I2S2_Init(void) { / USER CODE BEGIN I2S2_Init 0 / / USER CODE END I2S2_Init 0 / / USER CODE BEGIN I2S2_Init 1 / / USER CODE END I2S2_Init 1 / hi2s2.Instance = SPI2; hi2s2.Init.Mode = I2S_MODE_MASTER_RX; hi2s2.Init.Standard = I2S_STANDARD_PHILIPS; hi2s2.Init.DataFormat = I2S_DATAFORMAT_16B; hi2s2.Init.MCLKOutput = I2S_MCLKOUTPUT_ENABLE; hi2s2.Init.AudioFreq = I2S_AUDIOFREQ_48K; hi2s2.Init.CPOL = I2S_CPOL_LOW; hi2s2.Init.ClockSource = I2S_CLOCK_PLL; hi2s2.Init.FullDuplexMode = I2S_FULLDUPLEXMODE_DISABLE; if (HAL_I2S_Init(&hi2s2) != HAL_OK) { Error_Handler(); } / USER CODE BEGIN I2S2_Init 2 / / USER CODE END I2S2_Init 2 / } void HAL_I2S_MspInit(I2S_HandleTypeDef* i2sHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; if(i2sHandle->Instance==SPI2) { / USER CODE BEGIN SPI2_MspInit 0 / / USER CODE END SPI2_MspInit 0 / /** Initializes the peripherals clock */ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_I2S; PeriphClkInitStruct.PLLI2S.PLLI2SN = 72; PeriphClkInitStruct.PLLI2S.PLLI2SR = 3; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { Error_Handler(); } / I2S2 clock enable / __HAL_RCC_SPI2_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /**I2S2 GPIO Configuration PC3 ------> I2S2_SD PB12 ------> I2S2_WS PB13 ------> I2S2_CK PC6 ------> I2S2_MCK */ GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); / I2S2 DMA Init / / SPI2_RX Init / hdma_spi2_rx.Instance = DMA1_Stream3; hdma_spi2_rx.Init.Channel = DMA_CHANNEL_0; hdma_spi2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_spi2_rx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_spi2_rx.Init.MemInc = DMA_MINC_ENABLE; hdma_spi2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; hdma_spi2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; hdma_spi2_rx.Init.Mode = DMA_CIRCULAR; hdma_spi2_rx.Init.Priority = DMA_PRIORITY_MEDIUM; hdma_spi2_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; if (HAL_DMA_Init(&hdma_spi2_rx) != HAL_OK) { Error_Handler(); } __HAL_LINKDMA(i2sHandle,hdmarx,hdma_spi2_rx); / USER CODE BEGIN SPI2_MspInit 1 / // hdma_spi2_rx.Instance->CR |= (DMA_IT_HT | DMA_IT_TC); // 或通过HAL_DMA_Init() // __HAL_DMA_ENABLE_IT(&hdma_spi2_rx,DMA_IT_TC|DMA_IT_HT); / USER CODE END SPI2_MspInit 1 / } } void HAL_I2S_MspDeInit(I2S_HandleTypeDef* i2sHandle) { if(i2sHandle->Instance==SPI2) { / USER CODE BEGIN SPI2_MspDeInit 0 / / USER CODE END SPI2_MspDeInit 0 / / Peripheral clock disable / __HAL_RCC_SPI2_CLK_DISABLE(); /**I2S2 GPIO Configuration PC3 ------> I2S2_SD PB12 ------> I2S2_WS PB13 ------> I2S2_CK PC6 ------> I2S2_MCK */ HAL_GPIO_DeInit(GPIOC, GPIO_PIN_3|GPIO_PIN_6); HAL_GPIO_DeInit(GPIOB, GPIO_PIN_12|GPIO_PIN_13); / I2S2 DMA DeInit / HAL_DMA_DeInit(i2sHandle->hdmarx); / USER CODE BEGIN SPI2_MspDeInit 1 / / USER CODE END SPI2_MspDeInit 1 / } } |
STM32F407 多机RS485串口通讯+地址位唤醒+DMA空闲线接收,无法进入中断服务程序。
设置RDP等级为2的同时,有什么办法可以确保后续还能够烧录程序
STM32F407VET6 I2S 采用DMA传输问题
有STM32F4倒车雷达响应例程吗?
STM32F429I倒车雷达响应
STM32多通道FFT运算异常
在其他电脑上编译成功没有错误并且能够烧录,换了电脑之后编译出现一堆错误,并且不能烧录程序
SD卡初始化第一次初始化后再次初始化时会失败。
串口重定向接收不同
关于三轴陀螺仪 I3G4250D
比方:
static void MX_I2S2_Init(void)
{
hi2s2.Instance = SPI2;
hi2s2.Init.Mode = I2S_MODE_MASTER_RX;
hi2s2.Init.Standard = I2S_STANDARD_PHILIPS;
hi2s2.Init.DataFormat = I2S_DATAFORMAT_24B;
hi2s2.Init.MCLKOutput = I2S_MCLKOUTPUT_ENABLE;
hi2s2.Init.AudioFreq = I2S_AUDIOFREQ_48K;
hi2s2.Init.CPOL = I2S_CPOL_LOW;
hi2s2.Init.ClockSource = I2S_CLOCK_PLL;
hi2s2.Init.FullDuplexMode = I2S_FULLDUPLEXMODE_ENABLE;
if (HAL_I2S_Init(&hi2s2) != HAL_OK)
{
Error_Handler();
}
}
我按这个配置后发现主时钟输出是不对,采用HAL_I2S_Receive_DMA(&hi2s2,(uint16_t*)adc_buf,2048);也无法接收到数据
[md]如果你要做全双工,配置就是这样的。
至于你说的时钟问题,那就看你的具体设计了。