你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32 spi dma写操作无反应

[复制链接]
꯭池꯭灵꯭友꯭ 提问时间:2021-9-5 14:05 /
使用CubeMx V6.3 FW_F1 V1.8.4 SPI1配置成DMA模式接收发送。
使用 HAL_SPI_TransmitReceive(&hspi1, (uint8_t *)&dataTx, (uint8_t *)&dataRx, 6, 10000);可以正常操作,
使用HAL_SPI_TransmitReceive_DMA(&hspi1, (uint8_t *)&dataTx, (uint8_t *)&dataRx, 6);就检测不到时钟,数据。
但是会进入DMA发送中断。
void DMA1_Channel3_IRQHandler(void)
{
  /* USER CODE BEGIN DMA1_Channel3_IRQn 0 */

  /* USER CODE END DMA1_Channel3_IRQn 0 */
  HAL_DMA_IRQHandler(&hdma_spi1_tx);
  /* USER CODE BEGIN DMA1_Channel3_IRQn 1 */
        setCS(HIGH);
  /* USER CODE END DMA1_Channel3_IRQn 1 */
}



  1. static void MX_DMA_Init(void)
  2. {

  3.   /* DMA controller clock enable */
  4.   __HAL_RCC_DMA1_CLK_ENABLE();

  5.   /* DMA interrupt init */
  6.   /* DMA1_Channel2_IRQn interrupt configuration */
  7.   HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 2, 0);
  8.   HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);
  9.   /* DMA1_Channel3_IRQn interrupt configuration */
  10.   HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 1, 0);
  11.   HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);

  12. }
  13. static void MX_SPI1_Init(void)
  14. {

  15.   /* USER CODE BEGIN SPI1_Init 0 */

  16.   /* USER CODE END SPI1_Init 0 */

  17.   /* USER CODE BEGIN SPI1_Init 1 */

  18.   /* USER CODE END SPI1_Init 1 */
  19.   /* SPI1 parameter configuration*/
  20.   hspi1.Instance = SPI1;
  21.   hspi1.Init.Mode = SPI_MODE_MASTER;
  22.   hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  23.   hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  24.   hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  25.   hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
  26.   hspi1.Init.NSS = SPI_NSS_SOFT;
  27.   hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
  28.   hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  29.   hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  30.   hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  31.   hspi1.Init.CRCPolynomial = 10;
  32.   if (HAL_SPI_Init(&hspi1) != HAL_OK)
  33.   {
  34.     Error_Handler();
  35.   }
  36.   /* USER CODE BEGIN SPI1_Init 2 */

  37.   /* USER CODE END SPI1_Init 2 */

  38. }
  39. void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
  40. {
  41.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  42.   if(hspi->Instance==SPI1)
  43.   {
  44.   /* USER CODE BEGIN SPI1_MspInit 0 */

  45.   /* USER CODE END SPI1_MspInit 0 */
  46.     /* Peripheral clock enable */
  47.     __HAL_RCC_SPI1_CLK_ENABLE();

  48.     __HAL_RCC_GPIOA_CLK_ENABLE();
  49.     /**SPI1 GPIO Configuration
  50.     PA5     ------> SPI1_SCK
  51.     PA6     ------> SPI1_MISO
  52.     PA7     ------> SPI1_MOSI
  53.     */
  54.     GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_7;
  55.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  56.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  57.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  58.     GPIO_InitStruct.Pin = GPIO_PIN_6;
  59.     GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  60.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  61.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  62.     /* SPI1 DMA Init */
  63.     /* SPI1_TX Init */
  64.     hdma_spi1_tx.Instance = DMA1_Channel3;
  65.     hdma_spi1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
  66.     hdma_spi1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
  67.     hdma_spi1_tx.Init.MemInc = DMA_MINC_ENABLE;
  68.     hdma_spi1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  69.     hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  70.     hdma_spi1_tx.Init.Mode = DMA_NORMAL;
  71.     hdma_spi1_tx.Init.Priority = DMA_PRIORITY_LOW;
  72.     if (HAL_DMA_Init(&hdma_spi1_tx) != HAL_OK)
  73.     {
  74.       Error_Handler();
  75.     }

  76.     __HAL_LINKDMA(hspi,hdmatx,hdma_spi1_tx);

  77.     /* SPI1_RX Init */
  78.     hdma_spi1_rx.Instance = DMA1_Channel2;
  79.     hdma_spi1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
  80.     hdma_spi1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
  81.     hdma_spi1_rx.Init.MemInc = DMA_MINC_ENABLE;
  82.     hdma_spi1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  83.     hdma_spi1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  84.     hdma_spi1_rx.Init.Mode = DMA_NORMAL;
  85.     hdma_spi1_rx.Init.Priority = DMA_PRIORITY_LOW;
  86.     if (HAL_DMA_Init(&hdma_spi1_rx) != HAL_OK)
  87.     {
  88.       Error_Handler();
  89.     }

  90.     __HAL_LINKDMA(hspi,hdmarx,hdma_spi1_rx);

  91.     /* SPI1 interrupt Init */
  92.     HAL_NVIC_SetPriority(SPI1_IRQn, 0, 0);
  93.     HAL_NVIC_EnableIRQ(SPI1_IRQn);
  94.   /* USER CODE BEGIN SPI1_MspInit 1 */

  95.   /* USER CODE END SPI1_MspInit 1 */
  96.   }
  97.   else if(hspi->Instance==SPI2)
  98.   {
  99.   /* USER CODE BEGIN SPI2_MspInit 0 */

  100.   /* USER CODE END SPI2_MspInit 0 */
  101.     /* Peripheral clock enable */
  102.     __HAL_RCC_SPI2_CLK_ENABLE();

  103.     __HAL_RCC_GPIOB_CLK_ENABLE();
  104.     /**SPI2 GPIO Configuration
  105.     PB13     ------> SPI2_SCK
  106.     PB14     ------> SPI2_MISO
  107.     PB15     ------> SPI2_MOSI
  108.     */
  109.     GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_15;
  110.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  111.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  112.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  113.     GPIO_InitStruct.Pin = GPIO_PIN_14;
  114.     GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  115.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  116.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  117.   /* USER CODE BEGIN SPI2_MspInit 1 */

  118.   /* USER CODE END SPI2_MspInit 1 */
  119.   }

  120. }
  121. int main(void)
  122. {
  123.   /* USER CODE BEGIN 1 */

  124.   /* USER CODE END 1 */

  125.   /* MCU Configuration--------------------------------------------------------*/

  126.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  127.   HAL_Init();

  128.   /* USER CODE BEGIN Init */

  129.   /* USER CODE END Init */

  130.   /* Configure the system clock */
  131.   SystemClock_Config();

  132.   /* USER CODE BEGIN SysInit */

  133.   /* USER CODE END SysInit */

  134.   /* Initialize all configured peripherals */
  135.   MX_GPIO_Init();
  136.   MX_SPI1_Init();
  137.   MX_SPI2_Init();
  138.   MX_USART1_UART_Init();
  139.   MX_DMA_Init();
  140.   MX_USART2_UART_Init();
  141.   /* USER CODE BEGIN 2 */
  142.        
  143.         WriteData(REG_SOFTWARE_RESET,0,0);//DAC¸´Î»
  144.         WriteData(REG_WRITE_UPDATE_DAC_CHANNEL,DAC_A,16384);//µ÷ÊÔÉèÒ»¸öDAC
  145.         WriteData(REG_WRITE_UPDATE_DAC_CHANNEL,DAC_B,16384);//µ÷ÊÔÉèÒ»¸öDAC
  146.        
  147.         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_RESET);
  148.         HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);
  149.         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);

  150.         setCS(LOW);       
  151.         //HAL_SPI_TransmitReceive(&hspi1, (uint8_t *)&dataTx, (uint8_t *)&dataRx, 6, 10000);
  152.                
  153.         HAL_SPI_TransmitReceive_DMA(&hspi1, (uint8_t *)&dataTx, (uint8_t *)&dataRx, 6);
  154. //        hspi1->Instance->CR3 |= USART_CR3_DMAT;//ʹÄÜ´®¿ÚDMA·¢ËÍ
  155. //setCS(HIGH);

  156. //        adcStartup();
  157. //        adc_channel_data         ADCtemp;
  158.   /* USER CODE END 2 */

  159.   /* Infinite loop */
  160.   /* USER CODE BEGIN WHILE */
  161.   while (1)
复制代码


收藏 评论9 发布时间:2021-9-5 14:05

举报

9个回答
꯭池꯭灵꯭友꯭ 回答时间:2021-9-6 10:07:24

butterflyspring 回答时间:2021-9-6 10:51:40
在官方的库中有例程,可以打开参考或对比一
STM32Cube_FW_F1_V1.8.0\Projects\STM32F103RB-Nucleo\Examples\SPI\SPI_FullDuplex_ComDMA
꯭池꯭灵꯭友꯭ 回答时间:2021-9-6 19:00:30

发现在初始化的时候竟然出错, hdma->Instance->CCR = tmp;没有赋值成功,不知道是什么原因造成的
꯭池꯭灵꯭友꯭ 回答时间:2021-9-6 19:04:27
butterflyspring 发表于 2021-9-6 10:51
在官方的库中有例程,可以打开参考或对比一
STM32Cube_FW_F1_V1.8.0\Projects\STM32F103RB-Nucleo\Examples ...

发现在DMA初始化的并未成功,hdma->Instance->CCR = tmp;这句赋值出错  ,不知道是什么原因
꯭池꯭灵꯭友꯭ 回答时间:2021-9-6 19:27:25
赋值不成功.png 赋值不成功
꯭池꯭灵꯭友꯭ 回答时间:2021-9-7 14:14:45
终于找到问题了,不知道算不算CUBE的BUG,
  MX_GPIO_Init();
  MX_SPI1_Init();
  MX_SPI2_Init();
  MX_USART1_UART_Init();
  MX_DMA_Init();
  MX_USART2_UART_Init();

这段程序先配置SPI1的DMA,再打开DMA的时钟。实际上DMA未开时钟,写操作是无效的。
xmshao 回答时间:2021-9-7 15:22:10
꯭池꯭灵꯭友꯭ 发表于 2021-9-7 14:14
终于找到问题了,不知道算不算CUBE的BUG,
  MX_GPIO_Init();
  MX_SPI1_Init();

这个跟初始化顺序有点关系,这里有个相关话题。一个跟初始化顺序有关的异常话题 (qq.com)
꯭池꯭灵꯭友꯭ 回答时间:2021-9-7 20:02:55
xmshao 发表于 2021-9-7 15:22
这个跟初始化顺序有点关系,这里有个相关话题。一个跟初始化顺序有关的异常话题 (qq.com)
...

文章里讲的是:用户在整理代码过程中无意调整了二者的初始化顺序。可是我并没有调整顺序,而且每次产生的的代码都是开DMA外部时钟在后面
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版