OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 182|回复: 2

STM32H743+LTDC+DMA2D屏幕撕裂问题

[复制链接]

3

主题

9

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2018-4-26
在线时间
16 小时
发表于 3 天前 | 显示全部楼层 |阅读模式
50金钱
屏幕撕裂问题:
显示屏分辨率为240x320,芯片为st7789v2;当使用指令0x36初始化屏幕默认方向(竖屏)时刷新界面不会出现撕裂问题,但初始化为横屏,刷新界面则会出现对角线撕裂情况。
LTDC初始化代码:
  1. /* USER CODE BEGIN 0 */
  2. #include "st7789.h"
  3. #if defined LCD_VER
  4. #define  HSYNC            ((uint16_t)10)           /* Horizontal synchronization */
  5. #define  HBP              ((uint16_t)10)    /* Horizontal back porch      */
  6. #define  HFP              ((uint16_t)38)    /* Horizontal front porch     */
  7. #define  VSYNC            ((uint16_t)4)           /* Vertical synchronization   */
  8. #define  VBP              ((uint16_t)4)            /* Vertical back porch        */
  9. #define  VFP              ((uint16_t)8)            /* Vertical front porch       */
  10. #elif defined LCD_HOR
  11. #define  HSYNC            ((uint16_t)4)           /* Horizontal synchronization */
  12. #define  HBP              ((uint16_t)4)    /* Horizontal back porch      */
  13. #define  HFP              ((uint16_t)8)    /* Horizontal front porch     */
  14. #define  VSYNC            ((uint16_t)10)           /* Vertical synchronization   */
  15. #define  VBP              ((uint16_t)10)            /* Vertical back porch        */
  16. #define  VFP              ((uint16_t)38)            /* Vertical front porch       */
  17. #endif
  18. #define TRIGGER_LINE      (VSYNC + VBP + HEIGHT)    //1
  19. /* USER CODE END 0 */

  20. LTDC_HandleTypeDef hltdc;

  21. /* LTDC init function */
  22. void MX_LTDC_Init(void)
  23. {

  24.   /* USER CODE BEGIN LTDC_Init 0 */

  25.   /* USER CODE END LTDC_Init 0 */

  26.   LTDC_LayerCfgTypeDef pLayerCfg = {0};

  27.   /* USER CODE BEGIN LTDC_Init 1 */

  28.   /* USER CODE END LTDC_Init 1 */
  29.   hltdc.Instance = LTDC;
  30.   hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL;
  31.   hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL;
  32.   hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL;
  33.   hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
  34.   
  35.      hltdc.Init.HorizontalSync = (HSYNC - 1);
  36.     hltdc.Init.VerticalSync = (VSYNC - 1);
  37.     hltdc.Init.AccumulatedHBP = (HSYNC + HBP - 1);
  38.     hltdc.Init.AccumulatedVBP = (VSYNC + VBP - 1);  
  39.     hltdc.Init.AccumulatedActiveH = (HEIGHT + VSYNC + VBP - 1);
  40.     hltdc.Init.AccumulatedActiveW = (WIDTH + HSYNC + HBP - 1);
  41.     hltdc.Init.TotalHeigh = (HEIGHT + VSYNC + VBP + VFP - 1);
  42.     hltdc.Init.TotalWidth = (WIDTH + HSYNC + HBP + HFP - 1);

  43.   hltdc.Init.Backcolor.Blue = 0;
  44.   hltdc.Init.Backcolor.Green = 0;
  45.   hltdc.Init.Backcolor.Red = 0;
  46.   if (HAL_LTDC_Init(&hltdc) != HAL_OK)
  47.   {
  48.     Error_Handler();
  49.   }
  50.   pLayerCfg.WindowX0 = 0;
  51.   pLayerCfg.WindowX1 = WIDTH;
  52.   pLayerCfg.WindowY0 = 0;
  53.   pLayerCfg.WindowY1 = HEIGHT;
  54.   pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565;
  55.   pLayerCfg.Alpha = 255;
  56.   pLayerCfg.Alpha0 = 0;
  57.   pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;
  58.   pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;
  59.   pLayerCfg.FBStartAdress = LCD_FRAME_BUF_ADDR;
  60.   pLayerCfg.ImageWidth = WIDTH;
  61.   pLayerCfg.ImageHeight = HEIGHT;
  62.   pLayerCfg.Backcolor.Blue = 0;
  63.   pLayerCfg.Backcolor.Green = 0;
  64.   pLayerCfg.Backcolor.Red = 0;
  65.   if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK)
  66.   {
  67.     Error_Handler();
  68.   }
  69.   /* USER CODE BEGIN LTDC_Init 2 */
  70.    HAL_LTDC_ProgramLineEvent(&hltdc, TRIGGER_LINE);
  71.    __HAL_LTDC_ENABLE_IT(&hltdc, LTDC_IT_LI);
  72.   /* USER CODE END LTDC_Init 2 */

  73. }

  74. void HAL_LTDC_MspInit(LTDC_HandleTypeDef* ltdcHandle)
  75. {

  76.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  77.   RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
  78.   if(ltdcHandle->Instance==LTDC)
  79.   {
  80.   /* USER CODE BEGIN LTDC_MspInit 0 */

  81.   /* USER CODE END LTDC_MspInit 0 */

  82.   /** Initializes the peripherals clock
  83.   */
  84.     PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;
  85.     PeriphClkInitStruct.PLL3.PLL3M = 2;
  86.     PeriphClkInitStruct.PLL3.PLL3N = 30;
  87.     PeriphClkInitStruct.PLL3.PLL3P = 2;
  88.     PeriphClkInitStruct.PLL3.PLL3Q = 10;
  89.     PeriphClkInitStruct.PLL3.PLL3R = 58;
  90.     PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_3;
  91.     PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;
  92.     PeriphClkInitStruct.PLL3.PLL3FRACN = 0;
  93.     if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  94.     {
  95.       Error_Handler();
  96.     }

  97.     /* LTDC clock enable */
  98.     __HAL_RCC_LTDC_CLK_ENABLE();

  99.     __HAL_RCC_GPIOC_CLK_ENABLE();
  100.     __HAL_RCC_GPIOA_CLK_ENABLE();
  101.     __HAL_RCC_GPIOB_CLK_ENABLE();
  102.     __HAL_RCC_GPIOE_CLK_ENABLE();
  103.     __HAL_RCC_GPIOD_CLK_ENABLE();
  104.     __HAL_RCC_GPIOG_CLK_ENABLE();
  105.     /**LTDC GPIO Configuration
  106.     PC0     ------> LTDC_R5
  107.     PA3     ------> LTDC_B5
  108.     PA4     ------> LTDC_VSYNC
  109.     PA5     ------> LTDC_R4
  110.     PA6     ------> LTDC_G2
  111.     PB0     ------> LTDC_R3
  112.     PB1     ------> LTDC_R6
  113.     PE11     ------> LTDC_G3
  114.     PE12     ------> LTDC_B4
  115.     PE13     ------> LTDC_DE
  116.     PE14     ------> LTDC_CLK
  117.     PE15     ------> LTDC_R7
  118.     PB10     ------> LTDC_G4
  119.     PB11     ------> LTDC_G5
  120.     PD10     ------> LTDC_B3
  121.     PG8     ------> LTDC_G7
  122.     PC6     ------> LTDC_HSYNC
  123.     PC7     ------> LTDC_G6
  124.     PB8     ------> LTDC_B6
  125.     PB9     ------> LTDC_B7
  126.     */
  127.     GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_6|GPIO_PIN_7;
  128.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  129.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  130.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  131.     GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
  132.     HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  133.     GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6;
  134.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  135.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  136.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  137.     GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
  138.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  139.     GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
  140.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  141.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  142.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  143.     GPIO_InitStruct.Alternate = GPIO_AF9_LTDC;
  144.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  145.     GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14
  146.                           |GPIO_PIN_15;
  147.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  148.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  149.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  150.     GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
  151.     HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  152.     GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_8|GPIO_PIN_9;
  153.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  154.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  155.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  156.     GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
  157.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  158.     GPIO_InitStruct.Pin = GPIO_PIN_10;
  159.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  160.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  161.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  162.     GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
  163.     HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  164.     GPIO_InitStruct.Pin = GPIO_PIN_8;
  165.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  166.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  167.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  168.     GPIO_InitStruct.Alternate = GPIO_AF14_LTDC;
  169.     HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);

  170.     /* LTDC interrupt Init */
  171.     HAL_NVIC_SetPriority(LTDC_IRQn, 0x00, 0);
  172.     HAL_NVIC_EnableIRQ(LTDC_IRQn);
  173.   /* USER CODE BEGIN LTDC_MspInit 1 */
  174.    
  175.    
  176.   /* USER CODE END LTDC_MspInit 1 */
  177.   }
  178. }

  179. void HAL_LTDC_MspDeInit(LTDC_HandleTypeDef* ltdcHandle)
  180. {

  181.   if(ltdcHandle->Instance==LTDC)
  182.   {
  183.   /* USER CODE BEGIN LTDC_MspDeInit 0 */

  184.   /* USER CODE END LTDC_MspDeInit 0 */
  185.     /* Peripheral clock disable */
  186.     __HAL_RCC_LTDC_CLK_DISABLE();

  187.     /**LTDC GPIO Configuration
  188.     PC0     ------> LTDC_R5
  189.     PA3     ------> LTDC_B5
  190.     PA4     ------> LTDC_VSYNC
  191.     PA5     ------> LTDC_R4
  192.     PA6     ------> LTDC_G2
  193.     PB0     ------> LTDC_R3
  194.     PB1     ------> LTDC_R6
  195.     PE11     ------> LTDC_G3
  196.     PE12     ------> LTDC_B4
  197.     PE13     ------> LTDC_DE
  198.     PE14     ------> LTDC_CLK
  199.     PE15     ------> LTDC_R7
  200.     PB10     ------> LTDC_G4
  201.     PB11     ------> LTDC_G5
  202.     PD10     ------> LTDC_B3
  203.     PG8     ------> LTDC_G7
  204.     PC6     ------> LTDC_HSYNC
  205.     PC7     ------> LTDC_G6
  206.     PB8     ------> LTDC_B6
  207.     PB9     ------> LTDC_B7
  208.     */
  209.     HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0|GPIO_PIN_6|GPIO_PIN_7);

  210.     HAL_GPIO_DeInit(GPIOA, GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6);

  211.     HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_10|GPIO_PIN_11
  212.                           |GPIO_PIN_8|GPIO_PIN_9);

  213.     HAL_GPIO_DeInit(GPIOE, GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14
  214.                           |GPIO_PIN_15);

  215.     HAL_GPIO_DeInit(GPIOD, GPIO_PIN_10);

  216.     HAL_GPIO_DeInit(GPIOG, GPIO_PIN_8);

  217.     /* LTDC interrupt Deinit */
  218.     HAL_NVIC_DisableIRQ(LTDC_IRQn);
  219.   /* USER CODE BEGIN LTDC_MspDeInit 1 */

  220.   /* USER CODE END LTDC_MspDeInit 1 */
  221.   }
  222. }

  223. /* USER CODE BEGIN 1 */
  224. volatile uint16_t x_addr = 0, y_addr = 0;
  225. void HAL_LTDC_LineIRQ(void)
  226. {
  227. //    if (hltdc.Instance->ISR & LTDC_ISR_LIF) {
  228. //        x_addr = hltdc.Instance->CPSR >> 16;
  229. //        y_addr = hltdc.Instance->CPSR & 0xFFFF;
  230. //        LTDC->SRCR = LTDC_SRCR_VBR;
  231. //        hltdc.Instance->ICR = LTDC_ICR_CLIF;
  232. //    }
  233. //    if (hltdc.Instance->ISR & LTDC_ISR_RRIF) {
  234. //        if (frame_ready == 1) {
  235. //            frame_ready = 0;
  236. //            active_buf = pending_buf;
  237. //            LTDC_Layer1->CFBAR = (uint32_t)&lcd_frame_buffer[active_buf][0];
  238. //            LTDC->SRCR = LTDC_SRCR_IMR;
  239. //            draw_buf ^= 1;
  240. //        }
  241. //        hltdc.Instance->ICR = LTDC_ICR_CRRIF;
  242. //    }
  243. }
  244. void HAL_LTDC_LineEventCallback(LTDC_HandleTypeDef *hltdc)
  245. {
  246.     x_addr = hltdc->Instance->CPSR >> 16;
  247.     y_addr = hltdc->Instance->CPSR & 0xFFFF;
  248.     if ((frame_ready == 1) && (y_addr == TRIGGER_LINE)) {     //
  249.         LTDC_LAYER(hltdc, 0)->CFBAR = (uint32_t)&lcd_frame_buffer[pending_buf][0];
  250.         hltdc->Instance->SRCR = LTDC_SRCR_IMR;
  251.         frame_ready = 0;
  252.         draw_buf ^= 1;
  253.         HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_3);
  254.     }
  255.     __HAL_LTDC_ENABLE_IT(hltdc, LTDC_IT_LI);
  256. }
  257. void HAL_LTDC_ReloadEventCallback(LTDC_HandleTypeDef *hltdc)
  258. {
  259.     __HAL_LTDC_ENABLE_IT(hltdc, LTDC_IT_RR);
  260. }
  261. /* USER CODE END 1 */
复制代码
st7789.c代码
  1. #include "stm32h7xx_hal.h"
  2. #include "st7789.h"

  3. /*-------------------------------------config---------------------------------------------*/
  4. #define SET_SDIN_IN()        {GPIOF->MODER &= 0xCFFFFFFF;}
  5. #define SET_SDIN_OUT()  {GPIOF->MODER &= 0xCFFFFFFF; GPIOF->MODER |= 0x01<28;}
  6. #define SDIN_H                 HAL_GPIO_WritePin(GPIOF,GPIO_PIN_14,GPIO_PIN_SET)
  7. #define SDIN_L                HAL_GPIO_WritePin(GPIOF,GPIO_PIN_14,GPIO_PIN_RESET)
  8. #define SDIN_IN         (GPIOF->IDR & GPIO_PIN_14)

  9. #define CS_H                    HAL_GPIO_WritePin(GPIOG,GPIO_PIN_0,GPIO_PIN_SET)
  10. #define CS_L                    HAL_GPIO_WritePin(GPIOG,GPIO_PIN_0,GPIO_PIN_RESET)

  11. #define RST_H                    HAL_GPIO_WritePin(GPIOG,GPIO_PIN_1,GPIO_PIN_SET)
  12. #define RST_L                    HAL_GPIO_WritePin(GPIOG,GPIO_PIN_1,GPIO_PIN_RESET)

  13. #define SCL_H                    HAL_GPIO_WritePin(GPIOF,GPIO_PIN_15,GPIO_PIN_SET)
  14. #define SCL_L                    HAL_GPIO_WritePin(GPIOF,GPIO_PIN_15,GPIO_PIN_RESET)

  15. #define BL_CTRL_ON()      HAL_GPIO_WritePin(GPIOD,GPIO_PIN_14,GPIO_PIN_SET)
  16. #define BL_CTRL_OFF()     HAL_GPIO_WritePin(GPIOD,GPIO_PIN_14,GPIO_PIN_RESET)
  17. /*-----------------------------------------------------------------------------------------*/



  18. //刷新率 = LTDC CLK /((Width + HSYNC_W  + HBP  + HFP )*(Height + VSYNC_W +  VBP  +VFP  ))
  19.           //   344 *272

  20. #define  PIXSIZE        2
  21. #define  LCD_FRAME_BUF_SIZE  (WIDTH*HEIGHT)

  22. //uint16_t lcd_buffer[LCD_FRAME_BUF_SIZE];

  23. //绑定到链接脚本的.lcd_frame_buf段,分配到0x24000000起始地址
  24. __attribute__((section(".lcd_frame_buf"), aligned(32))) uint16_t lcd_frame_buffer[2][LCD_FRAME_BUF_SIZE];   //


  25. volatile uint8_t pending_buf = 0; // 等待切换的缓冲区索引
  26. volatile uint8_t frame_ready = 0;   // 后缓冲绘制完成标志
  27. uint8_t draw_buf = 1;                // 当前绘制缓冲区索引

  28. /*
  29. *********************************************************************************************************
  30. *        函 数 名:
  31. *        功能说明: 简单延时函数
  32. *        形    参: us 延时值
  33. *               
  34. *        返 回 值: 无
  35. *********************************************************************************************************
  36. */  
  37. static void st7789_delay(uint16_t us)
  38. {
  39.         int i,j;
  40.         for(j=0;j<us;j++)
  41.                 for(i=0;i<60;i++);
  42. }
  43. /*
  44. *********************************************************************************************************
  45. *        函 数 名:
  46. *        功能说明: 毫秒延时函数
  47. *        形    参: ms 延时值
  48. *               
  49. *        返 回 值: 无
  50. *********************************************************************************************************
  51. */
  52. static void st7789_delay_ms(uint16_t ms)
  53. {
  54.     HAL_Delay(ms);
  55. //        osDelay(ms);
  56. }
  57. /*
  58. *********************************************************************************************************
  59. *        函 数 名:
  60. *        功能说明: 发送一个字节数据
  61. *        形    参: byte 字节数据
  62. *               
  63. *        返 回 值: 无
  64. *********************************************************************************************************
  65. */
  66. static void st7789_send_data(uint8_t byte)
  67. {
  68.         int i;
  69.         CS_L;
  70.         SCL_L;
  71.         SDIN_H;
  72.         st7789_delay(10);
  73.         SCL_H;
  74.         st7789_delay(10);
  75.         for(i=0;i<8;i++)
  76.         {
  77.                 if(byte&0x80)
  78.                 {
  79.                         SDIN_H;
  80.                 }
  81.                 else
  82.                 {
  83.                         SDIN_L;
  84.                 }
  85.                 SCL_L;
  86.                 st7789_delay(10);
  87.                 SCL_H;
  88.                 st7789_delay(10);
  89.                 byte <<= 1;
  90.         }
  91.         CS_H;
  92.         st7789_delay(1);
  93. }
  94. /*
  95. *********************************************************************************************************
  96. *        函 数 名:
  97. *        功能说明: 发送一个字节命令
  98. *        形    参: byte 字节数据
  99. *               
  100. *        返 回 值: 无
  101. *********************************************************************************************************
  102. */
  103. static void st7789_send_cmd(uint8_t byte)
  104. {
  105.         int i;
  106.         CS_L;
  107.         SCL_L;
  108.         SDIN_L;
  109.         st7789_delay(10);
  110.         SCL_H;
  111.         st7789_delay(10);
  112.         //SCL_L;
  113.         for(i=0;i<8;i++)
  114.         {
  115.                 if(byte&0x80)
  116.                 {
  117.                         SDIN_H;
  118.                 }
  119.                 else
  120.                 {
  121.                         SDIN_L;
  122.                 }
  123.                 SCL_L;
  124.                 st7789_delay(10);
  125.                 SCL_H;
  126.                 st7789_delay(10);
  127.                 byte <<= 1;
  128.         }
  129.         CS_H;
  130.         st7789_delay(1);
  131. }
  132. /*
  133. *********************************************************************************************************
  134. *        函 数 名:
  135. *        功能说明: 发送一个字节命令
  136. *        形    参: byte 字节数据
  137. *               
  138. *        返 回 值: 无
  139. *********************************************************************************************************
  140. */
  141. static uint8_t st7789_read_reg(uint8_t reg)
  142. {
  143.         uint8_t res = 0;
  144.         int i;
  145.         CS_L;
  146.         SCL_L;
  147.         SDIN_L;
  148.         st7789_delay(10);
  149.         SCL_H;
  150.         st7789_delay(10);
  151.         //SCL_L;
  152.         for(i=0;i<8;i++)
  153.         {
  154.                 if(reg&0x80)
  155.                 {
  156.                         SDIN_H;
  157.                 }
  158.                 else
  159.                 {
  160.                         SDIN_L;
  161.                 }
  162.                 SCL_L;
  163.                 st7789_delay(10);
  164.                 SCL_H;
  165.                 st7789_delay(10);
  166.                 reg <<= 1;
  167.         }
  168.         st7789_delay(1);
  169.         SET_SDIN_IN();
  170.         for(i=0;i<8;i++)
  171.         {
  172.                 SCL_L;
  173.                 st7789_delay(10);
  174.                 SCL_H;
  175.                 if(SDIN_IN)
  176.                 {
  177.                         res |= 0x01<<(7-i);
  178.                 }
  179.                 st7789_delay(10);
  180.         }
  181.         CS_H;
  182.         SET_SDIN_OUT();
  183.         return res;
  184. }
  185. /*
  186. *********************************************************************************************************
  187. *        函 数 名:
  188. *        功能说明: IO初始化
  189. *        形    参: 无
  190. *               
  191. *        返 回 值: 无
  192. *********************************************************************************************************
  193. */
  194. static void st7789_gpio_init(void)
  195. {
  196.     GPIO_InitTypeDef GPIO_InitStruct = {0};
  197.     /* GPIO Ports Clock Enable */
  198.     __HAL_RCC_GPIOF_CLK_ENABLE();
  199.     __HAL_RCC_GPIOG_CLK_ENABLE();
  200.     __HAL_RCC_GPIOD_CLK_ENABLE();
  201.     /*Configure GPIO pin Output Level */
  202.     HAL_GPIO_WritePin(GPIOF, GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_SET);
  203.     HAL_GPIO_WritePin(GPIOG, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_SET);
  204.     HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET);
  205.     /*Configure GPIO pins : PF0 PF1 PF2 PF3
  206.                            PF4 */
  207.     GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15;
  208.     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  209.     GPIO_InitStruct.Pull = GPIO_PULLUP;
  210.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  211.     HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);

  212.     GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
  213.     HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
  214.     //背光控制
  215.     GPIO_InitStruct.Pin = GPIO_PIN_14;
  216.     HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
  217. }
  218. /*
  219. *********************************************************************************************************
  220. *        函 数 名:
  221. *        功能说明: 设置显示窗口
  222. *        形    参:  xstar:x开始位置;ystar:y开始位置
  223. *                       xend:x结束位置; yend:y结束位置
  224. *        返 回 值: 无
  225. *********************************************************************************************************
  226. */
  227. void st7789_set_windows(uint16_t xstar, uint16_t ystar, uint16_t xend, uint16_t yend)
  228. {
  229.         if ((xstar > (WIDTH - 1)) || (xend > (WIDTH - 1)) || (xend < xstar))
  230.                 return ;
  231.         if ((ystar > (HEIGHT - 1)) || (yend > (HEIGHT - 1)) || (yend < ystar))
  232.                 return ;
  233.         st7789_send_cmd(0x2a);
  234.         st7789_send_data(xstar >> 8);
  235.         st7789_send_data(0x00FF & xstar);
  236.         st7789_send_data(xend >> 8);
  237.         st7789_send_data(0x00FF & xend);

  238.         st7789_send_cmd(0x2b);
  239.         st7789_send_data(ystar >> 8);
  240.         st7789_send_data(0x00FF & ystar);
  241.         st7789_send_data(yend >> 8);
  242.         st7789_send_data(0x00FF & yend);

  243. //        st7789_send_cmd(0x2c);
  244. }
  245. /*
  246. *********************************************************************************************************
  247. *        函 数 名:
  248. *        功能说明: 设置屏幕
  249. *        形    参: w: 宽;h:高;dir 方向
  250. *               
  251. *        返 回 值: 无
  252. *********************************************************************************************************
  253. */
  254. static void st7789_set_screen(uint16_t w, uint16_t h, uint8_t dir)
  255. {
  256.         st7789_send_cmd(0x36);
  257.         st7789_send_data(dir);
  258.         //设置显示窗口
  259.         st7789_set_windows(0, 0, w - 1, h - 1);   
  260.        
  261. }
  262. #if 1
  263. /*
  264. *********************************************************************************************************
  265. *        函 数 名:
  266. *        功能说明: 画点函数
  267. *        形    参:   
  268. *               
  269. *        返 回 值: 无
  270. *********************************************************************************************************
  271. */
  272. void st7789_draw_point(uint16_t sx, uint16_t sy, uint16_t color)
  273. {
  274.         if (sx >= WIDTH) {
  275.                 sx = WIDTH - 1;
  276.         }
  277.         if (sy >= HEIGHT)
  278.                 sy = HEIGHT - 1;
  279.         lcd_frame_buffer[0][sy*WIDTH + sx] = color;
  280. }
  281. /*
  282. *********************************************************************************************************
  283. *        函 数 名:
  284. *        功能说明: 画水平线
  285. *        形    参:   
  286. *               
  287. *        返 回 值: 无
  288. *********************************************************************************************************
  289. */
  290. void st7789_draw_hline(uint16_t sx, uint16_t sy, uint16_t len , uint16_t color)
  291. {
  292.         uint16_t i;
  293.        
  294.         for (i = 0; i < len; i++)
  295.         {       
  296.                 st7789_draw_point(sx + i , sy , color);
  297.         }       
  298. }
  299. /*
  300. *********************************************************************************************************
  301. *        函 数 名:
  302. *        功能说明: 画垂直线
  303. *        形    参:   
  304. *               
  305. *        返 回 值: 无
  306. *********************************************************************************************************
  307. */
  308. void st7789_draw_vline(uint16_t sx, uint16_t sy, uint16_t len , uint16_t color)
  309. {
  310.         uint16_t i;
  311.        
  312.         for (i = 0; i < len; i++)
  313.         {       
  314.                 st7789_draw_point(sx, sy + i, color);
  315.         }
  316. }
  317. /*
  318. *********************************************************************************************************
  319. *        函 数 名:
  320. *        功能说明: 画矩形
  321. *        形    参:   
  322. *               
  323. *        返 回 值: 无
  324. *********************************************************************************************************
  325. */
  326. void st7789_draw_rect(uint16_t sx, uint16_t sy, uint16_t height, uint16_t width, uint16_t color)
  327. {
  328.         /*
  329.          ---------------->---
  330.         |(sX,sY)            |
  331.         V                    V  Height
  332.         |                    |
  333.          ---------------->---
  334.                   Width
  335.         */
  336.         st7789_draw_hline(sx, sy, width, color);
  337.         st7789_draw_vline(sx + width - 1, sy, height, color);
  338.         st7789_draw_hline(sx, sy + height - 1, width, color);
  339.         st7789_draw_vline(sx, sy, height, color);
  340. }
  341. /*
  342. *********************************************************************************************************
  343. *        函 数 名:
  344. *        功能说明: 填充矩形
  345. *        形    参:   
  346. *               
  347. *        返 回 值: 无
  348. *********************************************************************************************************
  349. */
  350. void st7789_draw_fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint16_t color)
  351. {
  352.     uint16_t i,j;
  353.    
  354.     for (i = sy; i < ey; i++) {
  355.         for (j = sx; j < ex; j++) {
  356.             st7789_draw_point(j, i, color);
  357.         }
  358.     }
  359. }
  360. #endif
  361. /*
  362. *********************************************************************************************************
  363. *        函 数 名:
  364. *        功能说明: 背光控制
  365. *        形    参: sta: 0 关闭背光; 1 打开背光   
  366. *               
  367. *        返 回 值: 无
  368. *********************************************************************************************************
  369. */
  370. void st7789_backlight_ctrl(uint8_t sta)
  371. {
  372.     if (sta) {
  373.         BL_CTRL_ON();
  374.     }
  375.     else {
  376.         BL_CTRL_OFF();
  377.     }
  378. }
  379. /*
  380. *********************************************************************************************************
  381. *        函 数 名:
  382. *        功能说明: st7789初始化
  383. *        形    参:   
  384. *               
  385. *        返 回 值: 无
  386. *********************************************************************************************************
  387. */
  388. void lcd_ex_st7789_reginit(void)
  389. {
  390.     st7789_gpio_init();
  391.      
  392.     st7789_send_cmd(0x11);

  393.     st7789_delay_ms(120);

  394.     st7789_send_cmd(0x3A);
  395.     st7789_send_data(0x55);

  396.     st7789_send_cmd(0xB2);
  397.     st7789_send_data(0x0C);
  398.     st7789_send_data(0x0C);
  399.     st7789_send_data(0x00);
  400.     st7789_send_data(0x33);
  401.     st7789_send_data(0x33);

  402.     st7789_send_cmd(0xB7);
  403.     st7789_send_data(0x35);

  404.     st7789_send_cmd(0xBB); /* vcom */
  405.     st7789_send_data(0x32);  /* 32 */
  406.    
  407.     //------------------------------------RGB set-----------------------------------------//
  408.     st7789_send_cmd(0xB0);
  409.     st7789_send_data(0x11);   
  410.     st7789_send_data(0xf0);
  411.    
  412.     st7789_send_cmd(0xB1);
  413.     st7789_send_data(0x40); //4  
  414.     st7789_send_data(0x14);
  415.     st7789_send_data(0x14);

  416.     st7789_send_cmd(0xC0);
  417.     st7789_send_data(0x2C);
  418. #if 1
  419.     st7789_send_cmd(0xC2);
  420.     st7789_send_data(0x01);

  421.     st7789_send_cmd(0xC3); /* vrh */
  422.     st7789_send_data(0x10);  /* 17 0D */

  423.     st7789_send_cmd(0xC4); /* vdv */
  424.     st7789_send_data(0x20);  /* 20 */

  425.     st7789_send_cmd(0xC6);
  426.     st7789_send_data(0x0f);

  427.     st7789_send_cmd(0xD0);
  428.     st7789_send_data(0xA4);
  429.     st7789_send_data(0xA1);


  430.     st7789_send_cmd(0xE0); /* Set Gamma  */
  431.     st7789_send_data(0xd0);
  432.     st7789_send_data(0x00);
  433.     st7789_send_data(0x02);
  434.     st7789_send_data(0x07);
  435.     st7789_send_data(0x0a);
  436.     st7789_send_data(0x28);
  437.     st7789_send_data(0x32);
  438.     st7789_send_data(0x44);
  439.     st7789_send_data(0x42);
  440.     st7789_send_data(0x06);
  441.     st7789_send_data(0x0e);
  442.     st7789_send_data(0x12);
  443.     st7789_send_data(0x14);
  444.     st7789_send_data(0x17);


  445.     st7789_send_cmd(0xE1);  /* Set Gamma */
  446.     st7789_send_data(0xd0);
  447.     st7789_send_data(0x00);
  448.     st7789_send_data(0x02);
  449.     st7789_send_data(0x07);
  450.     st7789_send_data(0x0a);
  451.     st7789_send_data(0x28);
  452.     st7789_send_data(0x31);
  453.     st7789_send_data(0x54);
  454.     st7789_send_data(0x47);
  455.     st7789_send_data(0x0e);
  456.     st7789_send_data(0x1c);
  457.     st7789_send_data(0x17);
  458.     st7789_send_data(0x1b);
  459.     st7789_send_data(0x1e);
  460. #endif

  461.     st7789_set_screen(WIDTH, HEIGHT, DIR);

  462.     st7789_send_cmd(0x29); /* display on */
  463. }
  464. /*
  465. *********************************************************************************************************
  466. *        函 数 名:
  467. *        功能说明:
  468. *        形    参:   
  469. *               
  470. *        返 回 值: 无
  471. *********************************************************************************************************
  472. */
  473. uint8_t st7789_test_index = 0;
  474. uint16_t st7789_test_color = 0;   
  475. void st7789_screen_test(void)
  476. {
  477.     st7789_test_color = 0x00ff;
  478.     st7789_ltdc_fill(0, 0, WIDTH-1, HEIGHT-1, st7789_test_color);
  479.         //
  480.         st7789_backlight_ctrl(1);
  481.    
  482.     while(1){
  483.         switch(st7789_test_index) {
  484.             case 1:
  485.                 st7789_test_index = 0;
  486.                 st7789_test_color = ~st7789_test_color;
  487.                 st7789_ltdc_fill(0, 0, WIDTH-1, HEIGHT-1, st7789_test_color);
  488.                 break;
  489.             case 2:
  490.                 st7789_test_index = 0;
  491.                 st7789_ltdc_fill(0, 0, WIDTH-1, HEIGHT-1, st7789_test_color);
  492.                 break;
  493.             case 3:
  494.                 st7789_test_index = 0;
  495.                 st7789_ltdc_fill(0, 0, 100, 50, st7789_test_color);
  496.                 break;
  497.             case 4:
  498.                 st7789_test_index = 0;
  499.                 st7789_ltdc_fill(50, 50, 100, 100, st7789_test_color);
  500.                 break;
  501.             case 5:
  502.                 st7789_test_index = 0;
  503.                 st7789_ltdc_fill(100, 100, 150, 150, st7789_test_color);
  504.                 break;
  505.             case 6:
  506.                 st7789_test_index = 0;
  507.                 st7789_ltdc_fill(150, 150, 200, 200, st7789_test_color);
  508.                 break;
  509.             case 7:
  510.                 st7789_test_index = 0;
  511.                 st7789_ltdc_fill(200, 200, 250, 239, st7789_test_color);
  512.                 break;
  513.             case 8:
  514.                 st7789_test_color = ~st7789_test_color;
  515.                 st7789_ltdc_fill(0, 0, WIDTH-1, HEIGHT-1, st7789_test_color);
  516.                 break;
  517.             case 9:
  518.                 st7789_ltdc_fill(100, 100, 150, 150, st7789_test_color);
  519.                 st7789_test_color += 100;
  520.                 break;
  521.         }
  522.         HAL_Delay(100);
  523.     }
  524. }

  525. /*
  526. *********************************************************************************************************
  527. *        函 数 名:
  528. *        功能说明:
  529. *        形    参:   
  530. *               
  531. *        返 回 值: 无
  532. *********************************************************************************************************
  533. */
  534. void st7789_ltdc_fill(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint16_t color)
  535. {
  536.     // 1. 边界检查:确保坐标在屏幕范围内
  537.     if (sx >= WIDTH || sy >= HEIGHT || ex >= WIDTH || ey >= HEIGHT || ex < sx || ey < sy) {
  538.         return;
  539.     }
  540.    
  541.     uint32_t fill_width = ex - sx + 1;
  542.     uint32_t fill_height = ey - sy + 1;
  543.     uint32_t timeout = 0;
  544.     uint16_t offline = WIDTH - fill_width; // 统一用 WIDTH 计算行偏移,适配横竖屏
  545.     uint32_t frame_buf_addr = (uint32_t)&lcd_frame_buffer[draw_buf][0]; // 显存基地址    //draw_buf
  546.    
  547.     uint32_t dst_addr = frame_buf_addr + (sy * WIDTH + sx) * 2;
  548.    
  549.     while (!dma2d_get_tc_flag()) { // 或使用超时
  550.         if (timeout++ > 1000)
  551.             break;
  552.         st7789_delay_ms(1);
  553.     }
  554.     dma2d_set_tc_flag(0);
  555.    
  556.     // 4. 停止并重置DMA2D
  557.    
  558.     DMA2D->CR &= ~DMA2D_CR_START;
  559.     while (DMA2D->CR & DMA2D_CR_START); // 等待DMA2D停止
  560.     DMA2D->IFCR = DMA2D_IFCR_CTCIF;     // 清除所有标志
  561.    
  562.     // 5. 配置DMA2D(寄存器到存储器模式,填充纯色)
  563.     DMA2D->CR      = DMA2D_R2M | (1 << 9); // R2M=寄存器到存储器,BIT9=使能传输完成中断
  564.     DMA2D->OCOLR   = color;                // 填充颜色(RGB565)
  565.     DMA2D->OMAR    = dst_addr;             // 目标显存地址
  566.     DMA2D->OOR     = offline;              // 行偏移(适配横竖屏)
  567.     DMA2D->OPFCCR  = LTDC_PIXEL_FORMAT_RGB565; // 像素格式匹配
  568.     DMA2D->NLR     = (fill_height) | (fill_width << 16); // 行数 | 列数
  569.    
  570.     SCB_CleanDCache_by_Addr((uint32_t*)&lcd_frame_buffer[draw_buf][0], LCD_FRAME_BUF_SIZE*2);
  571.     // 6. 启动DMA2D传输
  572.     DMA2D->CR   |= DMA2D_CR_START;   
  573.    
  574. }
复制代码
st7789.h
  1. #ifndef __ST7789_H
  2. #define __ST7789_H

  3. #include "stdint.h"
  4.             
  5. #define MY                                0x80
  6. #define MX                                 0x40
  7. #define MV                                0x20
  8. #define ML                                0x10        
  9. #define RGB                                0x08        
  10. #define MH                                0x04

  11. //#define LCD_VER      
  12. #define LCD_HOR        
  13. #if defined LCD_VER
  14. #define WIDTH    ((uint16_t)240)//((uint16_t)320)          /* LCD PIXEL WIDTH            */
  15. #define HEIGHT   ((uint16_t)320) //((uint16_t)240)         /* LCD PIXEL HEIGHT           */
  16. #define DIR     0
  17. #elif defined LCD_HOR
  18. #define WIDTH    ((uint16_t)320)          /* LCD PIXEL WIDTH            */
  19. #define HEIGHT   ((uint16_t)240)          /* LCD PIXEL HEIGHT           */
  20. #define DIR     (MY|MV)//(MY|MV|ML|MH)
  21. #endif


  22. extern uint16_t lcd_frame_buffer[][WIDTH*HEIGHT];    //320*240
  23. #define LCD_FRAME_BUF_ADDR  (uint32_t)&lcd_frame_buffer[0]
复制代码




竖屏刷新界面

竖屏刷新界面

横屏刷新界面

横屏刷新界面
回复

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2018-4-26
在线时间
16 小时
 楼主| 发表于 3 天前 | 显示全部楼层
dma2d代码:
  1. #include "dma2d.h"

  2. /* USER CODE BEGIN 0 */
  3. #include "st7789.h"
  4. uint8_t dma2d_tc_flag = 1;
  5. /* USER CODE END 0 */

  6. DMA2D_HandleTypeDef hdma2d;

  7. /* DMA2D init function */
  8. void MX_DMA2D_Init(void)
  9. {

  10.   /* USER CODE BEGIN DMA2D_Init 0 */

  11.   /* USER CODE END DMA2D_Init 0 */

  12.   /* USER CODE BEGIN DMA2D_Init 1 */

  13.   /* USER CODE END DMA2D_Init 1 */
  14.   hdma2d.Instance = DMA2D;
  15.   hdma2d.Init.Mode = DMA2D_M2M;
  16.   hdma2d.Init.ColorMode = DMA2D_OUTPUT_RGB565;
  17.   hdma2d.Init.OutputOffset = 0;
  18.   hdma2d.LayerCfg[1].InputOffset = 0;
  19.   hdma2d.LayerCfg[1].InputColorMode = DMA2D_INPUT_RGB565;
  20.   hdma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
  21.   hdma2d.LayerCfg[1].InputAlpha = 0;
  22.   hdma2d.LayerCfg[1].AlphaInverted = DMA2D_REGULAR_ALPHA;
  23.   hdma2d.LayerCfg[1].RedBlueSwap = DMA2D_RB_REGULAR;
  24.   hdma2d.LayerCfg[1].ChromaSubSampling = DMA2D_NO_CSS;
  25.   if (HAL_DMA2D_Init(&hdma2d) != HAL_OK)
  26.   {
  27.     Error_Handler();
  28.   }
  29.   if (HAL_DMA2D_ConfigLayer(&hdma2d, 1) != HAL_OK)
  30.   {
  31.     Error_Handler();
  32.   }
  33.   /* USER CODE BEGIN DMA2D_Init 2 */

  34.   /* USER CODE END DMA2D_Init 2 */

  35. }

  36. void HAL_DMA2D_MspInit(DMA2D_HandleTypeDef* dma2dHandle)
  37. {

  38.   if(dma2dHandle->Instance==DMA2D)
  39.   {
  40.   /* USER CODE BEGIN DMA2D_MspInit 0 */

  41.   /* USER CODE END DMA2D_MspInit 0 */
  42.     /* DMA2D clock enable */
  43.     __HAL_RCC_DMA2D_CLK_ENABLE();

  44.     /* DMA2D interrupt Init */
  45.     HAL_NVIC_SetPriority(DMA2D_IRQn, 2, 0);
  46.     HAL_NVIC_EnableIRQ(DMA2D_IRQn);
  47.   /* USER CODE BEGIN DMA2D_MspInit 1 */

  48.   /* USER CODE END DMA2D_MspInit 1 */
  49.   }
  50. }

  51. void HAL_DMA2D_MspDeInit(DMA2D_HandleTypeDef* dma2dHandle)
  52. {

  53.   if(dma2dHandle->Instance==DMA2D)
  54.   {
  55.   /* USER CODE BEGIN DMA2D_MspDeInit 0 */

  56.   /* USER CODE END DMA2D_MspDeInit 0 */
  57.     /* Peripheral clock disable */
  58.     __HAL_RCC_DMA2D_CLK_DISABLE();

  59.     /* DMA2D interrupt Deinit */
  60.     HAL_NVIC_DisableIRQ(DMA2D_IRQn);
  61.   /* USER CODE BEGIN DMA2D_MspDeInit 1 */

  62.   /* USER CODE END DMA2D_MspDeInit 1 */
  63.   }
  64. }

  65. /* USER CODE BEGIN 1 */
  66. uint8_t dma2d_get_tc_flag(void)
  67. {
  68.     return dma2d_tc_flag;
  69. }
  70. void dma2d_set_tc_flag(uint8_t flag)
  71. {
  72.     dma2d_tc_flag = flag;
  73. }

  74. void dma2d_irq(void)
  75. {
  76.     if (DMA2D->ISR & DMA2D_FLAG_TC) {    //传输完成中断
  77.         DMA2D->IFCR |= DMA2D_FLAG_TC;//1<<1;//清除传输完成标志
  78.         dma2d_set_tc_flag(1);
  79.         pending_buf = draw_buf;
  80.         frame_ready = 1;
  81.   
  82.     }
  83. }
复制代码
回复

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2018-4-26
在线时间
16 小时
 楼主| 发表于 3 天前 | 显示全部楼层
main.c
  1. /* USER CODE END Header */
  2. /* Includes ------------------------------------------------------------------*/
  3. #include "main.h"
  4. #include "dma2d.h"
  5. #include "ltdc.h"
  6. #include "spi.h"
  7. #include "gpio.h"

  8. /* Private includes ----------------------------------------------------------*/
  9. /* USER CODE BEGIN Includes */

  10. /* USER CODE END Includes */

  11. /* Private typedef -----------------------------------------------------------*/
  12. /* USER CODE BEGIN PTD */

  13. /* USER CODE END PTD */

  14. /* Private define ------------------------------------------------------------*/
  15. /* USER CODE BEGIN PD */

  16. /* USER CODE END PD */

  17. /* Private macro -------------------------------------------------------------*/
  18. /* USER CODE BEGIN PM */

  19. /* USER CODE END PM */

  20. /* Private variables ---------------------------------------------------------*/

  21. /* USER CODE BEGIN PV */

  22. /* USER CODE END PV */

  23. /* Private function prototypes -----------------------------------------------*/
  24. void SystemClock_Config(void);
  25. void PeriphCommonClock_Config(void);
  26. static void MPU_Config(void);
  27. /* USER CODE BEGIN PFP */

  28. /* USER CODE END PFP */

  29. /* Private user code ---------------------------------------------------------*/
  30. /* USER CODE BEGIN 0 */

  31. /* USER CODE END 0 */

  32. /**
  33.   * @brief  The application entry point.
  34.   * @retval int
  35.   */
  36. int main(void)
  37. {
  38.   /* USER CODE BEGIN 1 */

  39.   /* USER CODE END 1 */

  40.   /* MPU Configuration--------------------------------------------------------*/
  41.   MPU_Config();

  42.   /* Enable I-Cache---------------------------------------------------------*/
  43.   SCB_EnableICache();

  44.   /* Enable D-Cache---------------------------------------------------------*/
  45.   SCB_EnableDCache();

  46.   /* MCU Configuration--------------------------------------------------------*/

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

  49.   /* USER CODE BEGIN Init */

  50.   /* USER CODE END Init */

  51.   /* Configure the system clock */
  52.   SystemClock_Config();

  53. /* Configure the peripherals common clocks */
  54.   PeriphCommonClock_Config();

  55.   /* USER CODE BEGIN SysInit */

  56.   /* USER CODE END SysInit */

  57.   /* Initialize all configured peripherals */
  58.   MX_GPIO_Init();
  59.   MX_LTDC_Init();
  60.   MX_DMA2D_Init();
  61.   MX_SPI1_Init();
  62.   /* USER CODE BEGIN 2 */
  63. //    MPU_Config();
  64. //    HAL_LTDC_SetWindowSize_NoReload(&hltdc, 240, 320, 0);       
  65. //        HAL_LTDC_SetWindowPosition(&hltdc, 0, 0, 0);               
  66. //    st7789_init();
  67.     lcd_ex_st7789_reginit();
  68.     st7789_screen_test();
  69.    
  70.   /* USER CODE END 2 */

  71.   /* Infinite loop */
  72.   /* USER CODE BEGIN WHILE */
  73.   while (1)
  74.   {
  75.     /* USER CODE END WHILE */

  76.     /* USER CODE BEGIN 3 */
  77.   }
  78.   /* USER CODE END 3 */
  79. }

  80. /**
  81.   * @brief System Clock Configuration
  82.   * @retval None
  83.   */
  84. void SystemClock_Config(void)
  85. {
  86.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  87.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  88.   /** Supply configuration update enable
  89.   */
  90.   HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);

  91.   /** Configure the main internal regulator output voltage
  92.   */
  93.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  94.   while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}

  95.   __HAL_RCC_SYSCFG_CLK_ENABLE();
  96.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);

  97.   while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}

  98.   /** Initializes the RCC Oscillators according to the specified parameters
  99.   * in the RCC_OscInitTypeDef structure.
  100.   */
  101.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE;
  102.   RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;
  103.   RCC_OscInitStruct.HSIState = RCC_HSI_DIV1;
  104.   RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  105.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  106.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  107.   RCC_OscInitStruct.PLL.PLLM = 2;
  108.   RCC_OscInitStruct.PLL.PLLN = 60;
  109.   RCC_OscInitStruct.PLL.PLLP = 2;
  110.   RCC_OscInitStruct.PLL.PLLQ = 4;
  111.   RCC_OscInitStruct.PLL.PLLR = 2;
  112.   RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;
  113.   RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
  114.   RCC_OscInitStruct.PLL.PLLFRACN = 0;
  115.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  116.   {
  117.     Error_Handler();
  118.   }

  119.   /** Initializes the CPU, AHB and APB buses clocks
  120.   */
  121.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  122.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
  123.                               |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
  124.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  125.   RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
  126.   RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
  127.   RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
  128.   RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
  129.   RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
  130.   RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;

  131.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
  132.   {
  133.     Error_Handler();
  134.   }
  135. }

  136. /**
  137.   * @brief Peripherals Common Clock Configuration
  138.   * @retval None
  139.   */
  140. void PeriphCommonClock_Config(void)
  141. {
  142.   RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};

  143.   /** Initializes the peripherals clock
  144.   */
  145.   PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_CKPER;
  146.   PeriphClkInitStruct.CkperClockSelection = RCC_CLKPSOURCE_HSI;
  147.   if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  148.   {
  149.     Error_Handler();
  150.   }
  151. }

  152. /* USER CODE BEGIN 4 */

  153. /* USER CODE END 4 */

  154. /* MPU Configuration */

  155. void MPU_Config(void)
  156. {
  157.   MPU_Region_InitTypeDef MPU_InitStruct = {0};

  158.   /* Disables the MPU */
  159.   HAL_MPU_Disable();

  160.   /** Initializes and configures the Region and the memory to be protected
  161.   */
  162.   MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  163.   MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  164.   MPU_InitStruct.BaseAddress = 0x24000000;
  165.   MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;
  166.   MPU_InitStruct.SubRegionDisable = 0;
  167.   MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  168.   MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  169.   MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
  170.   MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;
  171.   MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  172.   MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;

  173.   HAL_MPU_ConfigRegion(&MPU_InitStruct);
  174.   /* Enables the MPU */
  175.   HAL_MPU_Enable(MPU_HFNMI_PRIVDEF);

  176. }

  177. /**
  178.   * @brief  This function is executed in case of error occurrence.
  179.   * @retval None
  180.   */
  181. void Error_Handler(void)
  182. {
  183.   /* USER CODE BEGIN Error_Handler_Debug */
  184.   /* User can add his own implementation to report the HAL error return state */
  185.   __disable_irq();
  186.   while (1)
  187.   {
  188.   }
  189.   /* USER CODE END Error_Handler_Debug */
  190. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

如发现本坛存在违规或侵权内容, 请点击这里发送邮件举报 (或致电020-38271790)。请提供侵权说明和联系方式。我们将及时审核依法处理,感谢配合。

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2026-3-20 10:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表