我的程序改成这样了:
- typedef struct{
- uint32_t BR1; //数据量
- uint32_t DAR; //填充仅需要更新目标地址
- uint32_t DSR; //填充仅需要更新目标地址
- uint32_t LLR; //数据链
- }tDMA_LLS;
- #define DMA_MEM_CH GPDMA1_Channel0
- #define DMA_MEM_LLS_CH GPDMA1_Channel0
-
- //tDMA_LLS DMA_MEM_LLS[MAX_LLS_ARRAY_NUM] __@0x20000000 ;
- tDMA_LLS DMA_MEM_LLS[MAX_LLS_ARRAY_NUM];
- /****************************************
- 填充一片区域,超出65535需要使用动态链表
- size 是 uint32_t 的数量,按照字节数计算一个传输链
- 不得超出16383*4 字节
- ***********************************************/
- static void DMA_LLS_Config ( tDMA_LLS *plls,uint32_t bytes,uint32_t dar, uint32_t sar, uint32_t lls)
- {
- uint8_t max = (bytes +MAXIUM_DMA_BLOCK_SIZE-1)/MAXIUM_DMA_BLOCK_SIZE-1;
- uint8_t i =0;
- for (;i<max;i++){
- plls[i].DAR = dar +i*(MAXIUM_DMA_BLOCK_SIZE);
- //plls[i].SAR = sar +i*(MAXIUM_DMA_BLOCK_SIZE);
- plls[i].DSR = sar +i*(MAXIUM_DMA_BLOCK_SIZE);
- plls[i].BR1 = MAXIUM_DMA_BLOCK_SIZE; //当前传输数量
- plls[i].LLR = lls|(uint16_t)(uint64_t)&plls[i+1];//指向下一个链表的低16位
- }
- plls[i].DAR = dar +i*(MAXIUM_DMA_BLOCK_SIZE); //新内存地址
- plls[i].DSR = sar +i*(MAXIUM_DMA_BLOCK_SIZE); //新内存地址
- plls[i].BR1 = bytes % MAXIUM_DMA_BLOCK_SIZE; //剩余数据量
- plls[i].LLR = 0; //表示链表结束
- }
- void DmaCopyHalfWordBlock (uint32_t bytes, uint16_t * dst ,uint16_t *src)
- {
-
- DMA_MEM_CH->CTR1 = DMA_CTR1_SAP|DMA_CTR1_DINC|DMA_CTR1_SINC|\
- (DMA_DEST_DATAWIDTH_HALFWORD)|(DMA_DEST_DATAWIDTH_HALFWORD);
- DMA_MEM_CH ->CTR2 = DMA_REQUEST_SW|DMA_BREQ_BLOCK|DMA_TCEM_EACH_LL_ITEM_TRANSFER; //使用软件 DMA请求
- DMA_MEM_CH ->CSAR = (uint32_t)(uint64_t)src;
- DMA_MEM_CH ->CDAR = (uint32_t)(uint64_t)dst;
- if( bytes <=MAXIUM_DMA_BLOCK_SIZE ){
- DMA_MEM_CH ->CBR1 = bytes ;
- }
- else{
- DMA_MEM_CH ->CBR1 = MAXIUM_DMA_BLOCK_SIZE;
- uint32_t lls = DMA_CLLR_UB1|DMA_CLLR_UDA|DMA_CLLR_USA|DMA_CLLR_ULL;
- uint32_t base = (uint32_t )(uint64_t)DMA_MEM_LLS;
- DMA_MEM_CH ->CLLR = lls|(uint16_t)base;
- DMA_MEM_CH ->CLBAR = (uint32_t)base&0xffff0000; //MSB,LLS BASE
- DMA_LLS_Config ( DMA_MEM_LLS,\
- bytes - MAXIUM_DMA_BLOCK_SIZE,\
- (uint32_t)(uint64_t)dst+MAXIUM_DMA_BLOCK_SIZE, (uint32_t)(uint64_t)src+MAXIUM_DMA_BLOCK_SIZE,lls);
- }
- //启动传输
- DMA_MEM_CH ->CCR = DMA_CCR_EN;
- }
- /**
- * [url=/u/brief]@brief[/url] The application entry point.
- * @retval int
- */
- int main(void)
- {
- /* USER CODE BEGIN 1 */
- /* STM32U5xx HAL library initialization:
- - Configure the Flash prefetch
- - Configure the Systick to generate an interrupt each 1 msec
- - Set NVIC Group Priority to 3
- - Low Level Initialization
- */
- /* USER CODE END 1 */
- /* MCU Configuration--------------------------------------------------------*/
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
- HAL_Init();
- /* USER CODE BEGIN Init */
- /* USER CODE END Init */
- /* Configure the System Power */
- SystemPower_Config();
- /* Configure the system clock */
- SystemClock_Config();
- __HAL_RCC_GPDMA1_CLK_ENABLE();
- //RCC_AHB1ENR_GPDMA1EN
- RCC_AHB1RSTR_GPDMA1RST;
- /* USER CODE BEGIN SysInit */
- handle_GPDMA1_Channel10.Instance = GPDMA1_Channel10;
- handle_GPDMA1_Channel10.Init.Request = DMA_REQUEST_SW;
- handle_GPDMA1_Channel10.Init.BlkHWRequest = DMA_BREQ_SINGLE_BURST;
- handle_GPDMA1_Channel10.Init.Direction = DMA_MEMORY_TO_MEMORY;
- handle_GPDMA1_Channel10.Init.SrcInc = DMA_SINC_FIXED;
- handle_GPDMA1_Channel10.Init.DestInc = DMA_DINC_FIXED;
- handle_GPDMA1_Channel10.Init.SrcDataWidth = DMA_SRC_DATAWIDTH_BYTE;
- handle_GPDMA1_Channel10.Init.DestDataWidth = DMA_DEST_DATAWIDTH_BYTE;
- handle_GPDMA1_Channel10.Init.Priority = DMA_LOW_PRIORITY_LOW_WEIGHT;
- handle_GPDMA1_Channel10.Init.SrcBurstLength = 1;
- handle_GPDMA1_Channel10.Init.DestBurstLength = 1;
- handle_GPDMA1_Channel10.Init.TransferAllocatedPort = DMA_SRC_ALLOCATED_PORT0|DMA_DEST_ALLOCATED_PORT0;
- handle_GPDMA1_Channel10.Init.TransferEventMode = DMA_TCEM_BLOCK_TRANSFER;
- handle_GPDMA1_Channel10.Init.Mode = DMA_NORMAL;
- if (HAL_DMA_Init(&handle_GPDMA1_Channel10) != HAL_OK)
- {
- // Error_Handler();
- }
- if (HAL_DMA_ConfigChannelAttributes(&handle_GPDMA1_Channel10, DMA_CHANNEL_NPRIV) != HAL_OK)
- {
- // Error_Handler();
- }
- /* USER CODE END SysInit */
- /* Initialize all configured peripherals */
- //MX_GPDMA1_Init();
- MX_ICACHE_Init();
-
- /* USER CODE BEGIN 2 */
- /* Initialize LEDs */
-
-
- /* Reset transferErrorDetected to 0, it will be set to 1 if a transfer error is detected */
- // /* Reset transferCompleteDetected to 0, it will be set to 1 if a transfer is correctly completed */
- // /* Select Callbacks functions called after Transfer complete and Transfer error */
- DmaCopyHalfWordBlock (BUFFER_SIZE,(uint16_t *)aSRC_Const_Buffer1,aDST_Buffer1);
- /* Configure the source, destination and buffer size DMA fields and Start DMA Channel/Stream transfer */
- /* Enable All the DMA interrupts */
-
- /* Wait for end of transmission or an error occurred */
-
- /* USER CODE END 2 */
- /* Infinite loop */
- /* USER CODE BEGIN WHILE */
- while (1)
- {
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- HAL_Delay(250);
- BSP_LED_Toggle(LED1);
- }
- /* USER CODE END 3 */
- }
|