[STM32H7] 【STM32H745I-DISCO试用】12、播放视频

[复制链接]
 楼主| sujingliang 发表于 2025-2-13 16:12 | 显示全部楼层 |阅读模式
本帖最后由 sujingliang 于 2025-2-13 16:18 编辑



STM32H747I-DISCO、STM32H747I-EVAL的例程中有播放视频的例程,如STM32H747I-EVAL\Examples\JPEG\JPEG_MJPEG_VideoDecodingFromQSPI
本文用STM32H745I-DISCO实现一下


一、工程中需要添加的文件
7.png
AVI_parser.c AVI解码文件,官方提供的文件不做解释
decode_dma.c JPGE 解码文件,官方提供的文件不做解释
AVI_Player.c AVI例程文件
Retarget.c printf重定向

必要的BSP文件

硬件驱动文件mt48:SRAM;mt25:FLASH
stm32_lcd.c STM32的图形库文件


二、main.c
  1.   BSP_QSPI_Init(0, &init);
  2.   
  3.   BSP_QSPI_EnableMemoryMappedMode(0);

  4.         MX_JPEG_Init();
  5.         MX_MDMA_Init();

  6.         BSP_LCD_Init(0, LCD_ORIENTATION_LANDSCAPE);
  7.   UTIL_LCD_SetFuncDriver(&LCD_Driver);
  8.         UTIL_LCD_SetLayer(0);


  9.         BSP_LED_Init(LED_GREEN);
  10.   BSP_LED_Init(LED_RED);

  11.         
  12.         AVI_player_demo();
初始化flash、JPEG、MDMA、LCD
运行AVI DEMO程序

JPEG初始化
  1. static void MX_JPEG_Init(void)
  2. {

  3.   /* USER CODE BEGIN JPEG_Init 0 */

  4.   /* USER CODE END JPEG_Init 0 */

  5.   /* USER CODE BEGIN JPEG_Init 1 */

  6.   /* USER CODE END JPEG_Init 1 */
  7.   hjpeg.Instance = JPEG;
  8.   if (HAL_JPEG_Init(&hjpeg) != HAL_OK)
  9.   {
  10.     Error_Handler();
  11.   }
  12.   /* USER CODE BEGIN JPEG_Init 2 */

  13.   /* USER CODE END JPEG_Init 2 */

  14. }
MDMA初始化:
  1. static void MX_MDMA_Init(void)
  2. {

  3.   /* MDMA controller clock enable */
  4.   __HAL_RCC_MDMA_CLK_ENABLE();
  5.   /* Local variables */

  6.   /* MDMA interrupt initialization */
  7.   /* MDMA_IRQn interrupt configuration */
  8.   HAL_NVIC_SetPriority(MDMA_IRQn, 0x08, 0x0F);
  9.   HAL_NVIC_EnableIRQ(MDMA_IRQn);

  10. }
MPU_Config
  1. void MPU_Config(void)
  2. {
  3.   MPU_Region_InitTypeDef MPU_InitStruct = {0};

  4.   /* Disables the MPU */
  5.   HAL_MPU_Disable();

  6.   /** Initializes and configures the Region and the memory to be protected
  7.   */
  8.   MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  9.   MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  10.   MPU_InitStruct.BaseAddress = 0x0;
  11.   MPU_InitStruct.Size = MPU_REGION_SIZE_4GB;
  12.   MPU_InitStruct.SubRegionDisable = 0x87;
  13.   MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  14.   MPU_InitStruct.AccessPermission = MPU_REGION_NO_ACCESS;
  15.   MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
  16.   MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;
  17.   MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  18.   MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;

  19.   HAL_MPU_ConfigRegion(&MPU_InitStruct);

  20.   /** Initializes and configures the Region and the memory to be protected
  21.   */
  22.   MPU_InitStruct.Number = MPU_REGION_NUMBER1;
  23.   MPU_InitStruct.BaseAddress = 0xD0000000;
  24.   MPU_InitStruct.Size = MPU_REGION_SIZE_32MB;
  25.   MPU_InitStruct.SubRegionDisable = 0x0;
  26.   MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  27.   MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  28.   MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
  29.   MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;

  30.   HAL_MPU_ConfigRegion(&MPU_InitStruct);
  31.         
  32.         
  33.         /* Configure the MPU QSPI flash */
  34.   MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  35.   MPU_InitStruct.BaseAddress = 0x90000000;
  36.   MPU_InitStruct.Size = MPU_REGION_SIZE_128MB;
  37.   MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  38.   MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
  39.   MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
  40.   MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  41.   MPU_InitStruct.Number = MPU_REGION_NUMBER2;
  42.   MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  43.   MPU_InitStruct.SubRegionDisable = 0x0;
  44.   MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
  45.   
  46.   HAL_MPU_ConfigRegion(&MPU_InitStruct);
  47.         
  48.   /* Enables the MPU */
  49.   HAL_MPU_Enable(MPU_HFNMI_PRIVDEF);

  50. }



三、AVI_Player.c

1、定义常量
//AVI文件地址 位于flash,首地址0x90000000
#define AVI_FILE_ADDRESS ((uint32_t)(0x90000000)) /*Address of the MJPEG AVI file located on the QSPI */

//LCD显示地址
#define LCD_FRAME_BUFFER        0xD0000000
//JPEG解码双缓冲地址
#define JPEG_OUTPUT_DATA_BUFFER0 0xD0100000
#define JPEG_OUTPUT_DATA_BUFFER1 0xD0200000


2、AVI_player_demo
主要功能是利用AVI_parser解析AVI文件(0x90000000),得到每一帧画面,用硬件JPEG双缓存解码,通过DMA2D将解码后内容显示到LCD上。
  1. void AVI_player_demo(void)
  2. {
  3.   uint32_t isfirstFrame =0 , startTime = 0;
  4.   uint32_t jpegOutDataAdreess = JPEG_OUTPUT_DATA_BUFFER0;
  5.   uint32_t FrameType = 0;

  6.         
  7.         BSP_LCD_GetXSize(0, &LCD_X_Size);
  8.   BSP_LCD_GetYSize(0, &LCD_Y_Size);
  9.         
  10.         /*##-3- Initialize the AVI Parser ##########################################*/
  11.   if(AVI_ParserInit(&AVI_Handel, AVI_FILE_ADDRESS) == 0)
  12.   {
  13.     isfirstFrame = 1;
  14.     FrameRate = 0;
  15.    
  16.     startTime = HAL_GetTick();
  17.     do
  18.     {         
  19.       /*##-4- Get a Frame from the AVI file ##################################*/
  20.       FrameType = AVI_GetFrame(&AVI_Handel);
  21.       
  22.       if(FrameType == AVI_VIDEO_FRAME)
  23.       {
  24.         AVI_Handel.CurrentImage ++;
  25.         
  26.         /*##-5- Start decoding the current JPEG frame with DMA (Not Blocking ) Method ################*/
  27.         JPEG_Decode_DMA(&hjpeg,(uint32_t) AVI_Handel.pVideoBuffer ,AVI_Handel.FrameSize, jpegOutDataAdreess );
  28.         
  29.         
  30.         /*##-6- Wait till end of JPEG decoding ###############################*/
  31.         while(Jpeg_HWDecodingEnd == 0)
  32.         {
  33.         }
  34.         
  35.         if(isfirstFrame == 1)
  36.         {
  37.           isfirstFrame = 0;              
  38.           /*##-7- Get JPEG Info  #############################################*/
  39.           HAL_JPEG_GetInfo(&hjpeg, &JPEG_Info);
  40.          
  41.           /*##-8- Initialize the DMA2D #######################################*/
  42.           DMA2D_Init(JPEG_Info.ImageWidth, JPEG_Info.ImageHeight, JPEG_Info.ChromaSubsampling);
  43.         }
  44.         /*##-9- Copy the Decoded frame to the display frame buffer using the DMA2D #*/            
  45.         DMA2D_CopyBuffer((uint32_t *)jpegOutDataAdreess, (uint32_t *)LCD_FRAME_BUFFER, JPEG_Info.ImageWidth, JPEG_Info.ImageHeight);
  46.                                 //DMA2D_CopyBuffer((uint32_t *)jpegOutDataAdreess, (uint32_t*)LCD_FRAME_BUFFER, 0 , 0, JPEG_Info.ImageWidth, JPEG_Info.ImageHeight, JPEG_Info.ChromaSubsampling);

  47.         jpegOutDataAdreess = (jpegOutDataAdreess == JPEG_OUTPUT_DATA_BUFFER0) ? JPEG_OUTPUT_DATA_BUFFER1 : JPEG_OUTPUT_DATA_BUFFER0;
  48.         
  49. #ifdef USE_FRAMERATE_REGULATION
  50.         /* Regulate the frame rate to the video native frame rate by inserting delays */
  51.         FrameRate =  (HAL_GetTick() - startTime) + 1;
  52.         if(FrameRate < ((AVI_Handel.aviInfo.SecPerFrame/1000) * AVI_Handel.CurrentImage))
  53.         {
  54.           HAL_Delay(((AVI_Handel.aviInfo.SecPerFrame /1000) * AVI_Handel.CurrentImage) - FrameRate);
  55.         }
  56. #endif /* USE_FRAMERATE_REGULATION */
  57.       }
  58.       
  59.     }while(AVI_Handel.CurrentImage  <  AVI_Handel.aviInfo.TotalFrame);
  60.    
  61.     HAL_DMA2D_PollForTransfer(&DMA2D_Handle, 50);  /* wait for the Last DMA2D transfer to ends */
  62.    
  63.     if(AVI_Handel.CurrentImage > 0)
  64.     {
  65.       /*##-10- Calc the average decode frame rate #*/
  66.       FrameRate =  (AVI_Handel.CurrentImage * 1000)/(HAL_GetTick() - startTime);
  67.       /* Display decoding info */
  68.       LCD_BriefDisplay();           
  69.     }
  70.   }
  71.   else /* Can't Open avi file*/
  72.   {
  73.     printf("Can't Open avi file\r\n");
  74.   }      
  75. }

3、DMA2D_CopyBuffer
用DMA2D显示在LCD上
  1. static void DMA2D_CopyBuffer(uint32_t *pSrc, uint32_t *pDst, uint16_t ImageWidth, uint16_t ImageHeight)
  2. {
  3.   //uint16_t timeout=0;
  4.   uint32_t xPos, yPos, destination;      
  5.   
  6.   /*##-1- calculate the destination transfer address  ############*/
  7.   xPos = (LCD_X_Size - JPEG_Info.ImageWidth)/2;
  8.   yPos = (LCD_Y_Size - JPEG_Info.ImageHeight)/2;     
  9.   
  10.   destination = (uint32_t)pDst + ((yPos * LCD_Y_Size) + xPos) * 4;

  11.   HAL_DMA2D_PollForTransfer(&DMA2D_Handle, 25);  /* wait for the previous DMA2D transfer to ends */
  12.   /* copy the new decoded frame to the LCD Frame buffer*/
  13.   HAL_DMA2D_Start(&DMA2D_Handle, (uint32_t)pSrc, destination, ImageWidth, ImageHeight);
  14. }
4、DMA2D_Init
DMA2D初始化
  1. static void DMA2D_Init(uint16_t xsize, uint16_t ysize, uint32_t ChromaSampling)
  2. {   
  3.   uint32_t cssMode = JPEG_420_SUBSAMPLING, inputLineOffset = 0;  
  4.   
  5.   if(ChromaSampling == JPEG_420_SUBSAMPLING)
  6.   {
  7.     cssMode = DMA2D_CSS_420;
  8.    
  9.     inputLineOffset = xsize % 16;
  10.     if(inputLineOffset != 0)
  11.     {
  12.       inputLineOffset = 16 - inputLineOffset;
  13.     }   
  14.   }
  15.   else if(ChromaSampling == JPEG_444_SUBSAMPLING)
  16.   {
  17.     cssMode = DMA2D_NO_CSS;
  18.    
  19.     inputLineOffset = xsize % 8;
  20.     if(inputLineOffset != 0)
  21.     {
  22.       inputLineOffset = 8 - inputLineOffset;
  23.     }   
  24.   }
  25.   else if(ChromaSampling == JPEG_422_SUBSAMPLING)
  26.   {
  27.     cssMode = DMA2D_CSS_422;
  28.    
  29.     inputLineOffset = xsize % 16;
  30.     if(inputLineOffset != 0)
  31.     {
  32.       inputLineOffset = 16 - inputLineOffset;
  33.     }      
  34.   }  
  35.   
  36.   /*##-1- Configure the DMA2D Mode, Color Mode and output offset #############*/
  37.   DMA2D_Handle.Init.Mode         = DMA2D_M2M_PFC;
  38.   DMA2D_Handle.Init.ColorMode    = DMA2D_OUTPUT_ARGB8888;
  39.   DMA2D_Handle.Init.OutputOffset = LCD_X_Size - xsize;
  40.   DMA2D_Handle.Init.AlphaInverted = DMA2D_REGULAR_ALPHA;  /* No Output Alpha Inversion*/  
  41.   DMA2D_Handle.Init.RedBlueSwap   = DMA2D_RB_REGULAR;     /* No Output Red & Blue swap */  
  42.   
  43.   /*##-2- DMA2D Callbacks Configuration ######################################*/
  44.   DMA2D_Handle.XferCpltCallback  = NULL;
  45.   
  46.   /*##-3- Foreground Configuration ###########################################*/
  47.   DMA2D_Handle.LayerCfg[1].AlphaMode = DMA2D_REPLACE_ALPHA;
  48.   DMA2D_Handle.LayerCfg[1].InputAlpha = 0xFF;
  49.   DMA2D_Handle.LayerCfg[1].InputColorMode = DMA2D_INPUT_YCBCR;
  50.   DMA2D_Handle.LayerCfg[1].ChromaSubSampling = cssMode;
  51.   DMA2D_Handle.LayerCfg[1].InputOffset = inputLineOffset;
  52.   DMA2D_Handle.LayerCfg[1].RedBlueSwap = DMA2D_RB_REGULAR; /* No ForeGround Red/Blue swap */
  53.   DMA2D_Handle.LayerCfg[1].AlphaInverted = DMA2D_REGULAR_ALPHA; /* No ForeGround Alpha inversion */  
  54.   
  55.   DMA2D_Handle.Instance          = DMA2D;
  56.   
  57.   /*##-4- DMA2D Initialization     ###########################################*/
  58.   HAL_DMA2D_Init(&DMA2D_Handle);
  59.   HAL_DMA2D_ConfigLayer(&DMA2D_Handle, 1);  
  60. }


四、stm32h7xx_hal_msp.c

  1. extern MDMA_HandleTypeDef hmdma_jpeg_infifo_th;
  2. extern MDMA_HandleTypeDef hmdma_jpeg_outfifo_th;

  3. void HAL_JPEG_MspInit(JPEG_HandleTypeDef* hjpeg)
  4. {
  5.   if(hjpeg->Instance==JPEG)
  6.   {
  7.   /* USER CODE BEGIN JPEG_MspInit 0 */

  8.   /* USER CODE END JPEG_MspInit 0 */
  9.     /* Peripheral clock enable */
  10.     __HAL_RCC_JPEG_CLK_ENABLE();

  11.     /* JPEG MDMA Init */
  12.     /* JPEG_INFIFO_TH Init */
  13.     hmdma_jpeg_infifo_th.Instance = MDMA_Channel7;
  14.     hmdma_jpeg_infifo_th.Init.Request = MDMA_REQUEST_JPEG_INFIFO_TH;
  15.     hmdma_jpeg_infifo_th.Init.TransferTriggerMode = MDMA_BUFFER_TRANSFER;
  16.     hmdma_jpeg_infifo_th.Init.Priority = MDMA_PRIORITY_HIGH;
  17.     hmdma_jpeg_infifo_th.Init.Endianness = MDMA_LITTLE_ENDIANNESS_PRESERVE;
  18.     hmdma_jpeg_infifo_th.Init.SourceInc = MDMA_SRC_INC_BYTE;
  19.     hmdma_jpeg_infifo_th.Init.DestinationInc = MDMA_DEST_INC_DISABLE;
  20.     hmdma_jpeg_infifo_th.Init.SourceDataSize = MDMA_SRC_DATASIZE_BYTE;
  21.     hmdma_jpeg_infifo_th.Init.DestDataSize = MDMA_DEST_DATASIZE_WORD;
  22.     hmdma_jpeg_infifo_th.Init.DataAlignment = MDMA_DATAALIGN_PACKENABLE;
  23.     hmdma_jpeg_infifo_th.Init.BufferTransferLength = 32;
  24.     hmdma_jpeg_infifo_th.Init.SourceBurst = MDMA_SOURCE_BURST_32BEATS;
  25.     hmdma_jpeg_infifo_th.Init.DestBurst = MDMA_DEST_BURST_16BEATS;
  26.     hmdma_jpeg_infifo_th.Init.SourceBlockAddressOffset = 0;
  27.     hmdma_jpeg_infifo_th.Init.DestBlockAddressOffset = 0;
  28.     if (HAL_MDMA_Init(&hmdma_jpeg_infifo_th) != HAL_OK)
  29.     {
  30.       Error_Handler();
  31.     }

  32.     if (HAL_MDMA_ConfigPostRequestMask(&hmdma_jpeg_infifo_th, 0, 0) != HAL_OK)
  33.     {
  34.       Error_Handler();
  35.     }

  36.     __HAL_LINKDMA(hjpeg,hdmain,hmdma_jpeg_infifo_th);

  37.     /* JPEG_OUTFIFO_TH Init */
  38.     hmdma_jpeg_outfifo_th.Instance = MDMA_Channel6;
  39.     hmdma_jpeg_outfifo_th.Init.Request = MDMA_REQUEST_JPEG_OUTFIFO_TH;
  40.     hmdma_jpeg_outfifo_th.Init.TransferTriggerMode = MDMA_BUFFER_TRANSFER;
  41.     hmdma_jpeg_outfifo_th.Init.Priority = MDMA_PRIORITY_VERY_HIGH;
  42.     hmdma_jpeg_outfifo_th.Init.Endianness = MDMA_LITTLE_ENDIANNESS_PRESERVE;
  43.     hmdma_jpeg_outfifo_th.Init.SourceInc = MDMA_SRC_INC_DISABLE;
  44.     hmdma_jpeg_outfifo_th.Init.DestinationInc = MDMA_DEST_INC_BYTE;
  45.     hmdma_jpeg_outfifo_th.Init.SourceDataSize = MDMA_SRC_DATASIZE_WORD;
  46.     hmdma_jpeg_outfifo_th.Init.DestDataSize = MDMA_DEST_DATASIZE_BYTE;
  47.     hmdma_jpeg_outfifo_th.Init.DataAlignment = MDMA_DATAALIGN_PACKENABLE;
  48.     hmdma_jpeg_outfifo_th.Init.BufferTransferLength = 32;
  49.     hmdma_jpeg_outfifo_th.Init.SourceBurst = MDMA_SOURCE_BURST_32BEATS;
  50.     hmdma_jpeg_outfifo_th.Init.DestBurst = MDMA_DEST_BURST_32BEATS;
  51.     hmdma_jpeg_outfifo_th.Init.SourceBlockAddressOffset = 0;
  52.     hmdma_jpeg_outfifo_th.Init.DestBlockAddressOffset = 0;
  53.     if (HAL_MDMA_Init(&hmdma_jpeg_outfifo_th) != HAL_OK)
  54.     {
  55.       Error_Handler();
  56.     }

  57.     if (HAL_MDMA_ConfigPostRequestMask(&hmdma_jpeg_outfifo_th, 0, 0) != HAL_OK)
  58.     {
  59.       Error_Handler();
  60.     }

  61.     __HAL_LINKDMA(hjpeg,hdmaout,hmdma_jpeg_outfifo_th);

  62.     /* JPEG interrupt Init */
  63.     HAL_NVIC_SetPriority(JPEG_IRQn, 0x07, 0x0F);
  64.     HAL_NVIC_EnableIRQ(JPEG_IRQn);
  65.   /* USER CODE BEGIN JPEG_MspInit 1 */

  66.   /* USER CODE END JPEG_MspInit 1 */

  67.   }

  68. }

  69. void HAL_JPEG_MspDeInit(JPEG_HandleTypeDef* hjpeg)
  70. {
  71.   if(hjpeg->Instance==JPEG)
  72.   {
  73.   /* USER CODE BEGIN JPEG_MspDeInit 0 */

  74.   /* USER CODE END JPEG_MspDeInit 0 */
  75.     /* Peripheral clock disable */
  76.     __HAL_RCC_JPEG_CLK_DISABLE();

  77.     /* JPEG MDMA DeInit */
  78.     HAL_MDMA_DeInit(hjpeg->hdmain);
  79.     HAL_MDMA_DeInit(hjpeg->hdmaout);

  80.     /* JPEG interrupt DeInit */
  81.     HAL_NVIC_DisableIRQ(JPEG_IRQn);
  82.   /* USER CODE BEGIN JPEG_MspDeInit 1 */
  83.         
  84.   /* USER CODE END JPEG_MspDeInit 1 */
  85.   }

  86. }
五、中断处理
  1. extern JPEG_HandleTypeDef hjpeg;
  2. extern DMA2D_HandleTypeDef   DMA2D_Handle;

  3. void JPEG_IRQHandler(void)
  4. {
  5.   /* USER CODE BEGIN JPEG_IRQn 0 */

  6.   /* USER CODE END JPEG_IRQn 0 */
  7.   HAL_JPEG_IRQHandler(&hjpeg);
  8.   /* USER CODE BEGIN JPEG_IRQn 1 */

  9.   /* USER CODE END JPEG_IRQn 1 */
  10. }

  11. void MDMA_IRQHandler(void)
  12. {
  13.   /* USER CODE BEGIN MDMA_IRQn 0 */
  14.   HAL_MDMA_IRQHandler(hjpeg.hdmain);
  15.   HAL_MDMA_IRQHandler(hjpeg.hdmaout);  
  16.   /* USER CODE END MDMA_IRQn 0 */
  17. /*  HAL_MDMA_IRQHandler(&hmdma_jpeg_outfifo_th);
  18.   HAL_MDMA_IRQHandler(&hmdma_jpeg_infifo_th);*/
  19.   /* USER CODE BEGIN MDMA_IRQn 1 */

  20.   /* USER CODE END MDMA_IRQn 1 */
  21. }


  22. void DMA2D_IRQHandler(void)
  23. {
  24.   /* USER CODE BEGIN DMA2D_IRQn 0 */
  25.         HAL_DMA2D_IRQHandler(&DMA2D_Handle);
  26.   /* USER CODE END DMA2D_IRQn 0 */
  27.   /* USER CODE BEGIN DMA2D_IRQn 1 */

  28.   /* USER CODE END DMA2D_IRQn 1 */
  29. }


六、将AVI文件烧录到0x90000000
打开STM32 ST-LINK Utility

External Loader->add External Loader 增加外部FLASH:
6.png

擦除flash内容:
5.png

将AVI(改名.bin)文件烧录到0x90000000
4.png
这样视频文件就准备好了。
C:\Users\自己的用户名\STM32Cube\Repository\STM32Cube_FW_H7_V1.12.0\Utilities\Media\Video下有一些AVI文件

七、源码
AVI_TEST.part01.rar (10 MB, 下载次数: 13)

AVI_TEST.part02.rar (10 MB, 下载次数: 13)

AVI_TEST.part03.rar (10 MB, 下载次数: 13)

AVI_TEST.part04.rar (10 MB, 下载次数: 15)

AVI_TEST.part05.rar (7.32 MB, 下载次数: 2)




zhuomuniao110 发表于 2025-2-13 18:46 | 显示全部楼层
这个型号挺强的。
xionghaoyun 发表于 2025-2-14 09:10 | 显示全部楼层
兄弟 牛X 这个开发板有屏幕不错
ningling_21 发表于 2025-2-15 13:33 | 显示全部楼层
这个搞的播放效果不错
xhackerustc 发表于 2025-2-15 16:59 | 显示全部楼层
你好,恰好也有一块这个板子,但发现个诡异的问题:SDRAM只能访问8MB,但按手册有16MB。你能否帮测一下你的板子能访问8MB以后的SDRAM么?
xhackerustc 发表于 2025-2-15 18:17 | 显示全部楼层
测试代码可见https://bbs.21ic.com/icview-3432362-1-1.html
 楼主| sujingliang 发表于 2025-2-16 10:38 | 显示全部楼层
xhackerustc 发表于 2025-2-15 16:59
你好,恰好也有一块这个板子,但发现个诡异的问题:SDRAM只能访问8MB,但按手册有16MB。你能否帮测一下你的 ...

我也遇到了内存地址不能大于0xD0800000,内存初始化用的BSP官方程序。
xhackerustc 发表于 2025-2-16 13:52 | 显示全部楼层
果然是共性问题,看来需要问下ST了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

84

主题

146

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部