导航

    Freqchip开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 最新
    1. 主页
    2. 热门
    3. 月
    • 日
    • 周
    • 月

    • 黄

      问一下,fr8008GP怎么用keil+jlink来调试呢?
      FR800x • • 黄书剑

      4
      0
      赞同
      4
      帖子
      712
      浏览

      Z

      @黄书剑 速录降低一些,然后点击调试之前复位一下
    • L

      FR3068E-D开发板驱动RGB屏幕问题
      FR306x • • lakesky

      4
      0
      赞同
      4
      帖子
      797
      浏览

      L

      环境:使用sdk版本为 FR30XXC-SKD-v0.3.2 所用例程(ble_simple_periphreal) 参考工程为v0.2.3 例程(evb_demo) 问题1:用版本v0.3.2 的函数psram_init 初始化不通过 但是使用v0.2.3中的psram_init 替换后能正常初始化 且测试数据正常 相关代码: //前提 main.c 内初始时钟(hw_clock_init)正常 否则(psram_init)会一直卡在初始化中 //相关时钟初始如下: __RAM_CODE void hw_clock_init(void) { #if 0 System_ClkConfig_t sys_clk_cfg; sys_clk_cfg.SPLL_CFG.PLL_N = 8; sys_clk_cfg.SPLL_CFG.PLL_M = 0; sys_clk_cfg.SPLL_CFG.PowerEn = 1; sys_clk_cfg.MCU_Clock_Source = MCU_CLK_SEL_SPLL_CLK; sys_clk_cfg.SOC_DIV = 1; sys_clk_cfg.MCU_DIV = 1; sys_clk_cfg.APB0_DIV = 1; sys_clk_cfg.APB1_DIV = 1; sys_clk_cfg.APB2_DIV = 1; System_SPLL_config(&sys_clk_cfg.SPLL_CFG, 1000); System_MCU_clock_Config(&sys_clk_cfg); #else System_ClkConfig_t ClkConfig; /* CORE HSCLK Config */ ClkConfig.CORE_HSCLK_CFG.CORE_HSCLK_Source = CORE_HSCLK_SEL_HES; /* PLL clock = HSE_VALUE*N + (HSE_VALUE/65535)*M */ /* SPLL CLK Config */ ClkConfig.SPLL_CFG.PowerEn = PLL_POWER_ENABLE; ClkConfig.SPLL_CFG.PLL_N = 9; ClkConfig.SPLL_CFG.PLL_M = 0; /* PLL clock = HSE_VALUE*N + (HSE_VALUE/65535)*M */ /* AUPLL CLK Config */ ClkConfig.AUPLL_CFG.PowerEn = PLL_POWER_ENABLE; ClkConfig.AUPLL_CFG.PLL_N = 8; ClkConfig.AUPLL_CFG.PLL_K = 0; ClkConfig.AUPLL_CFG.PLL_D = 0; System_CORE_HSCLK_config(&ClkConfig.CORE_HSCLK_CFG); if (System_SPLL_config(&ClkConfig.SPLL_CFG,200) == -1) while(1); if (System_AUPLL_config(&ClkConfig.AUPLL_CFG,200) == -1) while(1); ClkConfig.MCU_Clock_Source = MCU_CLK_SEL_SPLL_CLK; ClkConfig.SOC_DIV = 1; /* This parameter is valid when MCU_Clock_Source == MCU_CLK_SEL_SPLL_CLK */ ClkConfig.MCU_DIV = 1; ClkConfig.APB0_DIV = 1; ClkConfig.APB1_DIV = 1; ClkConfig.APB2_DIV = 1; System_MCU_clock_Config(&ClkConfig); #endif __SYSTEM_UART_CLK_SELECT_SPLL(); __SYSTEM_SPI_MASTER1_X8_CLK_SELECT_SPLL(); } static void display_psram_init(void) { pmu_psram_power_ctrl(true); system_delay_us(1000); if(psram_init(PSRAM_CLK_SEL_AUPLL)) { printf("hw_psram_init\r\n"); } else { printf("hw_psram_err\r\n"); } #if 1 __CACHE_FLUSH(CACHE); __CACHE_BANK_FLUSH(CACHE); while (__CACHE_BANK_FLUSH_DONE(CACHE) == false); __CACHE_WR_MODE_SET(CACHE, CACHE_WR_WRITE_THROUGH); __CACHE_ADDR_RANGEx_BANK_SET(CACHE, 0, 0x00000000 >> 16); __CACHE_ADDR_RANGEx_MASK_SET(CACHE, 0, 0x001F); __CACHE_ADDR_RANGEx_POL_SET(CACHE, 0, CACHE_POL_CACHABLE); __CACHE_ADDR_RANGEx_ENABLE(CACHE, 0); __CACHE_ENABLE(CACHE); #endif // test psram write & read // uint16_t *test_psram = (uint16_t *)PSRAM_DAC_BASE; // for(uint32_t i = 0; i < 100; i++) // { // test_psram[i] = 0xF800; // } // printf("\r\n"); // for(uint32_t i=0;i<(100);i++) // { // printf("%04x",test_psram[i]); // } // printf("\r\n"); } 函数:psram // v0.3.2 __RAM_CODE bool psram_init(enum psram_clk_sel_t clk_sel) { GPIO_InitTypeDef GPIO_Handle; uint32_t ref_clk; if (clk_sel >= PSRAM_CLK_SEL_MAX) { return false; } switch (clk_sel) { case PSRAM_CLK_SEL_COREH: __SYSTEM_OSPI_CLK_SELECT_COREH(); ref_clk = 24000000; break; case PSRAM_CLK_SEL_SPLL: __SYSTEM_OSPI_CLK_SELECT_SPLL(); ref_clk = system_get_SPLLCLK(); break; case PSRAM_CLK_SEL_AUPLL: __SYSTEM_OSPI_CLK_SELECT_AUPLL(); ref_clk = system_get_AUPLLCLK(); break; default: return false; } __SYSTEM_OSPI_CLK_ENABLE(); /* clock of AHB cache should be enabled before access psram */ __SYSTEM_AHBC_CLK_ENABLE(); #if PSRAM_IO_GPIO == 1 GPIO_Handle.Pin = GPIO_PIN_12|GPIO_PIN_13; GPIO_Handle.Mode = GPIO_MODE_AF_PP; GPIO_Handle.Pull = GPIO_NOPULL; GPIO_Handle.Alternate = GPIO_FUNCTION_9; gpio_init(GPIOB, &GPIO_Handle); GPIO_Handle.Pin = GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_5|GPIO_PIN_6; GPIO_Handle.Mode = GPIO_MODE_AF_PP; GPIO_Handle.Pull = GPIO_NOPULL; GPIO_Handle.Alternate = GPIO_FUNCTION_9; gpio_init(GPIOC, &GPIO_Handle); #else SYSTEM->OspiPadConfig.OSPI_FuncMux = 0xFDF55FFD; #endif if(psram_delay == 0xFF) { qspi_stig_cmd(PSRAM_OSPI_IF, reset_enable_cmd, QSPI_STIG_CMD_EXE, 0, NULL); qspi_stig_cmd(PSRAM_OSPI_IF, reset_cmd, QSPI_STIG_CMD_EXE, 0, NULL); #if PSRAM_ENABLE_Q_MODE == 1 psram_enter_quad(); #endif // PSRAM_ENABLE_Q_MODE == 1 } /* about 100 bytes can be transmitted during 8us when QSPI clock is 24MHz */ ref_clk /= ((PSRAM_CLK_DIV_SEL+1) * 2); uint32_t bytes = ref_clk / 240000; uint32_t boundary_cfg = 1 << (31 - __CLZ(bytes)); if (boundary_cfg >= 0x100) { boundary_cfg = 0x100; } psram_controller_init(boundary_cfg); if(psram_delay != 0xFF) { __QSPI_READ_CAPTURE_DELAY_SET(PSRAM_OSPI_IF, psram_delay); }else{ /* detect read capture delay configuration */ uint8_t delay_lower, delay_upper, index; *(volatile uint32_t *)(PSRAM_DAC_BASE) = 0x5a5a5a5a; while(__QSPI_IS_BUSY(PSRAM_OSPI_IF)); for (index = 0; index < 16; index++) { while(__QSPI_IS_BUSY(PSRAM_OSPI_IF)); __QSPI_READ_CAPTURE_DELAY_SET(PSRAM_OSPI_IF, index); if (*(volatile uint32_t *)(PSRAM_DAC_BASE) == 0x5a5a5a5a) { break; } } if (index == 16) { __SYSTEM_OSPI_CLK_DISABLE(); __SYSTEM_AHBC_CLK_DISABLE(); return false; } else { delay_lower = index; } for (; index < 16; index++) { while(__QSPI_IS_BUSY(PSRAM_OSPI_IF)); __QSPI_READ_CAPTURE_DELAY_SET(PSRAM_OSPI_IF, index); delay_upper = index; if (*(volatile uint32_t *)(PSRAM_DAC_BASE) != 0x5a5a5a5a) { break; } } psram_delay = ((delay_lower + delay_upper)>>1); while(__QSPI_IS_BUSY(PSRAM_OSPI_IF)); __QSPI_READ_CAPTURE_DELAY_SET(PSRAM_OSPI_IF, psram_delay); } // printf("0x%02x, %d.\r\n", 1 << (31 - __CLZ(bytes)), (delay_lower + delay_upper)/2); return true; } // v0.2.3 //__RAM_CODE bool psram_init(enum psram_clk_sel_t clk_sel) { GPIO_InitTypeDef GPIO_Handle; uint32_t ref_clk; if (clk_sel >= PSRAM_CLK_SEL_MAX) { return false; } switch (clk_sel) { case PSRAM_CLK_SEL_COREH: __SYSTEM_OSPI_CLK_SELECT_COREH(); ref_clk = 24000000; break; case PSRAM_CLK_SEL_SPLL: __SYSTEM_OSPI_CLK_SELECT_SPLL(); ref_clk = system_get_SPLLCLK(); break; case PSRAM_CLK_SEL_AUPLL: __SYSTEM_OSPI_CLK_SELECT_AUPLL(); ref_clk = system_get_AUPLLCLK(); break; default: return false; } __SYSTEM_OSPI_CLK_ENABLE(); /* clock of AHB cache should be enabled before access psram */ __SYSTEM_AHBC_CLK_ENABLE(); #if PSRAM_IO_GPIO == 1 GPIO_Handle.Pin = GPIO_PIN_12|GPIO_PIN_13; GPIO_Handle.Mode = GPIO_MODE_AF_PP; GPIO_Handle.Pull = GPIO_NOPULL; GPIO_Handle.Alternate = GPIO_FUNCTION_9; gpio_init(GPIOB, &GPIO_Handle); GPIO_Handle.Pin = GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_5|GPIO_PIN_6; GPIO_Handle.Mode = GPIO_MODE_AF_PP; GPIO_Handle.Pull = GPIO_NOPULL; GPIO_Handle.Alternate = GPIO_FUNCTION_9; gpio_init(GPIOC, &GPIO_Handle); #else SYSTEM->OspiPadConfig.OSPI_InputOpenCircuit = 0xffffffff; SYSTEM->OspiPadConfig.OSPI_WakeupEN = 0; SYSTEM->OspiPadConfig.OSPI_FuncMux = 0xFDF55FFD; #endif qspi_stig_cmd(PSRAM_OSPI_IF, reset_enable_cmd, QSPI_STIG_CMD_EXE, 0, NULL); qspi_stig_cmd(PSRAM_OSPI_IF, reset_cmd, QSPI_STIG_CMD_EXE, 0, NULL); #if PSRAM_ENABLE_Q_MODE == 1 psram_enter_quad(); #endif // PSRAM_ENABLE_Q_MODE == 1 /* about 100 bytes can be transmitted during 8us when QSPI clock is 24MHz */ ref_clk /= ((PSRAM_CLK_DIV_SEL+1) * 2); uint32_t bytes = ref_clk / 240000; uint32_t boundary_cfg = 1 << (31 - __CLZ(bytes)); if (boundary_cfg >= 0x100) { boundary_cfg = 0x100; } psram_controller_init(boundary_cfg); /* detect read capture delay configuration */ uint8_t delay_lower, delay_upper, index; *(volatile uint32_t *)(PSRAM_DAC_BASE) = 0x5a5a5a5a; while(__QSPI_IS_BUSY(PSRAM_OSPI_IF)); for (index = 0; index < 16; index++) { while(__QSPI_IS_BUSY(PSRAM_OSPI_IF)); __QSPI_READ_CAPTURE_DELAY_SET(PSRAM_OSPI_IF, index); if (*(volatile uint32_t *)(PSRAM_DAC_BASE) == 0x5a5a5a5a) { break; } } if (index == 16) { __SYSTEM_OSPI_CLK_DISABLE(); __SYSTEM_AHBC_CLK_DISABLE(); return false; } else { delay_lower = index; } for (; index < 16; index++) { while(__QSPI_IS_BUSY(PSRAM_OSPI_IF)); __QSPI_READ_CAPTURE_DELAY_SET(PSRAM_OSPI_IF, index); delay_upper = index; if (*(volatile uint32_t *)(PSRAM_DAC_BASE) != 0x5a5a5a5a) { break; } } while(__QSPI_IS_BUSY(PSRAM_OSPI_IF)); __QSPI_READ_CAPTURE_DELAY_SET(PSRAM_OSPI_IF, (delay_lower + delay_upper)>>1); // printf("0x%02x, %d.\r\n", 1 << (31 - __CLZ(bytes)), (delay_lower + delay_upper)/2); return true; } 问题2: v0.3.2 dma 传输数据异常 且dma_start_IT当地址指向为 (uint32_t)&hdisplay.DISPLAYx->TX_FIFO 时无法触发中断 // 初始化 { __SYSTEM_DMA0_CLK_ENABLE(); /* DMA Init */ system_dmac_request_id_config(DISPLAY_TRANS,DMA0_REQUEST_ID_2); dma_handle.DMAx = DMA0; dma_handle.Channel = DMA_Channel1; dma_handle.Init.Data_Flow = DMA_M2P_DMAC; dma_handle.Init.Request_ID = 2; dma_handle.Init.Source_Master_Sel = DMA_AHB_MASTER_2; dma_handle.Init.Desination_Master_Sel = DMA_AHB_MASTER_3; dma_handle.Init.Source_Inc = DMA_ADDR_INC_INC; dma_handle.Init.Desination_Inc = DMA_ADDR_INC_NO_CHANGE; dma_handle.Init.Source_Width = DMA_TRANSFER_WIDTH_16; dma_handle.Init.Desination_Width = DMA_TRANSFER_WIDTH_16; dma_handle.Init.Source_Burst_Len = DMA_BURST_LEN_32; dma_handle.Init.Desination_Burst_Len = DMA_BURST_LEN_32; dma_init(&dma_handle); /* panel spec: DCLK/HSYNC/VSYNC negative, DE active high */ NVIC_ClearPendingIRQ(DMA0_IRQn); NVIC_EnableIRQ(DMA0_IRQn); } // 使用 void rgb_demo(enum_RGB_Demo_t fe_Demo) { display_psram_init(); rgb_panel_init(); display_psram_buff = (uint16_t *)PSRAM_DAC_BASE; for(uint32_t i = 0; i < RGB_ROW * RGB_COL; i++) { display_psram_buff[i] = LCD_COLOR_RED; } printf("+++++%04x+++++++",display_psram_buff[53]); switch(fe_Demo) { case RGB_INTERACTION_DMA: { printf("RGB demo: solid color with DMA start\r\n"); __DISPLAY_RGB_ENABLE(hdisplay.DISPLAYx); uint16_t buffl[64]; dma_start_IT(&dma_handle, (uint32_t)display_psram_buff, (uint32_t)&hdisplay.DISPLAYx->TX_FIFO, 64); // for(uint16_t i =0;i<64;i++) // { // printf("%04x",buffl[i]); // } // xTaskCreate(test_task, "test_task", 512, NULL, 2, &test_task_handle); break; } } } extern int fputc(int c, FILE *fp); __RAM_CODE void dma0_irq(void) { void * temp = NULL; g_dma0_irq_cnt++; if (dma_get_tfr_Status(&dma_handle)) { dma_clear_tfr_Status(&dma_handle); fputc('D',(FILE*)temp); } if (dma_get_error_Status(&dma_handle)) { dma_clear_error_Status(&dma_handle); fputc('E',(FILE*)temp); } g_dma0_irq_cnt++; } 当设置为:dma_start_IT(&dma_handle, (uint32_t)display_psram_buff, (uint32_t)buffl, 64);时 关掉buff1注释 打印如下 有D 打印说明进入了中断 当设置为:dma_start_IT(&dma_handle, (uint32_t)display_psram_buff, (uint32_t)&hdisplay.DISPLAYx->TX_FIFO, 64); 没有打印 D v0.3.2 已经使用了psram当缓冲缓存数据 初始化相关文件 然后一包发送 但是使用逻辑分析仪抓取 pd12(lcd-g3) 没有波动 屏幕都不显示颜色了 持续刷屏也不显示颜色 // 完整代码 #include "fr30xx.h" #include "user_common.h" #include "FreeRTOS.h" #include "task.h" #include "driver_psram.h" typedef struct { uint32_t VerticalSignalCount; unsigned char *rgb_TxData; uint32_t vs_tvw_count; uint32_t vs_back_count; uint32_t vs_front_count; }struct_RGB_TypeDef_t; GPIO_InitTypeDef GPIO_Handle; DMA_HandleTypeDef dma_handle; DISPLAY_HandTypeDef hdisplay; struct_RGB_TypeDef_t rgb_handle; TaskHandle_t test_task_handle; volatile uint32_t g_dma0_irq_cnt = 0; #define LCD_COLOR_BLACK 0x0000 #define LCD_COLOR_WHITE 0xFFFF #define LCD_COLOR_RED 0xF800 #define LCD_COLOR_GREEN 0x07E0 #define LCD_COLOR_BLUE 0x001F #define RGB_VBPD 16 #define RGB_VFPD 16 #define RGB_VSPW 4 #define RGB_HBPD 8 #define RGB_HFPD 8 #define RGB_HSPW 4 #define RGB_ROW 800 #define RGB_COL 480 #define DISPLAY_PSRAM_SIZE (RGB_ROW*RGB_COL*2) #define LOAD_ORIG_FRAMEBUFFER (void *)(PSRAM_DAC_BASE+ 60 + DISPLAY_PSRAM_SIZE) #define LOAD_LEFT_FRAMEBUFFER (void *)(PSRAM_DAC_BASE+ 60 + DISPLAY_PSRAM_SIZE*2) #define LOAD_RIGHT_FRAMEBUFFER (void *)(PSRAM_DAC_BASE+ 60 + DISPLAY_PSRAM_SIZE*3) volatile uint8_t refr_wait_sign = 0; static uint16_t *display_psram_buff; static void display_psram_init(void) { pmu_psram_power_ctrl(true); system_delay_us(1000); if(psram_init(PSRAM_CLK_SEL_AUPLL)) { printf("hw_psram_init\r\n"); } else { printf("hw_psram_err\r\n"); } #if 1 __CACHE_FLUSH(CACHE); __CACHE_BANK_FLUSH(CACHE); while (__CACHE_BANK_FLUSH_DONE(CACHE) == false); __CACHE_WR_MODE_SET(CACHE, CACHE_WR_WRITE_THROUGH); __CACHE_ADDR_RANGEx_BANK_SET(CACHE, 0, 0x00000000 >> 16); __CACHE_ADDR_RANGEx_MASK_SET(CACHE, 0, 0x001F); __CACHE_ADDR_RANGEx_POL_SET(CACHE, 0, CACHE_POL_CACHABLE); __CACHE_ADDR_RANGEx_ENABLE(CACHE, 0); __CACHE_ENABLE(CACHE); #endif // test psram write & read // uint16_t *test_psram = (uint16_t *)PSRAM_DAC_BASE; // for(uint32_t i = 0; i < 100; i++) // { // test_psram[i] = 0xF800; // } // printf("\r\n"); // for(uint32_t i=0;i<(100);i++) // { // printf("%04x",test_psram[i]); // } // printf("\r\n"); } static void test_task(void *arg) { while(1) { // printf("dma irq cnt=%d \r\n", g_dma0_irq_cnt); display_rgb_write_data(&hdisplay,display_psram_buff,RGB_ROW * RGB_COL); vTaskDelay(1000); } } static void rgb_panel_init(void) { /* init display CLOCK */ __SYSTEM_DISPLAY_CLK_ENABLE(); // __SYSTEM_DISPLAY_CLK_SELECT_D48M(); __SYSTEM_DISPLAY_CLK_SELECT_SPLL(); __SYSTEM_GPIOB_CLK_ENABLE(); __SYSTEM_GPIOD_CLK_ENABLE(); __SYSTEM_DMA0_CLK_ENABLE(); __SYSTEM_TIMER0_CLK_ENABLE(); printf("display clock:%d\r\n", system_get_peripheral_clock(PER_CLK_DISPLAY)); /* RGB io init */ GPIO_Handle.Alternate = GPIO_FUNCTION_8; GPIO_Handle.Mode = GPIO_MODE_AF_PP; GPIO_Handle.Pin = 0xF00; GPIO_Handle.Pull = GPIO_PULLUP; gpio_init(GPIOB, &GPIO_Handle); GPIO_Handle.Alternate = GPIO_FUNCTION_8; GPIO_Handle.Mode = GPIO_MODE_AF_PP; GPIO_Handle.Pin = 0xFFFF; GPIO_Handle.Pull = GPIO_PULLUP; gpio_init(GPIOD, &GPIO_Handle); GPIO_Handle.Alternate = GPIO_FUNCTION_0; GPIO_Handle.Mode = GPIO_MODE_OUTPUT_PP; GPIO_Handle.Pin = GPIO_PIN_7; GPIO_Handle.Pull = GPIO_PULLUP; gpio_init(GPIOB, &GPIO_Handle); gpio_write_pin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET); /* RGB Interaction Init */ hdisplay.DISPLAYx = DISPLAY; hdisplay.RGB_Init.RGB_OUT_FORMAT_SELECT = RGB565_OUT; hdisplay.RGB_Init.RGB_IN_FORMAT_SELECT = RGB565_IN; hdisplay.Interface_Select = DISPLAY_INTERFACE_RGB; /* RGB Timing Init */ hdisplay.RGB_Init.HBP = RGB_HBPD; hdisplay.RGB_Init.HFP = RGB_HFPD; hdisplay.RGB_Init.VBP = RGB_VBPD; hdisplay.RGB_Init.VFP = RGB_VFPD; hdisplay.RGB_Init.HSPW = RGB_HSPW; hdisplay.RGB_Init.VSPW = RGB_VSPW; hdisplay.RGB_Init.HRES = RGB_ROW; hdisplay.RGB_Init.VRES = RGB_COL; display_init(&hdisplay); /* RGB_CLK = (PER_CLK_RGB / 5*2) */ __DISPLAY_RGB_SET_PIXEL_CLK_DIV(hdisplay.DISPLAYx,8); /* DMA Init */ system_dmac_request_id_config(DISPLAY_TRANS,DMA0_REQUEST_ID_2); dma_handle.DMAx = DMA0; dma_handle.Channel = DMA_Channel1; dma_handle.Init.Data_Flow = DMA_M2P_DMAC; dma_handle.Init.Request_ID = 2; dma_handle.Init.Source_Master_Sel = DMA_AHB_MASTER_2; dma_handle.Init.Desination_Master_Sel = DMA_AHB_MASTER_3; dma_handle.Init.Source_Inc = DMA_ADDR_INC_INC; dma_handle.Init.Desination_Inc = DMA_ADDR_INC_NO_CHANGE; dma_handle.Init.Source_Width = DMA_TRANSFER_WIDTH_16; dma_handle.Init.Desination_Width = DMA_TRANSFER_WIDTH_16; dma_handle.Init.Source_Burst_Len = DMA_BURST_LEN_32; dma_handle.Init.Desination_Burst_Len = DMA_BURST_LEN_32; dma_init(&dma_handle); /* panel spec: DCLK/HSYNC/VSYNC negative, DE active high */ NVIC_ClearPendingIRQ(DMA0_IRQn); NVIC_EnableIRQ(DMA0_IRQn); } /************************************************************************************ * @fn rgb_demo * * @brief rgb demo * * @param fe_Demo: demo select. */ void rgb_demo(enum_RGB_Demo_t fe_Demo) { display_psram_init(); rgb_panel_init(); display_psram_buff = (uint16_t *)PSRAM_DAC_BASE; for(uint32_t i = 0; i < RGB_ROW * RGB_COL; i++) { display_psram_buff[i] = LCD_COLOR_RED; } printf("+++++%04x+++++++",display_psram_buff[53]); switch(fe_Demo) { case RGB_INTERACTION: { printf("RGB demo: solid color start\r\n"); __DISPLAY_RGB_ENABLE(hdisplay.DISPLAYx); // dma_start(&dma_handle,(uint32_t)(display_psram_buff),(uint32_t)&hdisplay.DISPLAYx->TX_FIFO, RGB_ROW * RGB_COL); // while(!dma_get_tfr_Status(&dma_handle)); // dma_clear_tfr_Status(&dma_handle); xTaskCreate(test_task, "test_task", 512, NULL, 2, &test_task_handle); break; } case RGB_INTERACTION_DMA: { printf("RGB demo: solid color with DMA start\r\n"); __DISPLAY_RGB_ENABLE(hdisplay.DISPLAYx); uint16_t buffl[64]; dma_start_IT(&dma_handle, (uint32_t)display_psram_buff, (uint32_t)&hdisplay.DISPLAYx->TX_FIFO, 64); // for(uint16_t i =0;i<64;i++) // { // printf("%04x",buffl[i]); // } // xTaskCreate(test_task, "test_task", 512, NULL, 2, &test_task_handle); break; } } } extern int fputc(int c, FILE *fp); __RAM_CODE void dma0_irq(void) { void * temp = NULL; g_dma0_irq_cnt++; if (dma_get_tfr_Status(&dma_handle)) { dma_clear_tfr_Status(&dma_handle); fputc('D',(FILE*)temp); // if(refr_wait_sign) // { // __DISPLAY_RGB_DISABLE(hdisplay.DISPLAYx); // } // else // { // __DISPLAY_RGB_ENABLE(hdisplay.DISPLAYx); // dma_start_IT(&dma_handle,(uint32_t)display_psram_buff,(uint32_t)&hdisplay.DISPLAYx->TX_FIFO, RGB_ROW * RGB_COL); // } } if (dma_get_error_Status(&dma_handle)) { dma_clear_error_Status(&dma_handle); fputc('E',(FILE*)temp); } g_dma0_irq_cnt++; }
    • 黄

      我今天重装win11,然后安装Keil 5.43.0.0后,无法编译?
      FR800x • • 黄书剑

      4
      0
      赞同
      4
      帖子
      551
      浏览

      黄

      @ZR 你们后续会提供 AC6吗?
    • Y

      Fr8010loadsbc_v1.2版本APP连接蓝牙提示找不到端口
      FR801xH • • ymm

      4
      0
      赞同
      4
      帖子
      712
      浏览

      Z

      @ymm 截一下图
    • L

      进入睡眠再唤醒调用scan后收不到GAP事件
      FR800x • • lcy

      4
      0
      赞同
      4
      帖子
      477
      浏览

      L

      是的,io触发唤醒后disable sleep
    • 1

      J-link配合keil烧录
      FR801xH • • 11

      3
      0
      赞同
      3
      帖子
      150
      浏览

      Z

      @11 看下这个章节,用例程测试看看,IO不要复用成别的功能
    • 而

      FR8008gp烧录不了,识别不到烧录
      FR800x • • 而优则

      2
      0
      赞同
      2
      帖子
      162
      浏览

      Z

      @而优则 TX,RX接好了吗 左上方串口设置可以设置烧录波特率,降低下试试
    • 啊

      802休眠后无法唤醒
      FR801xH • • 啊消费

      2
      0
      赞同
      2
      帖子
      436
      浏览

      F

      @啊消费 怎么配置的休眠唤醒,代码贴出来看看
    • W

      FR801xH蓝牙连接密码必须是6位吗,可以设置为4位吗,在哪里可以设置
      FR801xH • • wangsong

      2
      0
      赞同
      2
      帖子
      479
      浏览

      Z

      @wangsong
    • G

      ble_stack_init 在不使用蓝牙功能的时候还需要调用吗?
      FR800x • • gling

      2
      0
      赞同
      2
      帖子
      114
      浏览

      Z

      @gling 需要
    • 1

      FR8008GP的flash擦除和写入失败
      FR800x • • 105725

      2
      0
      赞同
      2
      帖子
      229
      浏览

      Z

      @105725 | ota相关的代码在这里,可以参考下ble_at例程
    • X

      gpio初始化为输出模式后,如何回到未初始化状态
      FR801xH • • xls

      2
      0
      赞同
      2
      帖子
      240
      浏览

      Z

      @xls gpio_set_dir(GPIO_PORT_D, GPIO_BIT_4, GPIO_DIR_IN); system_set_port_pull(GPIO_PD4, false);
    • X

      请问下有lvgl 240*240 圆屏的例程吗
      FR800x • • xls

      2
      0
      赞同
      2
      帖子
      251
      浏览

      Z

      @xls https://gitee.com/a18562560220/freqchip_faq/blob/master/lvgl_knob_open_demo-master(1).zip
    • L

      如何实现广播和扫描同时使能
      FR800x • • lcy

      2
      0
      赞同
      2
      帖子
      465
      浏览

      Z

      @lcy gap_start_scan gap_start_advertising 调用这两个接口就行
    • P

      各位大佬,请问一下FR8003A-U的UART2驱动在哪?初始化不了
      FR800x • • peng996

      2
      0
      赞同
      2
      帖子
      294
      浏览

      Z

      @peng996
    • G

      FLASH 读写问题
      FR800x • • gling

      2
      0
      赞同
      2
      帖子
      81
      浏览

      C

      是的,Flash 一个Block就是4k
    • I

      在Freertos中添加了按键检测任务后,无法获得GAP_EVT_MASTER_CONNECT事件
      FR801xH • • Irving

      2
      0
      赞同
      2
      帖子
      362
      浏览

      Z

      @irving 长按,之后是一直连吗(一直调用gap_conn_start)
    • L

      如何配置发射功率
      FR800x • • lcy

      2
      0
      赞同
      2
      帖子
      387
      浏览

      Z

      @lcy system_set_tx_power(); main初始化后放在pMU_init 之后调用