高级会员

- 积分
- 714
- 金钱
- 714
- 注册时间
- 2014-10-15
- 在线时间
- 172 小时
|
1金钱
我有一块STM32U575的开发板,有一个DMA的例程,把FLASH里的内容传到RAM.
它用的是32位传,也就是字传。
我试图把它改成半字传。
以下是我的一部分程序:
- DMA_HandleTypeDef handle_GPDMA1_Channel15;
- static const uint16_t aSRC_Const_Buffer1[BUFFER_SIZE] =
- {
- 0x0102,0x0304, 0x0506,0x0708,
- 0x090a,0x0b0c,0x0d0e,0x0f10,
- 0x1112,0x1314,0x1516,0x1718,
- 0x191a,0x1b1c,0x1d1e,0x1f20,
- 0x0102,0x0304, 0x0506,0x0708,
- 0x090a,0x0b0c,0x0d0e,0x0f10,
- 0x1112,0x1314,0x1516,0x1718,
- 0x191a,0x1b1c,0x1d1e,0x1f20
-
- };
- static uint16_t aDST_Buffer1[BUFFER_SIZE];
复制代码 原来的启动传输函数是按字传的,我改为半字传,所以原来的函数就不能用了,我自己写了一个
- HAL_StatusTypeDef HAL_DMA_Start_IT1(DMA_HandleTypeDef *const hdma,
- uint16_t SrcAddress,
- uint16_t DstAddress,
- uint32_t SrcDataSize)
- {
- /* Check the DMA peripheral handle parameter */
- if (hdma == NULL)
- {
- return HAL_ERROR;
- }
- /* Check the parameters */
- assert_param(IS_DMA_BLOCK_SIZE(SrcDataSize));
- /* Process locked */
- __HAL_LOCK(hdma);
- /* Check DMA channel state */
- if (hdma->State == HAL_DMA_STATE_READY)
- {
- /* Update the DMA channel state */
- hdma->State = HAL_DMA_STATE_BUSY;
- /* Update the DMA channel error code */
- hdma->ErrorCode = HAL_DMA_ERROR_NONE;
- /* Configure the source address, destination address, the data size and clear flags */
- DMA_SetConfig1(hdma, SrcAddress, DstAddress, SrcDataSize);
- /* Enable common interrupts: Transfer Complete and Transfer Errors ITs */
- __HAL_DMA_ENABLE_IT(hdma, (DMA_IT_TC | DMA_IT_DTE | DMA_IT_ULE | DMA_IT_USE | DMA_IT_TO));
- /* Check half transfer complete callback */
- if (hdma->XferHalfCpltCallback != NULL)
- {
- /* If Half Transfer complete callback is set, enable the corresponding IT */
- __HAL_DMA_ENABLE_IT(hdma, DMA_IT_HT);
- }
- /* Check Half suspend callback */
- if (hdma->XferSuspendCallback != NULL)
- {
- /* If Transfer suspend callback is set, enable the corresponding IT */
- __HAL_DMA_ENABLE_IT(hdma, DMA_IT_SUSP);
- }
- /* Enable DMA channel */
- __HAL_DMA_ENABLE(hdma);
- }
- else
- {
- /* Update the DMA channel error code */
- hdma->ErrorCode = HAL_DMA_ERROR_BUSY;
- /* Process unlocked */
- __HAL_UNLOCK(hdma);
- return HAL_ERROR;
- }
- return HAL_OK;
- }
复制代码 DMA_SetConfig1(hdma, SrcAddress, DstAddress, SrcDataSize);这个函数原来也是按32位来写的,我也进行了改写
- static void DMA_SetConfig1(DMA_HandleTypeDef const *const hdma,
- uint16_t SrcAddress,
- uint16_t DstAddress,
- uint32_t SrcDataSize)
- {
- /* Configure the DMA channel data size */
- MODIFY_REG(hdma->Instance->CBR1, DMA_CBR1_BNDT, (SrcDataSize & DMA_CBR1_BNDT));
- /* Clear all interrupt flags */
- __HAL_DMA_CLEAR_FLAG(hdma, DMA_FLAG_TC | DMA_FLAG_HT | DMA_FLAG_DTE | DMA_FLAG_ULE | DMA_FLAG_USE | DMA_FLAG_SUSP |
- DMA_FLAG_TO);
- /* Configure DMA channel source address */
- hdma->Instance->CSAR = SrcAddress;
- /* Configure DMA channel destination address */
- hdma->Instance->CDAR = DstAddress;
- }
复制代码 初始化DMA函数我把字改为半字:
- static void MX_GPDMA1_Init(void)
- {
- /* USER CODE BEGIN GPDMA1_Init 0 */
- /* USER CODE END GPDMA1_Init 0 */
- /* Peripheral clock enable */
- __HAL_RCC_GPDMA1_CLK_ENABLE();
- /* GPDMA1 interrupt Init */
- HAL_NVIC_SetPriority(GPDMA1_Channel15_IRQn, 0, 0);
- HAL_NVIC_EnableIRQ(GPDMA1_Channel15_IRQn);
- /* USER CODE BEGIN GPDMA1_Init 1 */
- /* USER CODE END GPDMA1_Init 1 */
- handle_GPDMA1_Channel15.Instance = GPDMA1_Channel15;
- handle_GPDMA1_Channel15.Init.Request = DMA_REQUEST_SW;
- handle_GPDMA1_Channel15.Init.BlkHWRequest = DMA_BREQ_SINGLE_BURST;
- handle_GPDMA1_Channel15.Init.Direction = DMA_MEMORY_TO_MEMORY;
- handle_GPDMA1_Channel15.Init.SrcInc = DMA_SINC_INCREMENTED;
- handle_GPDMA1_Channel15.Init.DestInc = DMA_DINC_INCREMENTED;
- //handle_GPDMA1_Channel15.Init.SrcDataWidth = DMA_SRC_DATAWIDTH_WORD;
- handle_GPDMA1_Channel15.Init.SrcDataWidth = DMA_SRC_DATAWIDTH_HALFWORD;
- //handle_GPDMA1_Channel15.Init.DestDataWidth = DMA_DEST_DATAWIDTH_WORD;
- handle_GPDMA1_Channel15.Init.DestDataWidth = DMA_SRC_DATAWIDTH_HALFWORD;
- handle_GPDMA1_Channel15.Init.Priority = DMA_LOW_PRIORITY_HIGH_WEIGHT;
- handle_GPDMA1_Channel15.Init.SrcBurstLength = 1;
- handle_GPDMA1_Channel15.Init.DestBurstLength = 1;
- handle_GPDMA1_Channel15.Init.TransferAllocatedPort = DMA_SRC_ALLOCATED_PORT0|DMA_DEST_ALLOCATED_PORT1;
- //handle_GPDMA1_Channel15.Init.TransferAllocatedPort = 0x0000|0x4000;
- handle_GPDMA1_Channel15.Init.TransferEventMode = DMA_TCEM_BLOCK_TRANSFER;
- handle_GPDMA1_Channel15.Init.Mode = DMA_NORMAL;
- if (HAL_DMA_Init(&handle_GPDMA1_Channel15) != HAL_OK)
- {
- Error_Handler();
- }
- if (HAL_DMA_ConfigChannelAttributes(&handle_GPDMA1_Channel15, DMA_CHANNEL_NPRIV) != HAL_OK)
- {
- Error_Handler();
- }
- /* USER CODE BEGIN GPDMA1_Init 2 */
- /* USER CODE END GPDMA1_Init 2 */
- }
复制代码 结果不成功,什么也没传过去。
还有一点,这句if (HAL_DMA_Start_IT1(&handle_GPDMA1_Channel15, (uint16_t)&aSRC_Const_Buffer1, (uint16_t *)&aDST_Buffer1, (BUFFER_SIZE * 2U)) != HAL_OK)
有两个警告:
我搞不懂,为什么穿不过去?问题出在哪?谢谢!
|
|