TL-LED

  • 2024-12-27
  • 回复了主题帖: 【FRDM-MCXN947】TFT-LCD显示屏测试

    秦天qintian0303 发表于 2024-12-27 11:03 你这是做了转接板吗,看着好像直接连上去的 做的转接板,驱动一个老旧屏幕

  • 回复了主题帖: 【FRDM-MCXN947】TFT-LCD显示屏测试

    秦天qintian0303 发表于 2024-12-25 22:53 这个要是有那个官方的模块效果会不会更好,省的配置了 嗯,想通过MCLCD接口的配置的学习来了解这个接口方面的应用。

  • 2024-12-24
  • 发表了主题帖: 【FRDM-MCXN947】移植LVGL

    本帖最后由 TL-LED 于 2024-12-24 00:48 编辑 移植LVGL到开发板,在FreeRTOS系统基础上进行移植。   一、下载LVGL源码   下载V8.3版本 下载地址:https://github.com/lvgl/lvgl/tree/release/v8.3   二、添加文件到工程   将下载的LVGL源码文件复制到工程目录middleware\lvgl下,添加文件到工程中   三、源码部分   显示屏驱动程序参考例程FRDM-MCXN947\SDK_2_16_100_FRDM-MCXN947\boards\frdmmcxn947\lvgl_examples中的代码   3.1、lvgl_support.c /* * Copyright 2023 NXP * All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include "lvgl_support.h" #include "lvgl.h" #if defined(SDK_OS_FREE_RTOS) #include "FreeRTOS.h" #include "semphr.h" #endif #include "board.h" #include "fsl_gpio.h" #if BOARD_USE_FLEXIO_SMARTDMA #include "fsl_dbi_flexio_smartdma.h" #else #include "fsl_dbi_flexio_edma.h" #endif #include "fsl_flexio_mculcd.h" #include "fsl_lpi2c.h" #include "fsl_port.h" #if BOARD_LCD_S035 #include "fsl_st7796s.h" #include "fsl_gt911.h" #else #include "fsl_ssd1963.h" #include "fsl_ft5406_rt.h" #endif #include "fsl_debug_console.h" /******************************************************************************* * Definitions ******************************************************************************/ /* Port Me. Start */ #if BOARD_LCD_S035 #else #define BOARD_SSD1963_XTAL_FREQ 10000000U #define BOARD_SSD1963_PCLK_FREQ 25000000U//30000000U #define BOARD_SSD1963_HSW 1U//48U #define BOARD_SSD1963_HFP 116//40U #define BOARD_SSD1963_HBP 44//0U #define BOARD_SSD1963_VSW 1U//3U #define BOARD_SSD1963_VFP 10U/13U #define BOARD_SSD1963_VBP 34U//18U #define BOARD_SSD1963_POLARITY_FLAG 0U #endif /* Macros for FlexIO interfacing the LCD */ #define BOARD_FLEXIO FLEXIO0 #define BOARD_FLEXIO_CLOCK_FREQ CLOCK_GetFlexioClkFreq() #define BOARD_FLEXIO_BAUDRATE_BPS 160000000U /* Macros for FlexIO shifter, timer, and pins. */ #define BOARD_FLEXIO_WR_PIN 1 #define BOARD_FLEXIO_RD_PIN 0 #define BOARD_FLEXIO_DATA_PIN_START 16 #define BOARD_FLEXIO_TX_START_SHIFTER 0 #define BOARD_FLEXIO_RX_START_SHIFTER 0 #define BOARD_FLEXIO_TX_END_SHIFTER 7 #define BOARD_FLEXIO_RX_END_SHIFTER 7 #define BOARD_FLEXIO_TIMER 0 /* Macros for the touch touch controller. */ #define BOARD_TOUCH_I2C LPI2C2 #define BOARD_TOUCH_I2C_CLOCK_FREQ CLOCK_GetLPFlexCommClkFreq(2u) #define BOARD_TOUCH_I2C_BAUDRATE 100000U /* Port Me. End */ #define DEMO_MS_TO_TICK(ms) ((ms * configTICK_RATE_HZ / 1000) + 1) /******************************************************************************* * Prototypes ******************************************************************************/ static void DEMO_InitLcd(void); static void DEMO_InitLcdClock(void); static status_t DEMO_InitLcdController(void); static void DEMO_FlushDisplay(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p); static void DEMO_InitTouch(void); static void DEMO_ReadTouch(lv_indev_drv_t *drv, lv_indev_data_t *data); static void DEMO_SetCSPin(bool set); static void DEMO_SetRSPin(bool set); /******************************************************************************* * Variables ******************************************************************************/ #if BOARD_LCD_S035 static gt911_handle_t touchHandle; #else static ft5406_rt_handle_t touchHandle; #endif #if defined(SDK_OS_FREE_RTOS) static SemaphoreHandle_t s_memWriteDone; #else static volatile bool s_memWriteDone; #endif #if BOARD_LCD_S035 /* ST7796S LCD controller handle. */ st7796s_handle_t lcdHandle; #else /* SSD1963 LCD controller handle. */ ssd1963_handle_t lcdHandle; #endif /* DBI XFER handle. */ #if BOARD_USE_FLEXIO_SMARTDMA dbi_flexio_smartdma_xfer_handle_t g_dbiFlexioXferHandle; #else dbi_flexio_edma_xfer_handle_t g_dbiFlexioXferHandle; #endif /* The FlexIO MCU LCD device. */ FLEXIO_MCULCD_Type flexioLcdDev = { .flexioBase = BOARD_FLEXIO, .busType = kFLEXIO_MCULCD_8080, .dataPinStartIndex = BOARD_FLEXIO_DATA_PIN_START, .ENWRPinIndex = BOARD_FLEXIO_WR_PIN, .RDPinIndex = BOARD_FLEXIO_RD_PIN, .txShifterStartIndex = BOARD_FLEXIO_TX_START_SHIFTER, .txShifterEndIndex = BOARD_FLEXIO_TX_END_SHIFTER, .rxShifterStartIndex = BOARD_FLEXIO_RX_START_SHIFTER, .rxShifterEndIndex = BOARD_FLEXIO_RX_END_SHIFTER, .timerIndex = BOARD_FLEXIO_TIMER, .setCSPin = DEMO_SetCSPin, .setRSPin = DEMO_SetRSPin, .setRDWRPin = NULL /* Not used in 8080 mode. */ }; SDK_ALIGN(static uint8_t s_frameBuffer[2][LCD_VIRTUAL_BUF_SIZE * LCD_FB_BYTE_PER_PIXEL], 4); /******************************************************************************* * Code ******************************************************************************/ static void DEMO_SetCSPin(bool set) { GPIO_PinWrite(BOARD_LCD_CS_GPIO, BOARD_LCD_CS_PIN, (uint8_t)set); } static void DEMO_SetRSPin(bool set) { GPIO_PinWrite(BOARD_LCD_RS_GPIO, BOARD_LCD_RS_PIN, (uint8_t)set); } static void DEMO_DbiMemoryDoneCallback(status_t status, void *userData) { #if defined(SDK_OS_FREE_RTOS) BaseType_t taskAwake = pdFALSE; xSemaphoreGiveFromISR(s_memWriteDone, &taskAwake); portYIELD_FROM_ISR(taskAwake); #else s_memWriteDone = true; #endif } #if BOARD_LCD_S035 void DEMO_LCD_I2C_Init(void) { BOARD_LPI2C_Init(BOARD_TOUCH_I2C, BOARD_TOUCH_I2C_CLOCK_FREQ); } status_t DEMO_LCD_I2C_Send( uint8_t deviceAddress, uint32_t subAddress, uint8_t subaddressSize, const uint8_t *txBuff, uint8_t txBuffSize) { return BOARD_LPI2C_Send(BOARD_TOUCH_I2C, deviceAddress, subAddress, subaddressSize, (uint8_t *)txBuff, txBuffSize); } status_t DEMO_LCD_I2C_Receive( uint8_t deviceAddress, uint32_t subAddress, uint8_t subaddressSize, uint8_t *rxBuff, uint8_t rxBuffSize) { return BOARD_LPI2C_Receive(BOARD_TOUCH_I2C, deviceAddress, subAddress, subaddressSize, rxBuff, rxBuffSize); } void DEMO_TouchDelayMs(uint32_t delayMs) { #if defined(SDK_OS_FREE_RTOS) vTaskDelay(pdMS_TO_TICKS(delayMs)); #else SDK_DelayAtLeastUs(delayMs * 1000, CLOCK_GetCoreSysClkFreq()); #endif } void DEMO_TouchConfigIntPin(gt911_int_pin_mode_t mode) { port_pin_config_t int_config = {/* Internal pull-up/down resistor is disabled */ kPORT_PullDown, /* Low internal pull resistor value is selected. */ kPORT_LowPullResistor, /* Fast slew rate is configured */ kPORT_FastSlewRate, /* Passive input filter is disabled */ kPORT_PassiveFilterDisable, /* Open drain output is disabled */ kPORT_OpenDrainDisable, /* Low drive strength is configured */ kPORT_LowDriveStrength, /* Pin is configured as GPIO */ kPORT_MuxAlt0, /* Digital input enabled */ kPORT_InputBufferEnable, /* Digital input is not inverted */ kPORT_InputNormal, /* Pin Control Register fields [15:0] are not locked */ kPORT_UnlockRegister}; switch (mode) { case kGT911_IntPinPullUp: int_config.pullSelect = kPORT_PullUp; break; case kGT911_IntPinPullDown: int_config.pullSelect = kPORT_PullDown; break; case kGT911_IntPinInput: int_config.pullSelect = kPORT_PullDisable; break; default: break; }; PORT_SetPinConfig(BOARD_LCD_INT_PORT, BOARD_LCD_INT_PIN, &int_config); } void DEMO_TouchConfigResetPin(bool pullUp) { /* * As touch controller and display controller shares the same reset pin, * we do not do actual reset / address configuration here. Please check below for * the relationship between RST pin and INT pin. * */ } #endif /* Clear the LCD controller video memory content. */ static void DEMO_ClearLcd(void) { int32_t leftLinesToClear = LCD_HEIGHT; int32_t curLinesToClear; int32_t startLine = 0; while (leftLinesToClear > 0) { curLinesToClear = (leftLinesToClear > (2 * LCD_VIRTUAL_BUF_HEIGHT)) ? (2 * LCD_VIRTUAL_BUF_HEIGHT) : leftLinesToClear; #if BOARD_LCD_S035 ST7796S_SelectArea(&lcdHandle, 0, startLine, LCD_WIDTH - 1, startLine + curLinesToClear - 1); #else SSD1963_SelectArea(&lcdHandle, 0, startLine, LCD_WIDTH - 1, startLine + curLinesToClear - 1); #endif #if !defined(SDK_OS_FREE_RTOS) s_memWriteDone = false; #endif #if BOARD_LCD_S035 ST7796S_WritePixels(&lcdHandle, (uint16_t *)s_frameBuffer, curLinesToClear * LCD_WIDTH); #else SSD1963_WriteMemory(&lcdHandle, (const uint8_t *)s_frameBuffer, curLinesToClear * LCD_WIDTH * LCD_FB_BYTE_PER_PIXEL); #endif #if defined(SDK_OS_FREE_RTOS) if (xSemaphoreTake(s_memWriteDone, portMAX_DELAY) != pdTRUE) { PRINTF("Wait semaphore error: s_memWriteDone\r\n"); assert(0); } #else while (false == s_memWriteDone) { } #endif startLine += curLinesToClear; leftLinesToClear -= curLinesToClear; } } status_t DEMO_InitLcdController(void) { status_t status; flexio_mculcd_config_t flexioMcuLcdConfig; #if BOARD_LCD_S035 const st7796s_config_t st7796sConfig = {.driverPreset = kST7796S_DriverPresetLCDPARS035, .pixelFormat = kST7796S_PixelFormatRGB565, .orientationMode = kST7796S_Orientation270, .teConfig = kST7796S_TEDisabled, .invertDisplay = true, .flipDisplay = true, .bgrFilter = true}; #else const ssd1963_config_t ssd1963Config = {.pclkFreq_Hz = BOARD_SSD1963_PCLK_FREQ, .pixelInterface = kSSD1963_RGB565, .panelDataWidth = kSSD1963_PanelData18Bit, .polarityFlags = BOARD_SSD1963_POLARITY_FLAG, .panelWidth = LCD_WIDTH, .panelHeight = LCD_HEIGHT, .hsw = BOARD_SSD1963_HSW, .hfp = BOARD_SSD1963_HFP, .hbp = BOARD_SSD1963_HBP, .vsw = BOARD_SSD1963_VSW, .vfp = BOARD_SSD1963_VFP, .vbp = BOARD_SSD1963_VBP}; #endif const gpio_pin_config_t pinConfig = { .pinDirection = kGPIO_DigitalOutput, .outputLogic = 1, }; #if BOARD_USE_FLEXIO_SMARTDMA flexio_mculcd_smartdma_config_t flexioEzhConfig = { .inputPixelFormat = kFLEXIO_MCULCD_RGB565, .outputPixelFormat = kFLEXIO_MCULCD_RGB565, }; #endif /* Set SSD1963 CS, RS, and reset pin to output. */ GPIO_PinInit(BOARD_LCD_RST_GPIO, BOARD_LCD_RST_PIN, &pinConfig); GPIO_PinInit(BOARD_LCD_CS_GPIO, BOARD_LCD_CS_PIN, &pinConfig); GPIO_PinInit(BOARD_LCD_RS_GPIO, BOARD_LCD_RS_PIN, &pinConfig); /* Initialize the flexio MCU LCD. */ /* * flexioMcuLcdConfig.enable = true; * flexioMcuLcdConfig.enableInDoze = false; * flexioMcuLcdConfig.enableInDebug = true; * flexioMcuLcdConfig.enableFastAccess = true; * flexioMcuLcdConfig.baudRate_Bps = 96000000U; */ FLEXIO_MCULCD_GetDefaultConfig(&flexioMcuLcdConfig); flexioMcuLcdConfig.baudRate_Bps = BOARD_FLEXIO_BAUDRATE_BPS; status = FLEXIO_MCULCD_Init(&flexioLcdDev, &flexioMcuLcdConfig, BOARD_FLEXIO_CLOCK_FREQ); if (kStatus_Success != status) { return status; } #if BOARD_USE_FLEXIO_SMARTDMA /* Create the DBI XFER handle. */ status = DBI_FLEXIO_SMARTDMA_CreateXferHandle(&g_dbiFlexioXferHandle, &flexioLcdDev, &flexioEzhConfig); #else /* Create the DBI XFER handle. Because DMA transfer is not used, so don't * need to create DMA handle. */ status = DBI_FLEXIO_EDMA_CreateXferHandle(&g_dbiFlexioXferHandle, &flexioLcdDev, NULL, NULL); #endif if (kStatus_Success != status) { return status; } /* Reset the SSD1963 LCD controller. */ GPIO_PinWrite(BOARD_LCD_RST_GPIO, BOARD_LCD_RST_PIN, 0); #if BOARD_LCD_S035 /* Required for GT911 I2C address mode 0 */ DEMO_TouchConfigIntPin(kGT911_IntPinPullDown); #endif #if defined(SDK_OS_FREE_RTOS) vTaskDelay(DEMO_MS_TO_TICK(1)); /* Delay at least 10ns. */ #else SDK_DelayAtLeastUs(1000U, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY); #endif GPIO_PinWrite(BOARD_LCD_RST_GPIO, BOARD_LCD_RST_PIN, 1); #if BOARD_LCD_S035 DEMO_TouchConfigIntPin(kGT911_IntPinInput); #endif #if defined(SDK_OS_FREE_RTOS) vTaskDelay(DEMO_MS_TO_TICK(5)); /* Delay at 5ms. */ #else SDK_DelayAtLeastUs(5000U, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY); #endif #if BOARD_USE_FLEXIO_SMARTDMA #if BOARD_LCD_S035 status = ST7796S_Init(&lcdHandle, &st7796sConfig, &g_dbiFlexioSmartdmaXferOps, &g_dbiFlexioXferHandle); #else status = SSD1963_Init(&lcdHandle, &ssd1963Config, &g_dbiFlexioSmartdmaXferOps, &g_dbiFlexioXferHandle, BOARD_SSD1963_XTAL_FREQ); #endif #else #if BOARD_LCD_S035 status = ST7796S_Init(&lcdHandle, &st7796sConfig, &g_dbiFlexioEdmaXferOps, &g_dbiFlexioXferHandle); #else status = SSD1963_Init(&lcdHandle, &ssd1963Config, &g_dbiFlexioEdmaXferOps, &g_dbiFlexioXferHandle, BOARD_SSD1963_XTAL_FREQ); #endif #endif if (status == kStatus_Success) { #if BOARD_LCD_S035 ST7796S_SetMemoryDoneCallback(&lcdHandle, DEMO_DbiMemoryDoneCallback, NULL); #else SSD1963_SetMemoryDoneCallback(&lcdHandle, DEMO_DbiMemoryDoneCallback, NULL); #endif /* Clear the SSD1963 video ram. */ DEMO_ClearLcd(); #if BOARD_LCD_S035 ST7796S_EnableDisplay(&lcdHandle, true); #else SSD1963_StartDisplay(&lcdHandle); SSD1963_SetBackLight(&lcdHandle, 128); #endif } else { PRINTF("LCD controller initialization failed.\r\n"); } return status; } static void DEMO_InitLcdClock(void) { } static void DEMO_InitLcd(void) { #if defined(SDK_OS_FREE_RTOS) s_memWriteDone = xSemaphoreCreateBinary(); if (NULL == s_memWriteDone) { PRINTF("Frame semaphore create failed\r\n"); assert(0); } #else s_memWriteDone = false; #endif DEMO_InitLcdClock(); DEMO_InitLcdController(); } /* Flush the content of the internal buffer the specific area on the display * You can use DMA or any hardware acceleration to do this operation in the background but * 'lv_flush_ready()' has to be called when finished * This function is required only when LV_VDB_SIZE != 0 in lv_conf.h*/ static void DEMO_FlushDisplay(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) { lv_coord_t x1 = area->x1; lv_coord_t y1 = area->y1; lv_coord_t x2 = area->x2; lv_coord_t y2 = area->y2; int32_t length = (x2 - x1 + 1) * (y2 - y1 + 1) * LCD_FB_BYTE_PER_PIXEL; #if BOARD_LCD_S035 ST7796S_SelectArea(&lcdHandle, x1, y1, x2, y2); #else SSD1963_SelectArea(&lcdHandle, x1, y1, x2, y2); #endif #if !defined(SDK_OS_FREE_RTOS) s_memWriteDone = false; #endif #if BOARD_LCD_S035 ST7796S_WritePixels(&lcdHandle, (uint16_t *)color_p, length / LCD_FB_BYTE_PER_PIXEL); #else SSD1963_WriteMemory(&lcdHandle, (const uint8_t *)color_p, length); #endif #if defined(SDK_OS_FREE_RTOS) if (xSemaphoreTake(s_memWriteDone, portMAX_DELAY) != pdTRUE) { PRINTF("Wait semaphore error: s_memWriteDone\r\n"); assert(0); } #else while (!s_memWriteDone) { } #endif /* IMPORTANT!!! * Inform the graphics library that you are ready with the flushing*/ lv_disp_flush_ready(disp_drv); } void lv_port_pre_init(void) { } void lv_port_disp_init(void) { static lv_disp_draw_buf_t disp_buf; memset(s_frameBuffer, 0, sizeof(s_frameBuffer)); lv_disp_draw_buf_init(&disp_buf, (void *)s_frameBuffer[0], (void *)s_frameBuffer[1], LCD_VIRTUAL_BUF_SIZE); /*------------------------- * Initialize your display * -----------------------*/ DEMO_InitLcd(); /*----------------------------------- * Register the display in LittlevGL *----------------------------------*/ static lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/ lv_disp_drv_init(&disp_drv); /*Basic initialization*/ /*Set up the functions to access to your display*/ /*Set the resolution of the display*/ disp_drv.hor_res = LCD_WIDTH; disp_drv.ver_res = LCD_HEIGHT; /*Used to copy the buffer's content to the display*/ disp_drv.flush_cb = DEMO_FlushDisplay; /*Set a display buffer*/ disp_drv.draw_buf = &disp_buf; /*Finally register the driver*/ lv_disp_drv_register(&disp_drv); } void lv_port_indev_init(void) { static lv_indev_drv_t indev_drv; /*------------------ * Touchpad * -----------------*/ /*Initialize your touchpad */ DEMO_InitTouch(); /*Register a touchpad input device*/ lv_indev_drv_init(&indev_drv); indev_drv.type = LV_INDEV_TYPE_POINTER; indev_drv.read_cb = DEMO_ReadTouch; lv_indev_drv_register(&indev_drv); } /*Initialize your touchpad*/ static void DEMO_InitTouch(void) { #if BOARD_LCD_S035 DEMO_LCD_I2C_Init(); gt911_config_t touchConfig = {.I2C_SendFunc = DEMO_LCD_I2C_Send, .I2C_ReceiveFunc = DEMO_LCD_I2C_Receive, .timeDelayMsFunc = DEMO_TouchDelayMs, .intPinFunc = DEMO_TouchConfigIntPin, .pullResetPinFunc = DEMO_TouchConfigResetPin, .touchPointNum = 5, .i2cAddrMode = kGT911_I2cAddrMode0, .intTrigMode = kGT911_IntFallingEdge}; GT911_Init(&touchHandle, &touchConfig); #else lpi2c_master_config_t masterConfig; /* * masterConfig.enableMaster = true; * masterConfig.baudRate_Bps = 100000U; * masterConfig.enableTimeout = false; */ LPI2C_MasterGetDefaultConfig(&masterConfig); /* Change the default baudrate configuration */ masterConfig.baudRate_Hz = BOARD_TOUCH_I2C_BAUDRATE; /* Initialize the I2C master peripheral */ LPI2C_MasterInit(BOARD_TOUCH_I2C, &masterConfig, BOARD_TOUCH_I2C_CLOCK_FREQ); /* Initialize the touch handle. */ FT5406_RT_Init(&touchHandle, BOARD_TOUCH_I2C); #endif } /* Will be called by the library to read the touchpad */ static void DEMO_ReadTouch(lv_indev_drv_t *drv, lv_indev_data_t *data) { #if BOARD_LCD_S035 touch_point_t tp[5]; uint8_t tp_count = 5; GT911_GetMultiTouch(&touchHandle, &tp_count, tp); /** * GT911 supports 5 points tracking, we only tracks ID #0. * */ bool found_track = false; for (uint8_t i = 0; i < tp_count; i++) { /* Found track ID #0 */ if (tp[i].touchID == 0) { data->state = LV_INDEV_STATE_PRESSED; switch (lcdHandle.orientationMode) { case kST7796S_Orientation0: data->point.x = (int16_t)tp[i].x; data->point.y = (int16_t)tp[i].y; break; case kST7796S_Orientation90: data->point.x = (int16_t)(touchHandle.resolutionY - tp[i].y); data->point.y = (int16_t)tp[i].x; break; case kST7796S_Orientation180: data->point.x = (int16_t)(touchHandle.resolutionX - tp[i].x); data->point.y = (int16_t)(touchHandle.resolutionY - tp[i].y); break; case kST7796S_Orientation270: data->point.x = (int16_t)tp[i].y; data->point.y = (int16_t)(touchHandle.resolutionX - tp[i].x); break; default: break; } found_track = true; break; } } /* No track #0 found... */ if (!found_track) { data->state = LV_INDEV_STATE_RELEASED; } #else touch_event_t touch_event; static int touch_x = 0; static int touch_y = 0; data->state = LV_INDEV_STATE_REL; if (kStatus_Success == FT5406_RT_GetSingleTouch(&touchHandle, &touch_event, &touch_x, &touch_y)) { if ((touch_event == kTouch_Down) || (touch_event == kTouch_Contact)) { data->state = LV_INDEV_STATE_PR; } } /*Set the last pressed coordinates*/ data->point.y = touch_y; data->point.x = touch_x; #endif }   3.2、fun_task.c #include "main.h" static volatile bool s_lvgl_initialized = false; #define START_TASK_PRO tskIDLE_PRIORITY + 1 #define START_STK_SIZE 256 TaskHandle_t StartTask_Handler; #define TASK1_PRIO tskIDLE_PRIORITY + 2 #define TASK1_STK_SIZE 256 static TaskHandle_t Task1Task_Handler = NULL; #define TASK2_PRIO tskIDLE_PRIORITY + 3 #define TASK2_STK_SIZE 256 static TaskHandle_t Task2Task_Handler = NULL; #define TASK3_PRIO tskIDLE_PRIORITY + 4 #define TASK3_STK_SIZE configMINIMAL_STACK_SIZE + 800 static TaskHandle_t Task3Task_Handler = NULL; void start_task(void *pvParameters); void task1(void *pvParameters); void task2(void *pvParameters); void task3(void *pvParameters); void task_create(void) { //start_task xTaskCreate((TaskFunction_t )start_task, (const char* )"start_task", (uint16_t )START_STK_SIZE, (void* )NULL, (UBaseType_t )START_TASK_PRO, (TaskHandle_t* )&StartTask_Handler); vTaskStartScheduler(); } void start_task(void *pvParameters) { taskENTER_CRITICAL(); //task1 xTaskCreate((TaskFunction_t )task1, (const char* )"task1", (uint16_t )TASK1_STK_SIZE, (void* )NULL, (UBaseType_t )TASK1_PRIO, (TaskHandle_t* )&Task1Task_Handler); //task2 xTaskCreate((TaskFunction_t )task2, (const char* )"task2", (uint16_t )TASK2_STK_SIZE, (void* )NULL, (UBaseType_t )TASK2_PRIO, (TaskHandle_t* )&Task2Task_Handler); //task3-lvlg xTaskCreate((TaskFunction_t )task3, (const char* )"task3", (uint16_t )TASK3_STK_SIZE, (void* )NULL, (UBaseType_t )TASK3_PRIO, (TaskHandle_t* )&Task2Task_Handler); taskEXIT_CRITICAL(); vTaskDelete(StartTask_Handler); } //task1 void task1(void *pvParameters) { __IO uint32_t index = 0; __IO uint32_t flash_id_index = 0; // tx_data_fill(); // spiflash_init(); // flash_id_index = spiflash_read_id(); // if(flash_id_index !=0x5114) // { // PRINTF("flash id check error!\r\n"); // } // else // { // PRINTF("flash id check success! id: %x\r\n", flash_id_index); // } // // spiflash_sector_erase(FLASH_TEST_ADDR / SPIF_SECTOR_SIZE); // spiflash_write(tx_buffer, FLASH_TEST_ADDR, SPI_BUF_SIZE); // spiflash_read(rx_buffer, FLASH_TEST_ADDR, SPI_BUF_SIZE); // PRINTF("Read Data: "); // for(index = 0; index < SPI_BUF_SIZE; index++) // { // PRINTF("%x ", rx_buffer[index]); // } while (1) { PRINTF("task1 run ...\r\n"); vTaskDelay(200); } } //task2 void task2(void *pvParameters) { while (1) { PRINTF("task2 run ...\r\n"); vTaskDelay(100); } } //task3 void task3(void *pvParameters) { lv_port_pre_init(); lv_init();S lv_port_disp_init(); //lv_port_indev_init(); s_lvgl_initialized = true; lv_demo_benchmark(); while (1) { lv_task_handler(); led_red_tog(); vTaskDelay(5); } } /*! * [url=home.php?mod=space&uid=159083]@brief[/url] FreeRTOS tick hook. */ void vApplicationTickHook(void) { if (s_lvgl_initialized) { lv_tick_inc(1); } } /*! * @brief Malloc failed hook. */ void vApplicationMallocFailedHook(void) { PRINTF("Malloc failed. Increase the heap size."); for (;;) ; } /*! * @brief Stack overflow hook. */ void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName) { (void)pcTaskName; (void)xTask; for (;;) ; }   3.3、main.c #include "main.h" static void BOARD_InitSmartDMA(void); int main(void) { uint8_t i; CLOCK_EnableClock(kCLOCK_Gpio0); BOARD_InitDEBUG_UARTPins(); BOARD_PowerMode_OD(); BOARD_InitBootPins(); BOARD_InitBootClocks(); BOARD_InitDebugConsole(); BOARD_InitSmartDMA(); init_led(); init_key(); task_create(); while (1) { } } static void BOARD_InitSmartDMA(void) { RESET_ClearPeripheralReset(kMUX_RST_SHIFT_RSTn); INPUTMUX_Init(INPUTMUX0); INPUTMUX_AttachSignal(INPUTMUX0, 0, kINPUTMUX_FlexioToSmartDma); /* Turnoff clock to inputmux to save power. Clock is only needed to make changes */ INPUTMUX_Deinit(INPUTMUX0); SMARTDMA_InitWithoutFirmware(); NVIC_EnableIRQ(SMARTDMA_IRQn); NVIC_SetPriority(SMARTDMA_IRQn, 3); }   四、程序运行   下载程序到开发板后,显示屏显示如下: [localvideo]43de8b1f1ac9d1df8dff2fab4ea63801[/localvideo]    

  • 2024-12-23
  • 回复了主题帖: 【FRDM-MCXN947】TFT-LCD显示屏测试

    bigbat 发表于 2024-12-23 09:40 感觉楼主的速度有点慢,是不是楼主程序有延时。 小窗口循环显示有延时

  • 2024-12-22
  • 发表了主题帖: 【FRDM-MCXN947】TFT-LCD显示屏测试

    本帖最后由 TL-LED 于 2024-12-22 22:50 编辑 使用FLEXIO接口测试TFT-LCD显示屏,驱动芯片使用SSD1963。   一、硬件接口部分   1.1、使用板子上的LCD接口   1.2、SSD1963接口框图 1.3、SSD1963数据格式 SSD1963与显示屏之间数据接口的连接定义   1.4、显示屏接口 我的显示屏是18位总线,在配置SSD1963时,选择18位数据。   二、引脚配置   2.1、配置显示屏接口   2.2、配置外设   三、程序部分   3.1、mculcd.c #include "main.h" /******************************************************************************* * Prototypes ******************************************************************************/ void BOARD_InitSmartDMA(void); static void DEMO_InitFlexioMcuLcd(void); static void DEMO_InitPanel(void); static void DEMO_StartPanel(void); static status_t DEMO_LcdWriteCommand(void *dbiXferHandle, uint32_t command); static status_t DEMO_LcdWriteData(void *dbiXferHandle, void *data, uint32_t len_byte); static status_t DEMO_LcdWriteMemory(void *dbiXferHandle, uint32_t command, const void *data, uint32_t len_byte); /******************************************************************************* * Variables ******************************************************************************/ /* The functions used to drive the panel. */ static dbi_xfer_ops_t s_flexioDbiOps = { .writeCommand = DEMO_LcdWriteCommand, .writeData = DEMO_LcdWriteData, .writeMemory = DEMO_LcdWriteMemory, .readMemory = NULL, /* Don't need read in this project. */ .setMemoryDoneCallback = NULL, /* This used for upper layer to register callback. If the writeMemory is a non-blocking(or async) function, when write finished, the registered callback function will be called. In this project, to be simple, DEMO_LcdWriteMemory blocks to wait the write done, it is not async implementation, so don't need to set callback. */ }; static ssd1963_handle_t lcdHandle; static flexio_mculcd_smartdma_handle_t s_flexioLcdHandle; static demo_pixel_t s_lcdBuffer[DEMO_BUFFER_HEIGHT][DEMO_BUFFER_WIDTH]; static volatile bool s_transferDone = false; void FLEXIO_TransferCallback(FLEXIO_MCULCD_Type *,flexio_mculcd_smartdma_handle_t *,status_t ,void *) { s_transferDone = true; } void BOARD_SetResetPin(bool set) { GPIO_PinWrite(DEMO_SSD1963_RST_GPIO, DEMO_SSD1963_RST_PIN, (uint8_t)set); } void BOARD_InitSmartDMA(void) { RESET_ClearPeripheralReset(kMUX_RST_SHIFT_RSTn); INPUTMUX_Init(INPUTMUX0); INPUTMUX_AttachSignal(INPUTMUX0, 0, kINPUTMUX_FlexioToSmartDma); /* Turnoff clock to inputmux to save power. Clock is only needed to make changes */ INPUTMUX_Deinit(INPUTMUX0); SMARTDMA_InitWithoutFirmware(); NVIC_EnableIRQ(SMARTDMA_IRQn); NVIC_SetPriority(SMARTDMA_IRQn, 3); } static status_t DEMO_LcdWriteCommand(void *dbiXferHandle, uint32_t command) { /* dbiXferHandle is actually s_flexioLcdHandle, set by SSD1963_Init 4th parameter. */ flexio_mculcd_smartdma_handle_t *flexioLcdHandle = (flexio_mculcd_smartdma_handle_t *)dbiXferHandle; /* Here use blocking way to send command, because command is short. */ FLEXIO_MCULCD_Type *flexioLCD = flexioLcdHandle->base; /* flexioLcdDev */ FLEXIO_MCULCD_StartTransfer(flexioLCD); FLEXIO_MCULCD_WriteCommandBlocking(flexioLCD, command); FLEXIO_MCULCD_StopTransfer(flexioLCD); return kStatus_Success; } static status_t DEMO_LcdWriteData(void *dbiXferHandle, void *data, uint32_t len_byte) { /* dbiXferHandle is actually s_flexioLcdHandle, set by SSD1963_Init 4th parameter. */ flexio_mculcd_smartdma_handle_t *flexioLcdHandle = (flexio_mculcd_smartdma_handle_t *)dbiXferHandle; /* * Here use blocking way to write data, this function is generally * used to send command parameter, the data length is short. */ FLEXIO_MCULCD_Type *flexioLCD = flexioLcdHandle->base; /* flexioLcdDev */ FLEXIO_MCULCD_StartTransfer(flexioLCD); FLEXIO_MCULCD_WriteDataArrayBlocking(flexioLCD, data, len_byte); FLEXIO_MCULCD_StopTransfer(flexioLCD); return kStatus_Success; } static status_t DEMO_LcdWriteMemory(void *dbiXferHandle, uint32_t command, const void *data, uint32_t len_byte) { status_t status; /* dbiXferHandle is actually s_flexioLcdHandle, set by SSD1963_Init 4th parameter. */ flexio_mculcd_smartdma_handle_t *flexioLcdHandle = (flexio_mculcd_smartdma_handle_t *)dbiXferHandle; FLEXIO_MCULCD_Type *flexioLCD = flexioLcdHandle->base; /* flexioLcdDev */ flexio_mculcd_transfer_t xfer = { .command = command, .mode = kFLEXIO_MCULCD_WriteArray, .dataAddrOrSameValue = (uint32_t)data, .dataSize = len_byte, }; s_transferDone = false; status = FLEXIO_MCULCD_TransferSMARTDMA(flexioLCD, flexioLcdHandle, &xfer); if (kStatus_Success != status) { PRINTF("Write Memory Failed\r\n"); while (1) { } } else { /* Wait for transfer done. */ while (!s_transferDone) { } } return status; } static void DEMO_InitFlexioMcuLcd(void) { status_t status; flexio_mculcd_config_t flexioMcuLcdConfig; flexio_mculcd_smartdma_config_t flexioEzhConfig = { .inputPixelFormat = kFLEXIO_MCULCD_RGB565, .outputPixelFormat = kFLEXIO_MCULCD_RGB565, }; /* Initialize the flexio MCU LCD. */ /* * flexioMcuLcdConfig.enable = true; * flexioMcuLcdConfig.enableInDoze = false; * flexioMcuLcdConfig.enableInDebug = true; * flexioMcuLcdConfig.enableFastAccess = true; * flexioMcuLcdConfig.baudRate_Bps = 96000000U; */ // FLEXIO_MCULCD_GetDefaultConfig(&flexioMcuLcdConfig); // flexioMcuLcdConfig.baudRate_Bps = DEMO_FLEXIO_BAUDRATE_BPS; // status = FLEXIO_MCULCD_Init(&flexioLcdDev, &flexioMcuLcdConfig, DEMO_FLEXIO_CLOCK_FREQ); // if (kStatus_Success != status) // { // PRINTF("FlexIO MCULCD init failed\r\n"); // while (1) // ; // } /* Init SMARTDMA. */ // BOARD_InitSmartDMA(); // /* Create FLEXIO_MCULCD SMARTDMA handle. */ // status = FLEXIO_MCULCD_TransferCreateHandleSMARTDMA(&flexioLcdDev, &s_flexioLcdHandle, &flexioEzhConfig, // DEMO_FLEXIO_TransferCallback, NULL); // status = FLEXIO_MCULCD_TransferCreateHandleSMARTDMA(&FLEXIO0_peripheralConfig, &ss_flexioLcdHandle, &FLEXIO0_smartdma_config, // FLEXIO_TransferCallback, NULL); // if (kStatus_Success != status) // { // PRINTF("FlexIO MCULCD handle creation failed\r\n"); // while (1) // ; // } } static void DEMO_InitPanel(void) { status_t status; const ssd1963_config_t ssd1963Config = { .pclkFreq_Hz = DEMO_SSD1963_PCLK_FREQ, #if SSD1963_DATA_WITDH == 16 .pixelInterface = kSSD1963_PixelInterface16Bit565, #else .pixelInterface = kSSD1963_PixelInterface8BitBGR888, #endif .panelDataWidth = kSSD1963_PanelData18Bit, .polarityFlags = DEMO_SSD1963_POLARITY_FLAG, .panelWidth = DEMO_PANEL_WIDTH, .panelHeight = DEMO_PANEL_HEIGHT, .hsw = DEMO_SSD1963_HSW, .hfp = DEMO_SSD1963_HFP, .hbp = DEMO_SSD1963_HBP, .vsw = DEMO_SSD1963_VSW, .vfp = DEMO_SSD1963_VFP, .vbp = DEMO_SSD1963_VBP }; /* Reset the SSD1963 LCD controller. */ BOARD_SetResetPin(false); SDK_DelayAtLeastUs(1, SystemCoreClock); /* Delay 10ns. */ BOARD_SetResetPin(true); SDK_DelayAtLeastUs(5000, SystemCoreClock); /* Delay 5ms. */ status = SSD1963_Init(&lcdHandle, &ssd1963Config, &s_flexioDbiOps, &ss_flexioLcdHandle, DEMO_SSD1963_XTAL_FREQ); if (kStatus_Success != status) { PRINTF("Panel initialization failed\r\n"); while (1) { } } } void DEMO_StartPanel(void) { SSD1963_StartDisplay(&lcdHandle); SSD1963_SetBackLight(&lcdHandle, 255); } /* * Draw one window with pixel array, and delay some time after draw done. */ void DEMO_DrawWindow(uint16_t startX, uint16_t startY, uint16_t endX, uint16_t endY, const uint8_t *data, uint32_t dataLen, uint32_t delayMsAfterDraw) { SSD1963_SelectArea(&lcdHandle, startX, startY, endX, endY); SSD1963_WriteMemory(&lcdHandle, data, dataLen); if (delayMsAfterDraw > 0) { SDK_DelayAtLeastUs(delayMsAfterDraw * 1000, SystemCoreClock); } } /* * Draw multiple windows with specified color, can delay some time each window draw finished. * In this example, the whole screen is devided in to 4 windows, this function fills the * windows one by one. */ void DEMO_DrawMultiWindows(demo_pixel_t color, uint32_t intervalMs) { /* Fill buffer with pixel. */ for (uint32_t y = 0; y < DEMO_BUFFER_HEIGHT; y++) { for (uint32_t x = 0; x < DEMO_BUFFER_WIDTH; x++) { s_lcdBuffer[y][x] = color; } } /* Region 0. */ DEMO_DrawWindow(0, 0, DEMO_BUFFER_WIDTH - 1, DEMO_BUFFER_HEIGHT - 1, (const uint8_t *)s_lcdBuffer, sizeof(s_lcdBuffer), intervalMs); /* Region 1. */ DEMO_DrawWindow(DEMO_BUFFER_WIDTH, 0, 2 * DEMO_BUFFER_WIDTH - 1, DEMO_BUFFER_HEIGHT - 1, (const uint8_t *)s_lcdBuffer, sizeof(s_lcdBuffer), intervalMs); /* Region 2. */ DEMO_DrawWindow(0, DEMO_BUFFER_HEIGHT, DEMO_BUFFER_WIDTH - 1, 2 * DEMO_BUFFER_HEIGHT - 1, (const uint8_t *)s_lcdBuffer, sizeof(s_lcdBuffer), intervalMs); /* Region 3. */ DEMO_DrawWindow(DEMO_BUFFER_WIDTH, DEMO_BUFFER_HEIGHT, 2 * DEMO_BUFFER_WIDTH - 1, 2 * DEMO_BUFFER_HEIGHT - 1, (const uint8_t *)s_lcdBuffer, sizeof(s_lcdBuffer), intervalMs); } void init_mculcd(void) { BOARD_InitBootPeripherals(); BOARD_InitSmartDMA(); DEMO_InitPanel(); DEMO_DrawMultiWindows(DEMO_COLOR_BLACK, 0); DEMO_StartPanel(); }   3.2、mculcd.h #ifndef __MCULCD_H #define __MCULCD_H #define DEMO_PANEL_WIDTH 640U #define DEMO_PANEL_HEIGHT 480U /* Macros for the LCD controller. */ #define DEMO_SSD1963_XTAL_FREQ 10000000U #define DEMO_SSD1963_PCLK_FREQ 25000000U #define DEMO_SSD1963_HSW 1U #define DEMO_SSD1963_HFP 116U #define DEMO_SSD1963_HBP 44U #define DEMO_SSD1963_VSW 1U #define DEMO_SSD1963_VFP 10U #define DEMO_SSD1963_VBP 34U #define DEMO_SSD1963_POLARITY_FLAG 0U #define DEMO_SSD1963_RST_GPIO GPIO4 #define DEMO_SSD1963_RST_PIN 7 #define DEMO_SSD1963_CS_GPIO GPIO0 #define DEMO_SSD1963_CS_PIN 12 #define DEMO_SSD1963_RS_GPIO GPIO0 #define DEMO_SSD1963_RS_PIN 7 #define DEMO_FLEXIO FLEXIO0 #define DEMO_FLEXIO_CLOCK_FREQ CLOCK_GetFlexioClkFreq() #define DEMO_FLEXIO_BAUDRATE_BPS 160000000U /* 16-bit data bus, baud rate on each pin is 1MHz. */ /* Macros for FlexIO shifter, timer, and pins. */ #define DEMO_FLEXIO_WR_PIN 1 #define DEMO_FLEXIO_RD_PIN 0 #define DEMO_FLEXIO_DATA_PIN_START 16 #define DEMO_FLEXIO_TX_START_SHIFTER 0 #define DEMO_FLEXIO_RX_START_SHIFTER 0 #define DEMO_FLEXIO_TX_END_SHIFTER 7 #define DEMO_FLEXIO_RX_END_SHIFTER 7 #define DEMO_FLEXIO_TIMER 0 /* Macros for DMA */ #define DEMO_EDMA DMA0 #define DEMO_FLEXIO_TX_DMA_CHANNEL 0 #define DEMO_FLEXIO_TX_DMA_REQUEST kDma0RequestMuxFlexIO0ShiftRegister0Request /* Buffer of the LCD send data. */ #define DEMO_BUFFER_WIDTH (DEMO_PANEL_WIDTH / 2U) #define DEMO_BUFFER_HEIGHT (DEMO_PANEL_HEIGHT / 2U) /* Color for RGB565 */ typedef uint16_t demo_pixel_t; #define DEMO_COLOR_RED 0xF800U #define DEMO_COLOR_GREEN 0x07E0U #define DEMO_COLOR_BLUE 0x001FU #define DEMO_COLOR_WHITE 0xFFFFU #define DEMO_COLOR_BLACK 0x0000U void init_mculcd(void); void DEMO_DrawWindow(uint16_t startX, uint16_t startY, uint16_t endX, uint16_t endY, const uint8_t *data, uint32_t dataLen, uint32_t delayMsAfterDraw); void DEMO_DrawMultiWindows(demo_pixel_t color, uint32_t intervalMs); #endif   3.3、main.c #include "main.h" int main(void) { uint8_t i; uint8_t colorIdx = 0; const demo_pixel_t colorTable[] = { DEMO_COLOR_RED, DEMO_COLOR_GREEN, DEMO_COLOR_BLUE, DEMO_COLOR_WHITE, }; CLOCK_EnableClock(kCLOCK_Gpio0); BOARD_InitDEBUG_UARTPins(); BOARD_PowerMode_OD(); BOARD_InitBootPins(); BOARD_InitBootClocks(); BOARD_InitDebugConsole(); SysTick_Init(); init_led(); init_key(); init_mculcd(); while (1) { DEMO_DrawMultiWindows(colorTable[colorIdx], 500); colorIdx++; if (colorIdx >= ARRAY_SIZE(colorTable)) { colorIdx = 0U; } led_red_tog(); } }   3.4、 源代码   四、运行结果   下载程序到开发板,显示屏显示如下 [localvideo]a77d775d9e1c35768f1e854c5d121424[/localvideo]      

  • 回复了主题帖: 【FRDM-MCXN947】LCD160160显示屏测试

    电子烂人 发表于 2024-12-22 17:09 屏幕是自己焊接的吗 是的,自己做的板子。

  • 发表了主题帖: 【FRDM-MCXN947】LCD160160显示屏测试

    本帖最后由 TL-LED 于 2024-12-22 14:36 编辑 测试并口方式驱动LCD160160显示屏。   一、电路图部分 使用FlexIO LCD接口的引脚,模拟并口方式。   二、配置端口   配置显示屏有关的引脚   三、显示屏接口时序图     四、程序部分   4.1、UC1698Driver.c /** * @File UC1698Driver.c * @author guoweilkd * @version V1.1.0 * @date 2018/05/09 * @brief Lcd驱动 * 本文件Lcd为UC1698 */ #include "main.h" const uint8_t DataToBit2[] = {0x00,0x0f,0xf0,0xff}; void lcd_delay(uint16_t dl) { uint16_t dd; for(dd=0;dd<dl;dd++) { __NOP(); } } /** *@brief 引脚初始化 *@param None *@retval None */ static void LcdGpioConfig(void) { init_tm160160_pins(); //LCD_BLA_ON(); LCD_CS_HIGH(); } /** *@brief 写命令 *@param cmd 命令 *@retval None */ void WriteLcdCommand(uint8_t cmd) { LCD_RS_LOW(); LCD_RD_HIGH(); LCD_DATABUS(cmd); lcd_delay(10); LCD_WR_LOW(); lcd_delay(1); LCD_WR_HIGH(); } /** *@brief 写数据 *@param data 数据 *@retval None */ void WriteLcdData(uint8_t data) { LCD_RS_HIGH(); LCD_RD_HIGH(); LCD_DATATOBIT((data&0x03)); lcd_delay(10); LCD_WR_LOW(); lcd_delay(5); LCD_WR_HIGH(); } /** *@brief 设置起始行 *@param row 行 *@retval None */ void SetLcdRow(uint8_t row) { WriteLcdCommand(CMD_ROWADDRH | ((row & 0xF0) >> 4)); WriteLcdCommand(CMD_ROWADDRL | (row & 0x0F)); } /** *@brief 设置起始列 *@param col 列地址 *@retval None */ void SetLcdCol(uint8_t col) { WriteLcdCommand(CMD_COLADDRH | ((col & 0x70) >> 4)); WriteLcdCommand(CMD_COLADDRL | (col & 0x0F)); } /** *@brief 开显示 *@param None *@retval None */ void Uc1698OpenLcdDisplay(void) { LCD_CS_LOW(); WriteLcdCommand(OPEN_LCDDISPLAY); LCD_CS_HIGH(); //LCD_BLA_ON(); } /** *@brief UC1698U横向写8个点的子函数 *@param Data:要显示的数据 *@retval None */ void Write8DotsUC1698U(uint8_t Data) { LCD_DATATOBIT((Data >> 6)); lcd_delay(10); LCD_WR_LOW(); lcd_delay(5); LCD_WR_HIGH(); LCD_DATATOBIT(((Data >> 4)&0x03)); lcd_delay(10); LCD_WR_LOW(); lcd_delay(5); LCD_WR_HIGH(); LCD_DATATOBIT(((Data >> 2)&0x03)); lcd_delay(10); LCD_WR_LOW(); lcd_delay(5); LCD_WR_HIGH(); LCD_DATATOBIT((Data & 0x03)); lcd_delay(10); LCD_WR_LOW(); lcd_delay(5); LCD_WR_HIGH(); } /** *@brief 关显示 *@param None *@retval None */ void Uc1698CloseLcdDisplay(void) { LCD_CS_LOW(); WriteLcdCommand(CLOSE_LCDDISPLAY); LCD_CS_HIGH(); } /** *@brief LCD初始化 *@param None *@retval None */ void LcdInit(void) { LcdGpioConfig(); LCD_CS_LOW(); LCD_RES_LOW(); SysTick_Delay_ms(100); LCD_RES_HIGH(); SysTick_Delay_ms(100); WriteLcdCommand(0xE8|(BR&0X03));//设置偏压比1/10 WriteLcdCommand(0x28|(PC1&0X03));//内部电源DC/DC WriteLcdCommand(0x24|(TC&0x03));//温度补偿 WriteLcdCommand(0x81);//设置电位命令 WriteLcdCommand(PM ); //值 WriteLcdCommand(0xc0|(LC_210&0X07) ); WriteLcdCommand(0xa0|(LC_43 &0X03) ); WriteLcdCommand(0xd0|(LC_5 &0X01) ); WriteLcdCommand(0xd4|(LC_76 &0X03) ); WriteLcdCommand(0x84|(LC_8 &0X01) ); WriteLcdCommand(0xc8); //设置N-line WriteLcdCommand( NIV); WriteLcdCommand(0xd8|(CSF&0X07) ); WriteLcdCommand(0xf4); WriteLcdCommand(WPC0); WriteLcdCommand(0xf6); WriteLcdCommand(WPC1); WriteLcdCommand(0xf5); WriteLcdCommand(WPP0); WriteLcdCommand(0xf7); WriteLcdCommand(WPP1); WriteLcdCommand(0xf8|((AC>>3)&0x01)); WriteLcdCommand(0x88| (0x07&AC)); WriteLcdCommand(0xf1); WriteLcdCommand(CEN); WriteLcdCommand(OPEN_LCDDISPLAY);/* 开显示 */ SysTick_Delay_ms(20); LCD_CS_HIGH(); } /* END */   4.2、main.c #include "main.h" extern void defaultFontInit(void); int main(void) { uint8_t i; lkdColour color; CLOCK_EnableClock(kCLOCK_Gpio0); BOARD_InitDEBUG_UARTPins(); BOARD_PowerMode_OD(); BOARD_InitBootClocks(); BOARD_InitDebugConsole(); SysTick_Init(); init_led(); init_key(); LcdInit(); defaultFontInit(); GuiUpdateDisplayAll(); color = GuiGetForecolor(); GuiRowText(0, 2,160, FONT_MID,"AI FRDM-MCXN947 Board"); GuiHPointLine(0, 15, 160, 2, color); GuiRowText(0, 60,160, FONT_MID,"https://bbs.eeworld.com.cn"); GuiRowText(0, 80,160, FONT_MID,"https://www.nxp.com.cn"); GuiRowText(0, 100,160, FONT_MID,"ID:TLLED"); GuiUpdateDisplayAll(); while (1) { SysTick_Delay_ms(500); led_red_tog(); GuiRowText(0, 2,160, FONT_MID,"TTTTTTTTTTTTTTTTTTTTT"); GuiHPointLine(0, 15, 160, 2, color); GuiRowText(0, 60,160, FONT_MID,"https://bbs.eeworld.com.cn"); GuiRowText(0, 80,160, FONT_MID,"https://www.nxp.com.cn"); GuiRowText(0, 100,160, FONT_MID,"ID:TLLED"); GuiUpdateDisplayAll(); SysTick_Delay_ms(500); GuiRowText(0, 2,160, FONT_MID,"AI FRDM-MCXN947 Board"); GuiHPointLine(0, 15, 160, 2, color); GuiRowText(0, 60,160, FONT_MID,"https://bbs.eeworld.com.cn"); GuiRowText(0, 80,160, FONT_MID,"https://www.nxp.com.cn"); GuiRowText(0, 100,160, FONT_MID,"ID:TLLED"); GuiUpdateDisplayAll(); } }   4.3、程序源码   五、程序运行   下载程序后,显示屏显示如下 [localvideo]2f00763ff0cd199f46cbe8f30c22f7c2[/localvideo]      

  • 2024-12-18
  • 发表了主题帖: 【FRDM-MCXN947】spi flash存储器读写测试

    本帖最后由 TL-LED 于 2024-12-18 16:36 编辑 spi flash存储器读写测试。   一、硬件连接   1.1、使用开发板的SPI相关的引脚     1.2、外部FLASH存储器电路图部分   二、配置SPI端口   2.1、配置FC1_SPI端口   2.2、SS端口配置 SS端口和LED_GREEN端口共用引脚   三、程序部分   3.1、spi_flash.c /** ************************************************************************** * [url=home.php?mod=space&uid=1307177]@File[/url] spi_flash.c * [url=home.php?mod=space&uid=159083]@brief[/url] spi_flash source code ************************************************************************** * Copyright notice & Disclaimer * * The software Board Support Package (BSP) that is made available to * download from Artery official website is the copyrighted work of Artery. * Artery authorizes customers to use, copy, and distribute the BSP * software and its related documentation for the purpose of design and * development in conjunction with Artery microcontrollers. Use of the * software is governed by this copyright notice and the following disclaimer. * * THIS SOFTWARE IS PROVIDED ON "AS IS" BASIS WITHOUT WARRANTIES, * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS, * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS, * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. * ************************************************************************** */ #include "spiflash/spi_flash.h" uint8_t spiflash_sector_buf[SPIF_SECTOR_SIZE]; void init_spi(void) { uint32_t srcClock_Hz; lpspi_master_config_t masterConfig; edma_config_t userConfig = {0}; /* attach FRO 12M to FLEXCOMM1 */ CLOCK_SetClkDiv(kCLOCK_DivFlexcom1Clk, 1u); CLOCK_AttachClk(kFRO12M_to_FLEXCOMM1); init_spi1_pins(); /*Master config*/ LPSPI_MasterGetDefaultConfig(&masterConfig); masterConfig.baudRate = TRANSFER_BAUDRATE; masterConfig.whichPcs = EXAMPLE_LPSPI_MASTER_PCS_FOR_INIT; masterConfig.pcsToSckDelayInNanoSec = 1000000000U / (masterConfig.baudRate * 2U); masterConfig.lastSckToPcsDelayInNanoSec = 1000000000U / (masterConfig.baudRate * 2U); masterConfig.betweenTransferDelayInNanoSec = 1000000000U / (masterConfig.baudRate * 2U); srcClock_Hz = LPSPI_MASTER_CLK_FREQ; LPSPI_MasterInit(EXAMPLE_LPSPI_MASTER_BASEADDR, &masterConfig, srcClock_Hz); } uint8_t spi1_writedat(uint8_t dat) { uint8_t srcBuff[2]; uint8_t destBuff[2]; srcBuff[0]=dat; lpspi_transfer_t masterXfer; masterXfer.txData = srcBuff; masterXfer.rxData = destBuff; masterXfer.dataSize = 1; masterXfer.configFlags = EXAMPLE_LPSPI_MASTER_PCS_FOR_TRANSFER | kLPSPI_MasterPcsContinuous | kLPSPI_MasterByteSwap; LPSPI_MasterTransferBlocking(EXAMPLE_LPSPI_MASTER_BASEADDR, &masterXfer); return destBuff[0]; } /** * @brief spi configuration. * @param none * @retval none */ void spiflash_init(void) { init_spi(); } /** * @brief write data to flash * @param pbuffer: the pointer for data buffer * @param write_addr: the address where the data is written * @param length: buffer length * @retval none */ void spiflash_write(uint8_t *pbuffer, uint32_t write_addr, uint32_t length) { uint32_t sector_pos; uint16_t sector_offset; uint16_t sector_remain; uint16_t index; uint8_t *spiflash_buf; spiflash_buf = spiflash_sector_buf; /* sector address */ sector_pos = write_addr / SPIF_SECTOR_SIZE; /* address offset in a sector */ sector_offset = write_addr % SPIF_SECTOR_SIZE; /* the remain in a sector */ sector_remain = SPIF_SECTOR_SIZE - sector_offset; if(length <= sector_remain) { /* smaller than a sector size */ sector_remain = length; } while(1) { /* read a sector */ spiflash_read(spiflash_buf, sector_pos * SPIF_SECTOR_SIZE, SPIF_SECTOR_SIZE); /* validate the read erea */ for(index = 0; index < sector_remain; index++) { if(spiflash_buf[sector_offset + index] != 0xFF) { /* there are some data not equal 0xff, so this secotr needs erased */ break; } } if(index < sector_remain) { /* erase the sector */ spiflash_sector_erase(sector_pos); /* copy the write data */ for(index = 0; index < sector_remain; index++) { spiflash_buf[index + sector_offset] = pbuffer[index]; } spiflash_write_nocheck(spiflash_buf, sector_pos * SPIF_SECTOR_SIZE, SPIF_SECTOR_SIZE); /* program the sector */ } else { /* write directly in the erased area */ spiflash_write_nocheck(pbuffer, write_addr, sector_remain); } if(length == sector_remain) { /* write end */ break; } else { /* go on writing */ sector_pos++; sector_offset = 0; pbuffer += sector_remain; write_addr += sector_remain; length -= sector_remain; if(length > SPIF_SECTOR_SIZE) { /* could not write the remain data in the next sector */ sector_remain = SPIF_SECTOR_SIZE; } else { /* could write the remain data in the next sector */ sector_remain = length; } } } } /** * @brief read data from flash * @param pbuffer: the pointer for data buffer * @param read_addr: the address where the data is read * @param length: buffer length * @retval none */ void spiflash_read(uint8_t *pbuffer, uint32_t read_addr, uint32_t length) { FLASH_CS_LOW(); spi_byte_write(SPIF_READDATA); /* send instruction */ spi_byte_write((uint8_t)((read_addr) >> 16)); /* send 24-bit address */ spi_byte_write((uint8_t)((read_addr) >> 8)); spi_byte_write((uint8_t)read_addr); spi_bytes_read(pbuffer, length); FLASH_CS_HIGH(); } /** * @brief erase a sector data * @param erase_addr: sector address to erase * @retval none */ void spiflash_sector_erase(uint32_t erase_addr) { erase_addr *= SPIF_SECTOR_SIZE; /* translate sector address to byte address */ spiflash_write_enable(); spiflash_wait_busy(); FLASH_CS_LOW(); spi_byte_write(SPIF_SECTORERASE); spi_byte_write((uint8_t)((erase_addr) >> 16)); spi_byte_write((uint8_t)((erase_addr) >> 8)); spi_byte_write((uint8_t)erase_addr); FLASH_CS_HIGH(); spiflash_wait_busy(); } /** * @brief write data without check * @param pbuffer: the pointer for data buffer * @param write_addr: the address where the data is written * @param length: buffer length * @retval none */ void spiflash_write_nocheck(uint8_t *pbuffer, uint32_t write_addr, uint32_t length) { uint16_t page_remain; /* remain bytes in a page */ page_remain = SPIF_PAGE_SIZE - write_addr % SPIF_PAGE_SIZE; if(length <= page_remain) { /* smaller than a page size */ page_remain = length; } while(1) { spiflash_page_write(pbuffer, write_addr, page_remain); if(length == page_remain) { /* all data are programmed */ break; } else { /* length > page_remain */ pbuffer += page_remain; write_addr += page_remain; /* the remain bytes to be prorammed */ length -= page_remain; if(length > SPIF_PAGE_SIZE) { /* can be progrmmed a page at a time */ page_remain = SPIF_PAGE_SIZE; } else { /* smaller than a page size */ page_remain = length; } } } } /** * @brief write a page data * @param pbuffer: the pointer for data buffer * @param write_addr: the address where the data is written * @param length: buffer length * @retval none */ void spiflash_page_write(uint8_t *pbuffer, uint32_t write_addr, uint32_t length) { if((0 < length) && (length <= SPIF_PAGE_SIZE)) { /* set write enable */ spiflash_write_enable(); FLASH_CS_LOW(); /* send instruction */ spi_byte_write(SPIF_PAGEPROGRAM); /* send 24-bit address */ spi_byte_write((uint8_t)((write_addr) >> 16)); spi_byte_write((uint8_t)((write_addr) >> 8)); spi_byte_write((uint8_t)write_addr); spi_bytes_write(pbuffer,length); FLASH_CS_HIGH(); /* wait for program end */ spiflash_wait_busy(); } } /** * @brief write data continuously * @param pbuffer: the pointer for data buffer * @param length: buffer length * @retval none */ void spi_bytes_write(uint8_t *pbuffer, uint32_t length) { volatile uint8_t dummy_data; #if defined(SPI_TRANS_DMA) dma_init_type dma_init_struct; dma_reset(DMA1_CHANNEL2); dma_reset(DMA1_CHANNEL3); dma_flexible_config(DMA1, FLEX_CHANNEL2, DMA_FLEXIBLE_SPI2_RX); dma_flexible_config(DMA1, FLEX_CHANNEL3, DMA_FLEXIBLE_SPI2_TX); dma_default_para_init(&dma_init_struct); dma_init_struct.buffer_size = length; dma_init_struct.direction = DMA_DIR_PERIPHERAL_TO_MEMORY; dma_init_struct.memory_base_addr = (uint32_t)&dummy_data; dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_BYTE; dma_init_struct.memory_inc_enable = FALSE; dma_init_struct.peripheral_base_addr = (uint32_t)(&SPI2->dt); dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_BYTE; dma_init_struct.peripheral_inc_enable = FALSE; dma_init_struct.priority = DMA_PRIORITY_VERY_HIGH; dma_init_struct.loop_mode_enable = FALSE; dma_init(DMA1_CHANNEL2, &dma_init_struct); dma_init_struct.buffer_size = length; dma_init_struct.direction = DMA_DIR_MEMORY_TO_PERIPHERAL; dma_init_struct.memory_base_addr = (uint32_t)pbuffer; dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_BYTE; dma_init_struct.memory_inc_enable = TRUE; dma_init_struct.peripheral_base_addr = (uint32_t)(&SPI2->dt); dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_BYTE; dma_init_struct.peripheral_inc_enable = FALSE; dma_init_struct.priority = DMA_PRIORITY_VERY_HIGH; dma_init_struct.loop_mode_enable = FALSE; dma_init(DMA1_CHANNEL3, &dma_init_struct); spi_i2s_dma_transmitter_enable(SPI2, TRUE); spi_i2s_dma_receiver_enable(SPI2, TRUE); dma_channel_enable(DMA1_CHANNEL2, TRUE); dma_channel_enable(DMA1_CHANNEL3, TRUE); while(dma_flag_get(DMA1_FDT2_FLAG) == RESET); dma_flag_clear(DMA1_FDT2_FLAG); dma_channel_enable(DMA1_CHANNEL2, FALSE); dma_channel_enable(DMA1_CHANNEL3, FALSE); spi_i2s_dma_transmitter_enable(SPI2, FALSE); spi_i2s_dma_receiver_enable(SPI2, FALSE); #else while(length--) { dummy_data = spi1_writedat(*pbuffer); pbuffer++; } #endif } /** * @brief read data continuously * @param pbuffer: buffer to save data * @param length: buffer length * @retval none */ void spi_bytes_read(uint8_t *pbuffer, uint32_t length) { uint8_t write_value = FLASH_SPI_DUMMY_BYTE; #if defined(SPI_TRANS_DMA) dma_init_type dma_init_struct; dma_reset(DMA1_CHANNEL2); dma_reset(DMA1_CHANNEL3); dma_flexible_config(DMA1, FLEX_CHANNEL2, DMA_FLEXIBLE_SPI2_RX); dma_flexible_config(DMA1, FLEX_CHANNEL3, DMA_FLEXIBLE_SPI2_TX); dma_default_para_init(&dma_init_struct); dma_init_struct.buffer_size = length; dma_init_struct.direction = DMA_DIR_MEMORY_TO_PERIPHERAL; dma_init_struct.memory_base_addr = (uint32_t)&write_value; dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_BYTE; dma_init_struct.memory_inc_enable = FALSE; dma_init_struct.peripheral_base_addr = (uint32_t)(&SPI2->dt); dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_BYTE; dma_init_struct.peripheral_inc_enable = FALSE; dma_init_struct.priority = DMA_PRIORITY_VERY_HIGH; dma_init_struct.loop_mode_enable = FALSE; dma_init(DMA1_CHANNEL3, &dma_init_struct); dma_init_struct.buffer_size = length; dma_init_struct.direction = DMA_DIR_PERIPHERAL_TO_MEMORY; dma_init_struct.memory_base_addr = (uint32_t)pbuffer; dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_BYTE; dma_init_struct.memory_inc_enable = TRUE; dma_init_struct.peripheral_base_addr = (uint32_t)(&SPI2->dt); dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_BYTE; dma_init_struct.peripheral_inc_enable = FALSE; dma_init_struct.priority = DMA_PRIORITY_VERY_HIGH; dma_init_struct.loop_mode_enable = FALSE; dma_init(DMA1_CHANNEL2, &dma_init_struct); spi_i2s_dma_transmitter_enable(SPI2, TRUE); spi_i2s_dma_receiver_enable(SPI2, TRUE); dma_channel_enable(DMA1_CHANNEL2, TRUE); dma_channel_enable(DMA1_CHANNEL3, TRUE); while(dma_flag_get(DMA1_FDT2_FLAG) == RESET); dma_flag_clear(DMA1_FDT2_FLAG); dma_channel_enable(DMA1_CHANNEL2, FALSE); dma_channel_enable(DMA1_CHANNEL3, FALSE); spi_i2s_dma_transmitter_enable(SPI2, FALSE); spi_i2s_dma_receiver_enable(SPI2, FALSE); #else while(length--) { *pbuffer = spi1_writedat(write_value); pbuffer++; } #endif } /** * @brief wait program done * @param none * @retval none */ void spiflash_wait_busy(void) { while((spiflash_read_sr1() & 0x01) == 0x01); } /** * @brief read sr1 register * @param none * @retval none */ uint8_t spiflash_read_sr1(void) { uint8_t breadbyte = 0; FLASH_CS_LOW(); spi_byte_write(SPIF_READSTATUSREG1); breadbyte = (uint8_t)spi_byte_read(); FLASH_CS_HIGH(); return (breadbyte); } /** * @brief enable write operation * @param none * @retval none */ void spiflash_write_enable(void) { FLASH_CS_LOW(); spi_byte_write(SPIF_WRITEENABLE); FLASH_CS_HIGH(); } /** * @brief read device id * @param none * @retval device id */ uint16_t spiflash_read_id(void) { uint16_t wreceivedata = 0; FLASH_CS_LOW(); spi_byte_write(SPIF_MANUFACTDEVICEID); spi_byte_write(0x00); spi_byte_write(0x00); spi_byte_write(0x00); wreceivedata |= spi_byte_read() << 8; wreceivedata |= spi_byte_read(); FLASH_CS_HIGH(); return wreceivedata; } /** * @brief write a byte to flash * @param data: data to write * @retval flash return data */ uint8_t spi_byte_write(uint8_t data) { uint8_t brxbuff; brxbuff = spi1_writedat(data); return brxbuff; } /** * @brief read a byte to flash * @param none * @retval flash return data */ uint8_t spi_byte_read(void) { return (spi_byte_write(FLASH_SPI_DUMMY_BYTE)); } /** * @} */ /** * @} */   3.2、spi_flash.h /** ************************************************************************** * @file spi_flash.h * @brief header file of spi_flash ************************************************************************** * Copyright notice & Disclaimer * * The software Board Support Package (BSP) that is made available to * download from Artery official website is the copyrighted work of Artery. * Artery authorizes customers to use, copy, and distribute the BSP * software and its related documentation for the purpose of design and * development in conjunction with Artery microcontrollers. Use of the * software is governed by this copyright notice and the following disclaimer. * * THIS SOFTWARE IS PROVIDED ON "AS IS" BASIS WITHOUT WARRANTIES, * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS, * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS, * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. * ************************************************************************** */ #ifndef __SPI_FLASH_H #define __SPI_FLASH_H #include "main.h" /** @addtogroup AT32L021_periph_examples * @{ */ /** @addtogroup 021_SPI_w25q_flash * @{ */ /* use dma transfer spi data */ //#define SPI_TRANS_DMA /** @defgroup SPI_flash_cs_pin_definition * @{ */ #define FLASH_CS_HIGH() GPIO_PortSet(LED_GREEN_GPIO, 1u << LED_GREEN_GPIO_PIN) #define FLASH_CS_LOW() GPIO_PortClear(LED_GREEN_GPIO, 1u << LED_GREEN_GPIO_PIN) /** * @} */ /** @defgroup SPI_flash_id_definition * @{ */ /* * flash define */ #define W25Q80 0xEF13 #define W25Q16 0xEF14 #define W25Q32 0xEF15 #define W25Q64 0xEF16 /* 16mb, the range of address:0~0xFFFFFF */ #define W25Q128 0xEF17 /** * @} */ /** @defgroup SPI_flash_operation_definition * @{ */ #define SPIF_CHIP_SIZE 0x1000000 #define SPIF_SECTOR_SIZE 4096 #define SPIF_PAGE_SIZE 256 #define SPIF_WRITEENABLE 0x06 #define SPIF_WRITEDISABLE 0x04 /* s7-s0 */ #define SPIF_READSTATUSREG1 0x05 #define SPIF_WRITESTATUSREG1 0x01 /* s15-s8 */ #define SPIF_READSTATUSREG2 0x35 #define SPIF_WRITESTATUSREG2 0x31 /* s23-s16 */ #define SPIF_READSTATUSREG3 0x15 #define SPIF_WRITESTATUSREG3 0x11 #define SPIF_READDATA 0x03 #define SPIF_FASTREADDATA 0x0B #define SPIF_FASTREADDUAL 0x3B #define SPIF_PAGEPROGRAM 0x02 /* block size:64kb */ #define SPIF_BLOCKERASE 0xD8 #define SPIF_SECTORERASE 0x20 #define SPIF_CHIPERASE 0xC7 #define SPIF_POWERDOWN 0xB9 #define SPIF_RELEASEPOWERDOWN 0xAB #define SPIF_DEVICEID 0xAB #define SPIF_MANUFACTDEVICEID 0x90 #define SPIF_JEDECDEVICEID 0x9F #define FLASH_SPI_DUMMY_BYTE 0xA5 /** * @} */ /** @defgroup SPI_flash_exported_functions * @{ */ void spiflash_init(void); void spiflash_write(uint8_t *pbuffer, uint32_t write_addr, uint32_t length); void spiflash_read(uint8_t *pbuffer, uint32_t read_addr, uint32_t length); void spiflash_sector_erase(uint32_t erase_addr); void spiflash_write_nocheck(uint8_t *pbuffer, uint32_t write_addr, uint32_t length); void spiflash_page_write(uint8_t *pbuffer, uint32_t write_addr, uint32_t length); void spi_bytes_write(uint8_t *pbuffer, uint32_t length); void spi_bytes_read(uint8_t *pbuffer, uint32_t length); void spiflash_wait_busy(void); uint8_t spiflash_read_sr1(void); void spiflash_write_enable(void); uint16_t spiflash_read_id(void); uint8_t spi_byte_write(uint8_t data); uint8_t spi_byte_read(void); /** * @} */ /** * @} */ /** * @} */ #endif   3.3、fun_task.c #include "main.h" #define FLASH_TEST_ADDR 0x1000 #define SPI_BUF_SIZE 256 uint8_t tx_buffer[SPI_BUF_SIZE]; uint8_t rx_buffer[SPI_BUF_SIZE]; #define START_TASK_PRO 1 #define START_STK_SIZE 128 TaskHandle_t StartTask_Handler; #define TASK1_PRIO 4 #define TASK1_STK_SIZE 128 static TaskHandle_t Task1Task_Handler = NULL; #define TASK2_PRIO 3 #define TASK2_STK_SIZE 128 static TaskHandle_t Task2Task_Handler = NULL; void start_task(void *pvParameters); void gui_task(void *pvParameters); void task1(void *pvParameters); void task2(void *pvParameters); void tx_data_fill(void) { uint32_t data_index = 0; for(data_index = 0; data_index < SPI_BUF_SIZE; data_index++) { tx_buffer[data_index] = 255-data_index; } } void task_create(void) { //start_task xTaskCreate((TaskFunction_t )start_task, (const char* )"start_task", (uint16_t )START_STK_SIZE, (void* )NULL, (UBaseType_t )START_TASK_PRO, (TaskHandle_t* )&StartTask_Handler); vTaskStartScheduler(); } void start_task(void *pvParameters) { taskENTER_CRITICAL(); //task1 xTaskCreate((TaskFunction_t )task1, (const char* )"task1", (uint16_t )TASK1_STK_SIZE, (void* )NULL, (UBaseType_t )TASK1_PRIO, (TaskHandle_t* )&Task1Task_Handler); //task2 xTaskCreate((TaskFunction_t )task2, (const char* )"task2", (uint16_t )TASK2_STK_SIZE, (void* )NULL, (UBaseType_t )TASK2_PRIO, (TaskHandle_t* )&Task2Task_Handler); taskEXIT_CRITICAL(); vTaskDelete(StartTask_Handler); } //task1 void task1(void *pvParameters) { __IO uint32_t index = 0; __IO uint32_t flash_id_index = 0; tx_data_fill(); spiflash_init(); flash_id_index = spiflash_read_id(); if(flash_id_index !=0x5114) { PRINTF("flash id check error!\r\n"); } else { PRINTF("flash id check success! id: %x\r\n", flash_id_index); } spiflash_sector_erase(FLASH_TEST_ADDR / SPIF_SECTOR_SIZE); spiflash_write(tx_buffer, FLASH_TEST_ADDR, SPI_BUF_SIZE); spiflash_read(rx_buffer, FLASH_TEST_ADDR, SPI_BUF_SIZE); PRINTF("Read Data: "); for(index = 0; index < SPI_BUF_SIZE; index++) { PRINTF("%x ", rx_buffer[index]); } while (1) { //PRINTF("task1 run ...\r\n"); vTaskDelay(200); } } //task2 void task2(void *pvParameters) { while (1) { //PRINTF("task2 run ...\r\n"); vTaskDelay(100); } }   四、运行结果   下载程序后,串口打印输出内容  

  • 2024-12-15
  • 回复了主题帖: 【FRDM-MCXN947】硬件SPI方式驱动LCD12864

    秦天qintian0303 发表于 2024-12-15 00:01 这是定制款的屏幕还还是通用接口的屏幕? 买的LCD屏幕设计的底板和转接板

  • 2024-12-14
  • 发表了主题帖: 【FRDM-MCXN947】硬件SPI方式驱动LCD12864

    测试使用硬件方式驱动LCD12864。 在上篇帖子https://bbs.eeworld.com.cn/thread-1301831-1-1.html的基础上,将SPI方式有模拟方式改为硬件SPI方式   一、配置接口   显示屏只有写,没有读接口,用到了SPI的MOSI和SCK引脚。下图是配置为硬件SPI   配置FC6_FLEXCOMM时钟 SPI配置为12MHz   二、程序部分   spi初始化。 void lcd_init_spi(void) { uint32_t srcClock_Hz; lpspi_master_config_t masterConfig; lpspi_transfer_t masterXfer; init_lcd_jlx12864g_pins(); /* attach FRO 12M to FLEXCOMM6 */ // CLOCK_SetClkDiv(kCLOCK_DivFlexcom6Clk, 1u); // CLOCK_AttachClk(kFRO12M_to_FLEXCOMM6); // /*Master config*/ LPSPI_MasterGetDefaultConfig(&masterConfig); masterConfig.baudRate = TRANSFER_BAUDRATE; masterConfig.whichPcs = EXAMPLE_LPSPI_MASTER_PCS_FOR_INIT; masterConfig.pcsToSckDelayInNanoSec = 1000000000U / (masterConfig.baudRate * 2U); masterConfig.lastSckToPcsDelayInNanoSec = 1000000000U / (masterConfig.baudRate * 2U); masterConfig.betweenTransferDelayInNanoSec = 1000000000U / (masterConfig.baudRate * 2U); srcClock_Hz = LPSPI_MASTER_CLK_FREQ; LPSPI_MasterInit(EXAMPLE_LPSPI_MASTER_BASEADDR, &masterConfig, srcClock_Hz); } void fc6_spi_writebyte(uint8_t byte) { uint8_t srcBuff[2]; uint8_t destBuff[2]; srcBuff[0]=byte; lpspi_transfer_t masterXfer; /*Start master transfer*/ masterXfer.txData = srcBuff; masterXfer.rxData = destBuff; masterXfer.dataSize = 1; masterXfer.configFlags = EXAMPLE_LPSPI_MASTER_PCS_FOR_TRANSFER | kLPSPI_MasterPcsContinuous | kLPSPI_MasterByteSwap; LPSPI_MasterTransferBlocking(EXAMPLE_LPSPI_MASTER_BASEADDR, &masterXfer); } void lcd_jlx12864g_write_cmd(uint8_t cmd) { uint8_t i=0; lcd_jlx12864g_cs_l(); lcd_jlx12864g_rs_l(); fc6_spi_writebyte(cmd); } void lcd_jlx12864g_write_dat(uint8_t dat) { uint8_t i=0; lcd_jlx12864g_cs_l(); lcd_jlx12864g_rs_h(); fc6_spi_writebyte(dat); }   main.c #include "main.h" int main(void) { uint8_t i; CLOCK_EnableClock(kCLOCK_Gpio0); BOARD_InitDEBUG_UARTPins(); BOARD_PowerMode_OD(); BOARD_InitBootClocks(); BOARD_InitDebugConsole(); init_utick(); SysTick_Init(); //init_p3t1755(); init_led(); init_key(); //p3t1755_test(); init_lcd_jlx12864g(); lcd_showString(0,0, (uint8_t*)"MCXN947_BOARD_TEST",6,12); lcd_showString(0,13,(uint8_t*)"JLX12864G-SPI",6,12); lcd_showString(0,26,(uint8_t*)"2024/12/14",6,12); lcd_refreshGram(); while (1) { SysTick_Delay_ms(500); led_red_tog(); //lcd_clear(); lcd_showString(0,39,(uint8_t*)"MCXN947_BOARD [OK]",6,12); lcd_refreshGram(); SysTick_Delay_ms(500); //lcd_clear(); lcd_showString(0,39,(uint8_t*)"TTTTTTTTTTTTT [OK]",6,12); lcd_refreshGram(); } }   三、运行结果   [localvideo]629ce48f9d627ffdb73f046b97fbe02b[/localvideo]          

  • 发表了主题帖: 【FRDM-MCXN947】 模拟SPI方式驱动LCD12864

    使用模式方式测试是LCD12864模块。   一、硬件部分   1.1、测试端口使用MikroBus总线接口   1.2、测试模块使用的JLX12864G     二、端口配置   配置显示显示屏使用的MikroBus总线部分接口     三、程序部分   3.1、jlx12864g.c #include "main.h" #include "lcd/jlx12864g_font.h" volatile static uint8_t lcdGram[128][8]; void lcd_jlx12864g_write_cmd(uint8_t cmd) { uint8_t i=0; lcd_jlx12864g_cs_l(); lcd_jlx12864g_rs_l(); for(i=0;i<8;i++) { lcd_jlx12864g_clk_l(); if(cmd&0x80) { lcd_jlx12864g_sda_h(); } else { lcd_jlx12864g_sda_l(); } lcd_jlx12864g_clk_h(); cmd = cmd<<1; } } void lcd_jlx12864g_write_dat(uint8_t dat) { uint8_t i=0; lcd_jlx12864g_cs_l(); lcd_jlx12864g_rs_h(); for(i=0;i<8;i++) { lcd_jlx12864g_clk_l(); if(dat&0x80) { lcd_jlx12864g_sda_h(); } else { lcd_jlx12864g_sda_l(); } lcd_jlx12864g_clk_h(); dat = dat<<1; } } void lcd_refreshGram(void) { uint8_t i,n; for(i=0;i<8;i++) { lcd_jlx12864g_write_cmd (0xb0+i); //write page lcd_jlx12864g_write_cmd (0x00); lcd_jlx12864g_write_cmd (0x10); for(n=0;n<128;n++) lcd_jlx12864g_write_dat(lcdGram[n][i]); } } void lcd_clear(void) { uint8_t i,n; for(i=0;i<8;i++) for(n=0;n<128;n++) lcdGram[n][i]=0X00; lcd_refreshGram(); } void lcd_drawPoint(uint8_t x,uint8_t y,uint8_t t) { uint8_t pos,bx,temp=0; if(x>127||y>63)return; pos=7-y/8; bx=y%8; temp=1<<(7-bx); if(t)lcdGram[x][pos]|=temp; else lcdGram[x][pos]&=~temp; } uint8_t lcd_readPoint(uint8_t x,uint8_t y) { uint8_t pos,bx,temp=0x00; //x = 127-x; y = 63-y; pos=y/8; bx=y%8; temp=1<<bx; if(temp&lcdGram[x][pos]) return 1; return 0; } void lcd_fill(uint8_t x1,uint8_t y1,uint8_t x2,uint8_t y2,uint8_t dot) { uint8_t x,y; for(x=x1;x<=x2;x++) for(y=y1;y<=y2;y++) lcd_drawPoint(x,y,dot); } void lcd_showChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t f_w,uint8_t f_h,uint8_t mode) { uint8_t temp,t,t1; uint8_t y0=y; uint8_t csize=(f_h/8+((f_h%8)?1:0))*f_w; chr=chr-' '; for(t=0;t<csize;t++) { if(f_w==6&&f_h==8)temp=asc2_0608[chr][t]; else if(f_w==6&&f_h==12)temp=asc2_0612[chr][t]; else if(f_w==12&&f_h==24)temp=asc2_1224[chr][t]; else return; for(t1=0;t1<8;t1++) { if(temp&0x80)lcd_drawPoint(x,y,mode); else lcd_drawPoint(x,y,!mode); temp<<=1; y++; if((y-y0)==f_h) { y=y0; x++; break; } } } } uint32_t mypow(uint8_t m,uint8_t n) { uint32_t result=1; while(n--)result*=m; return result; } void lcd_showNum(uint8_t x,uint8_t y,uint32_t num,uint8_t len,uint8_t f_w,uint8_t f_h) { uint8_t t,temp; uint8_t enshow=0; for(t=0;t<len;t++) { temp=(num/mypow(10,len-t-1))%10; if(enshow==0&&t<(len-1)) { if(temp==0) { lcd_showChar(x+(f_w)*t,y,' ',f_w,f_h,1); continue; } else enshow=1; } lcd_showChar(x+(f_w)*t,y,temp+'0',f_w,f_h,1); } } void lcd_showString(uint8_t x,uint8_t y,const uint8_t *p,uint8_t f_w,uint8_t f_h) { while((*p<='~')&&(*p>=' ')) { if(x>(128-(f_w))){x=0;y+=f_h;} if(y>(64-f_h)){y=x=0;lcd_clear();} lcd_showChar(x,y,*p,f_w,f_h,1); x+=f_w; p++; } } void lcd_showPicture(uint8_t x,uint8_t y,const uint8_t *p,uint8_t p_w,uint8_t p_h) { uint8_t temp,i,col,row; uint8_t y0=y; uint8_t width=p_w; if(x+p_w>128)width=128-p_w; uint8_t high=p_h; if(y+p_h>64)high=64-p_h; uint8_t exp_col_bytes=(p_h/8+((p_h%8)?1:0)); uint8_t act_col_bytes=(high/8+((high%8)?1:0)); for(row=0;row<width;row++) { for(col=0;col<act_col_bytes;col++) { temp = p[col+row*exp_col_bytes]; for(i=0;i<8;i++) { if(temp&0x80)lcd_drawPoint(x,y,1); else lcd_drawPoint(x,y,0); temp<<=1; y++; if((y-y0)==high) { y=y0; x++; break; } } } } } void init_lcd_jlx12864g(void) { init_lcd_jlx12864g_pins(); lcd_jlx12864g_cs_l(); lcd_jlx12864g_rst_l(); SysTick_Delay_ms(20); lcd_jlx12864g_rst_h(); SysTick_Delay_ms(20); lcd_jlx12864g_write_cmd(0xe2); lcd_jlx12864g_write_cmd(0x2c); lcd_jlx12864g_write_cmd(0x2e); lcd_jlx12864g_write_cmd(0x2f); lcd_jlx12864g_write_cmd(0x23); lcd_jlx12864g_write_cmd(0x81); lcd_jlx12864g_write_cmd(0x28); lcd_jlx12864g_write_cmd(0xa2); lcd_jlx12864g_write_cmd(0xc0); lcd_jlx12864g_write_cmd(0xa0); lcd_jlx12864g_write_cmd(0x40); lcd_jlx12864g_write_cmd(0xaf); lcd_jlx12864g_cs_h(); lcd_clear(); lcd_jlx12864g_bk_on(); }   3.2、jlx12864g.h #ifndef __12864G_H #define __12864G_H #define LCD_JLX12864G_CS_GPIO INIT_LCD_JLX12864G_PINS_FC6_SPI_CS_GPIO #define LCD_JLX12864G_CS_PIN INIT_LCD_JLX12864G_PINS_FC6_SPI_CS_GPIO_PIN #define LCD_JLX12864G_RST_GPIO INIT_LCD_JLX12864G_PINS_FC6_SPI_MISO_GPIO #define LCD_JLX12864G_RST_PIN INIT_LCD_JLX12864G_PINS_FC6_SPI_MISO_GPIO_PIN #define LCD_JLX12864G_RS_GPIO INIT_LCD_JLX12864G_PINS_ME_RESET_GPIO #define LCD_JLX12864G_RS_PIN INIT_LCD_JLX12864G_PINS_ME_RESET_GPIO_PIN #define LCD_JLX12864G_CLK_GPIO INIT_LCD_JLX12864G_PINS_FC6_SPI_CLK_GPIO #define LCD_JLX12864G_CLK_PIN INIT_LCD_JLX12864G_PINS_FC6_SPI_CLK_GPIO_PIN #define LCD_JLX12864G_MOSI_GPIO INIT_LCD_JLX12864G_PINS_FC6_SPI_MOSI_GPIO #define LCD_JLX12864G_MOSI_PIN INIT_LCD_JLX12864G_PINS_FC6_SPI_MOSI_GPIO_PIN #define LCD_JLX12864G_BK_GPIO INIT_LCD_JLX12864G_PINS_ME_INT_GPIO #define LCD_JLX12864G_BK_PIN INIT_LCD_JLX12864G_PINS_ME_INT_GPIO_PIN #define lcd_jlx12864g_cs_l() GPIO_PortClear(LCD_JLX12864G_CS_GPIO, 1u << LCD_JLX12864G_CS_PIN) #define lcd_jlx12864g_cs_h() GPIO_PortSet(LCD_JLX12864G_CS_GPIO, 1u << LCD_JLX12864G_CS_PIN) #define lcd_jlx12864g_rs_l() GPIO_PortClear(LCD_JLX12864G_RS_GPIO, 1u << LCD_JLX12864G_RS_PIN) #define lcd_jlx12864g_rs_h() GPIO_PortSet(LCD_JLX12864G_RS_GPIO, 1u << LCD_JLX12864G_RS_PIN) #define lcd_jlx12864g_rst_l() GPIO_PortClear(LCD_JLX12864G_RST_GPIO, 1u << LCD_JLX12864G_RST_PIN) #define lcd_jlx12864g_rst_h() GPIO_PortSet(LCD_JLX12864G_RST_GPIO, 1u << LCD_JLX12864G_RST_PIN) #define lcd_jlx12864g_clk_l() GPIO_PortClear(LCD_JLX12864G_CLK_GPIO, 1u << LCD_JLX12864G_CLK_PIN) #define lcd_jlx12864g_clk_h() GPIO_PortSet(LCD_JLX12864G_CLK_GPIO, 1u << LCD_JLX12864G_CLK_PIN) #define lcd_jlx12864g_sda_l() GPIO_PortClear(LCD_JLX12864G_MOSI_GPIO, 1u << LCD_JLX12864G_MOSI_PIN) #define lcd_jlx12864g_sda_h() GPIO_PortSet(LCD_JLX12864G_MOSI_GPIO, 1u << LCD_JLX12864G_MOSI_PIN) #define lcd_jlx12864g_bk_off() GPIO_PortClear(LCD_JLX12864G_BK_GPIO, 1u << LCD_JLX12864G_BK_PIN) #define lcd_jlx12864g_bk_on() GPIO_PortSet(LCD_JLX12864G_BK_GPIO, 1u << LCD_JLX12864G_BK_PIN) void lcd_refreshGram(void); void lcd_clear(void) ; void lcd_drawPoint(uint8_t x,uint8_t y,uint8_t t); uint8_t lcd_readPoint(uint8_t x,uint8_t y); void lcd_fill(uint8_t x1,uint8_t y1,uint8_t x2,uint8_t y2,uint8_t dot); void lcd_showChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t f_w,uint8_t f_h,uint8_t mode); uint32_t mypow(uint8_t m,uint8_t n); void lcd_showNum(uint8_t x,uint8_t y,uint32_t num,uint8_t len,uint8_t f_w,uint8_t f_h); void lcd_showString(uint8_t x,uint8_t y,const uint8_t *p,uint8_t f_w,uint8_t f_h); void lcd_showPicture(uint8_t x,uint8_t y,const uint8_t *p,uint8_t p_w,uint8_t p_h); void init_lcd_jlx12864g(void); #endif   3.3、jlx12864g_font.h const uint8_t ascii_table_8x16[95][16]={ 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, //- -(????ASCII ?:0X20 0x00,0x00,0x38,0xFC, 0xFC,0x38,0x00,0x00, 0x00,0x00,0x00,0x0D, 0x0D,0x00,0x00,0x00, //-!- ASCII ?:0X21 0x00,0x0E,0x1E,0x00, 0x00,0x1E,0x0E,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, //-"- 0x20,0xF8,0xF8,0x20, 0xF8,0xF8,0x20,0x00, 0x02,0x0F,0x0F,0x02, 0x0F,0x0F,0x02,0x00, //-#- 0x38,0x7C,0x44,0x47, 0x47,0xCC,0x98,0x00, 0x06,0x0C,0x08,0x38, 0x38,0x0F,0x07,0x00, //-$- 0x30,0x30,0x00,0x80, 0xC0,0x60,0x30,0x00, 0x0C,0x06,0x03,0x01, 0x00,0x0C,0x0C,0x00, //-%- 0x80,0xD8,0x7C,0xE4, 0xBC,0xD8,0x40,0x00, 0x07,0x0F,0x08,0x08, 0x07,0x0F,0x08,0x00, //-&- 0x00,0x10,0x1E,0x0E, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, //-'- 0x00,0x00,0xF0,0xF8, 0x0C,0x04,0x00,0x00, 0x00,0x00,0x03,0x07, 0x0C,0x08,0x00,0x00, //-(- 0x00,0x00,0x04,0x0C, 0xF8,0xF0,0x00,0x00, 0x00,0x00,0x08,0x0C, 0x07,0x03,0x00,0x00, //-)- 0x80,0xA0,0xE0,0xC0, 0xC0,0xE0,0xA0,0x80, 0x00,0x02,0x03,0x01, 0x01,0x03,0x02,0x00, //-*- ASCII ?:0X2A 0x00,0x80,0x80,0xE0, 0xE0,0x80,0x80,0x00, 0x00,0x00,0x00,0x03, 0x03,0x00,0x00,0x00, //-+- 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x1E, 0x0E,0x00,0x00,0x00, //-,- 0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, //--- 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0C, 0x0C,0x00,0x00,0x00, //-.- 0x00,0x00,0x00,0x80, 0xC0,0x60,0x30,0x00, 0x0C,0x06,0x03,0x01, 0x00,0x00,0x00,0x00, //-/- 0xF8,0xF8,0x0C,0xC4, 0x0C,0xF8,0xF0,0x00, 0x03,0x07,0x0C,0x08, 0x0C,0x07,0x03,0x00, //-0- ASCII ?:0X30 0x00,0x10,0x18,0xFC, 0xFC,0x00,0x00,0x00, 0x00,0x08,0x08,0x0F, 0x0F,0x08,0x08,0x00, //-1- 0x08,0x0C,0x84,0xC4, 0x64,0x3C,0x18,0x00, 0x0E,0x0F,0x09,0x08, 0x08,0x0C,0x0C,0x00, //-2- 0x08,0x0C,0x44,0x44, 0x44,0xFC,0xB8,0x00, 0x04,0x0C,0x08,0x08, 0x08,0x0F,0x07,0x00, //-3- 0xC0,0xE0,0xB0,0x98, 0xFC,0xFC,0x80,0x00, 0x00,0x00,0x00,0x08, 0x0F,0x0F,0x08,0x00, //-4- ASCII ?:0X34 0x7C,0x7C,0x44,0x44, 0x44,0xC4,0x84,0x00, 0x04,0x0C,0x08,0x08, 0x08,0x0F,0x07,0x00, //-5- 0xF0,0xF8,0x4C,0x44, 0x44,0xC0,0x80,0x00, 0x07,0x0F,0x08,0x08, 0x08,0x0F,0x07,0x00, //-6- 0x0C,0x0C,0x04,0x84, 0xC4,0x7C,0x3C,0x00, 0x00,0x00,0x0F,0x0F, 0x00,0x00,0x00,0x00, //-7- 0xB8,0xFC,0x44,0x44, 0x44,0xFC,0xB8,0x00, 0x07,0x0F,0x08,0x08, 0x08,0x0F,0x07,0x00, //-8- 0x38,0x7C,0x44,0x44, 0x44,0xFC,0xF8,0x00, 0x00,0x08,0x08,0x08, 0x0C,0x07,0x03,0x00, //-9- 0x00,0x00,0x00,0x30, 0x30,0x00,0x00,0x00, 0x00,0x00,0x00,0x06, 0x06,0x00,0x00,0x00, //-:- 0x00,0x00,0x00,0x30, 0x30,0x00,0x00,0x00, 0x00,0x00,0x08,0x0E, 0x06,0x00,0x00,0x00, //-;- 0x00,0x80,0xC0,0x60, 0x30,0x18,0x08,0x00, 0x00,0x00,0x01,0x03, 0x06,0x0C,0x08,0x00, //-<- 0x00,0x20,0x20,0x20, 0x20,0x20,0x20,0x00, 0x00,0x01,0x01,0x01, 0x01,0x01,0x01,0x00, //-=- 0x00,0x08,0x18,0x30, 0x60,0xC0,0x80,0x00, 0x00,0x08,0x0C,0x06, 0x03,0x01,0x00,0x00, //->- ASCII ?:0X3E 0x18,0x1C,0x04,0xC4, 0xE4,0x3C,0x18,0x00, 0x00,0x00,0x00,0x0D, 0x0D,0x00,0x00,0x00, //-?- 0xF0,0xF0,0x08,0xC8, 0xC8,0xF8,0xF0,0x00, 0x07,0x0F,0x08,0x0B, 0x0B,0x0B,0x01,0x00, //-@- 0xE0,0xF0,0x98,0x8C, 0x98,0xF0,0xE0,0x00, 0x0F,0x0F,0x00,0x00, 0x00,0x0F,0x0F,0x00, //-A- ASCII ?:0X41 0x04,0xFC,0xFC,0x44, 0x44,0xFC,0xB8,0x00, 0x08,0x0F,0x0F,0x08, 0x08,0x0F,0x07,0x00, //-B- 0xF0,0xF8,0x0C,0x04, 0x04,0x0C,0x18,0x00, 0x03,0x07,0x0C,0x08, 0x08,0x0C,0x06,0x00, //-C- 0x04,0xFC,0xFC,0x04, 0x0C,0xF8,0xF0,0x00, 0x08,0x0F,0x0F,0x08, 0x0C,0x07,0x03,0x00, //-D- 0x04,0xFC,0xFC,0x44, 0xE4,0x0C,0x1C,0x00, 0x08,0x0F,0x0F,0x08, 0x08,0x0C,0x0E,0x00, //-E- 0x04,0xFC,0xFC,0x44, 0xE4,0x0C,0x1C,0x00, 0x08,0x0F,0x0F,0x08, 0x00,0x00,0x00,0x00, //-F- 0xF0,0xF8,0x0C,0x84, 0x84,0x8C,0x98,0x00, 0x03,0x07,0x0C,0x08, 0x08,0x07,0x0F,0x00, //-G- 0xFC,0xFC,0x40,0x40, 0x40,0xFC,0xFC,0x00, 0x0F,0x0F,0x00,0x00, 0x00,0x0F,0x0F,0x00, //-H- ASCII ?:0X48 0x00,0x00,0x04,0xFC, 0xFC,0x04,0x00,0x00, 0x00,0x00,0x08,0x0F, 0x0F,0x08,0x00,0x00, //-I- 0x00,0x00,0x00,0x04, 0xFC,0xFC,0x04,0x00, 0x07,0x0F,0x08,0x08, 0x0F,0x07,0x00,0x00, //-J- 0x04,0xFC,0xFC,0xC0, 0xE0,0x3C,0x1C,0x00, 0x08,0x0F,0x0F,0x00, 0x01,0x0F,0x0E,0x00, //-K- 0x04,0xFC,0xFC,0x04, 0x00,0x00,0x00,0x00, 0x08,0x0F,0x0F,0x08, 0x08,0x0C,0x0E,0x00, //-L- 0xFC,0xFC,0x38,0x70, 0x38,0xFC,0xFC,0x00, 0x0F,0x0F,0x00,0x00, 0x00,0x0F,0x0F,0x00, //-M- 0xFC,0xFC,0x38,0x70, 0xE0,0xFC,0xFC,0x00, 0x0F,0x0F,0x00,0x00, 0x00,0x0F,0x0F,0x00, //-N- 0xF8,0xFC,0x04,0x04, 0x04,0xFC,0xF8,0x00, 0x07,0x0F,0x08,0x08, 0x08,0x0F,0x07,0x00, //-O- 0x04,0xFC,0xFC,0x44, 0x44,0x7C,0x38,0x00, 0x08,0x0F,0x0F,0x08, 0x00,0x00,0x00,0x00, //-P- 0xF8,0xFC,0x04,0x04, 0x04,0xFC,0xF8,0x00, 0x07,0x0F,0x08,0x0E, 0x3C,0x3F,0x27,0x00, //-Q- 0x04,0xFC,0xFC,0x44, 0xC4,0xFC,0x38,0x00, 0x08,0x0F,0x0F,0x00, 0x00,0x0F,0x0F,0x00, //-R- 0x18,0x3C,0x64,0x44, 0xC4,0x9C,0x18,0x00, 0x06,0x0E,0x08,0x08, 0x08,0x0F,0x07,0x00, //-S- 0x00,0x1C,0x0C,0xFC, 0xFC,0x0C,0x1C,0x00, 0x00,0x00,0x08,0x0F, 0x0F,0x08,0x00,0x00, //-T- 0xFC,0xFC,0x00,0x00, 0x00,0xFC,0xFC,0x00, 0x07,0x0F,0x08,0x08, 0x08,0x0F,0x07,0x00, //-U- 0xFC,0xFC,0x00,0x00, 0x00,0xFC,0xFC,0x00, 0x01,0x03,0x06,0x0C, 0x06,0x03,0x01,0x00, //-V- 0xFC,0xFC,0x00,0x00, 0x00,0xFC,0xFC,0x00, 0x07,0x0F,0x0E,0x03, 0x0E,0x0F,0x07,0x00, //-W- 0x0C,0x3C,0xF0,0xE0, 0xF0,0x3C,0x0C,0x00, 0x0C,0x0F,0x03,0x01, 0x03,0x0F,0x0C,0x00, //-X- 0x00,0x0C,0x7C,0xC0, 0xC0,0x7C,0x3C,0x00, 0x00,0x00,0x08,0x0F, 0x0F,0x08,0x00,0x00, //-Y- 0x1C,0x0C,0x84,0xC4, 0x64,0x3C,0x1C,0x00, 0x0E,0x0F,0x09,0x08, 0x08,0x0C,0x0E,0x00, //-Z- 0x00,0x00,0xFC,0xFC, 0x04,0x04,0x00,0x00, 0x00,0x00,0x0F,0x0F, 0x08,0x08,0x00,0x00, //-[- 0x38,0x70,0xE0,0xC0, 0x80,0x00,0x00,0x00, 0x00,0x00,0x00,0x01, 0x03,0x07,0x0E,0x00, //-\- 0x00,0x00,0x04,0x04, 0xFC,0xFC,0x00,0x00, 0x00,0x00,0x08,0x08, 0x0F,0x0F,0x00,0x00, //-]- 0x08,0x0C,0x06,0x03, 0x06,0x0C,0x08,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, //-^- 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20, //-_- 0x00,0x00,0x03,0x07, 0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, //-`- 0x00,0xA0,0xA0,0xA0, 0xE0,0xC0,0x00,0x00, 0x07,0x0F,0x08,0x08, 0x07,0x0F,0x08,0x00, //-a- ASCII ?:0X61 0x04,0xFC,0xFC,0x20, 0x60,0xC0,0x80,0x00, 0x00,0x0F,0x0F,0x08, 0x08,0x0F,0x07,0x00, //-b- 0xC0,0xE0,0x20,0x20, 0x20,0x60,0x40,0x00, 0x07,0x0F,0x08,0x08, 0x08,0x0C,0x04,0x00, //-c- 0x80,0xC0,0x60,0x24, 0xFC,0xFC,0x00,0x00, 0x07,0x0F,0x08,0x08, 0x07,0x0F,0x08,0x00, //-d- 0xC0,0xE0,0xA0,0xA0, 0xA0,0xE0,0xC0,0x00, 0x07,0x0F,0x08,0x08, 0x08,0x0C,0x04,0x00, //-e- 0x40,0xF8,0xFC,0x44, 0x0C,0x18,0x00,0x00, 0x08,0x0F,0x0F,0x08, 0x00,0x00,0x00,0x00, //-f- 0xC0,0xE0,0x20,0x20, 0xC0,0xE0,0x20,0x00, 0x27,0x6F,0x48,0x48, 0x7F,0x3F,0x00,0x00, //-g- 0x04,0xFC,0xFC,0x40, 0x20,0xE0,0xC0,0x00, 0x08,0x0F,0x0F,0x00, 0x00,0x0F,0x0F,0x00, //-h- 0x00,0x00,0x20,0xEC, 0xEC,0x00,0x00,0x00, 0x00,0x00,0x08,0x0F, 0x0F,0x08,0x00,0x00, //-i- 0x00,0x00,0x00,0x00, 0x20,0xEC,0xEC,0x00, 0x00,0x30,0x70,0x40, 0x40,0x7F,0x3F,0x00, //-j- 0x04,0xFC,0xFC,0x80, 0xC0,0x60,0x20,0x00, 0x08,0x0F,0x0F,0x01, 0x03,0x0E,0x0C,0x00, //-k- 0x00,0x00,0x04,0xFC, 0xFC,0x00,0x00,0x00, 0x00,0x00,0x08,0x0F, 0x0F,0x08,0x00,0x00, //-l- 0xE0,0xE0,0x60,0xC0, 0x60,0xE0,0xC0,0x00, 0x0F,0x0F,0x00,0x07, 0x00,0x0F,0x0F,0x00, //-m- 0x20,0xE0,0xC0,0x20, 0x20,0xE0,0xC0,0x00, 0x00,0x0F,0x0F,0x00, 0x00,0x0F,0x0F,0x00, //-n- 0xC0,0xE0,0x20,0x20, 0x20,0xE0,0xC0,0x00, 0x07,0x0F,0x08,0x08, 0x08,0x0F,0x07,0x00, //-o- 0x20,0xE0,0xC0,0x20, 0x20,0xE0,0xC0,0x00, 0x40,0x7F,0x7F,0x48, 0x08,0x0F,0x07,0x00, //-p- 0xC0,0xE0,0x20,0x20, 0xC0,0xE0,0x20,0x00, 0x07,0x0F,0x08,0x48, 0x7F,0x7F,0x40,0x00, //-q- 0x20,0xE0,0xC0,0x60, 0x20,0xE0,0xC0,0x00, 0x08,0x0F,0x0F,0x08, 0x00,0x00,0x00,0x00, //-r- 0x40,0xE0,0xA0,0x20, 0x20,0x60,0x40,0x00, 0x04,0x0C,0x09,0x09, 0x0B,0x0E,0x04,0x00, //-s- 0x20,0x20,0xF8,0xFC, 0x20,0x20,0x00,0x00, 0x00,0x00,0x07,0x0F, 0x08,0x0C,0x04,0x00, //-t- 0xE0,0xE0,0x00,0x00, 0xE0,0xE0,0x00,0x00, 0x07,0x0F,0x08,0x08, 0x07,0x0F,0x08,0x00, //-u- 0x00,0xE0,0xE0,0x00, 0x00,0xE0,0xE0,0x00, 0x00,0x03,0x07,0x0C, 0x0C,0x07,0x03,0x00, //-v- 0xE0,0xE0,0x00,0x80, 0x00,0xE0,0xE0,0x00, 0x07,0x0F,0x0C,0x07, 0x0C,0x0F,0x07,0x00, //-w- 0x20,0x60,0xC0,0x80, 0xC0,0x60,0x20,0x00, 0x08,0x0C,0x07,0x03, 0x07,0x0C,0x08,0x00, //-x- 0xE0,0xE0,0x00,0x00, 0x00,0xE0,0xE0,0x00, 0x47,0x4F,0x48,0x48, 0x68,0x3F,0x1F,0x00, //-y- 0x60,0x60,0x20,0xA0, 0xE0,0x60,0x20,0x00, 0x0C,0x0E,0x0B,0x09, 0x08,0x0C,0x0C,0x00, //-z- // 0x00,0x40,0x40,0xF8, 0xBC,0x04,0x04,0x00, 0x00,0x00,0x00,0x07, 0x0F,0x08,0x08,0x00, //-{- 0x00,0x00,0x00,0xBC, 0xBC,0x00,0x00,0x00, 0x00,0x00,0x00,0x0F, 0x0F,0x00,0x00,0x00, //-|- 0x00,0x04,0x04,0xBC, 0xF8,0x40,0x40,0x00, 0x00,0x08,0x08,0x0F, 0x07,0x00,0x00,0x00, //-}- 0x08,0x0C,0x04,0x0C, 0x08,0x0C,0x04,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, //-~- ASCII ?:0X7E }; /************************************************************************************************************** //常用ASCII表 //偏移量32 //ASCII字符集: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ //PC2LCD2002取模方式设置:阴码+逐列式+顺向+C51格式 //每个字符所占用的字节数为:(size/8+((size%8)?1:0))*(size/2),其中size:是字库生成时的点阵大小(12/16/24...) ****************************************************************************************************************/ //06*08==宽*高 ASCII字符集点阵 (Terminal Greek8字体) const unsigned char asc2_0608[95][6]={ {0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/ {0x00,0x00,0x60,0xFA,0x60,0x00},/*"!",1*/ {0x00,0xE0,0xC0,0x00,0xE0,0xC0},/*""",2*/ {0x00,0x24,0x7E,0x24,0x7E,0x24},/*"#",3*/ {0x00,0x24,0xD4,0x56,0x48,0x00},/*"$",4*/ {0x00,0xC6,0xC8,0x10,0x26,0xC6},/*"%",5*/ {0x00,0x6C,0x92,0x6A,0x04,0x0A},/*"&",6*/ {0x00,0x00,0xE0,0xC0,0x00,0x00},/*"'",7*/ {0x00,0x00,0x7C,0x82,0x00,0x00},/*"(",8*/ {0x00,0x00,0x82,0x7C,0x00,0x00},/*")",9*/ {0x00,0x10,0x7C,0x38,0x7C,0x10},/*"*",10*/ {0x00,0x10,0x10,0x7C,0x10,0x10},/*"+",11*/ {0x00,0x00,0x07,0x06,0x00,0x00},/*",",12*/ {0x00,0x10,0x10,0x10,0x10,0x10},/*"-",13*/ {0x00,0x00,0x06,0x06,0x00,0x00},/*".",14*/ {0x00,0x04,0x08,0x10,0x20,0x40},/*"/",15*/ {0x00,0x7C,0x8A,0x92,0xA2,0x7C},/*"0",16*/ {0x00,0x00,0x42,0xFE,0x02,0x00},/*"1",17*/ {0x00,0x46,0x8A,0x92,0x92,0x62},/*"2",18*/ {0x00,0x44,0x92,0x92,0x92,0x6C},/*"3",19*/ {0x00,0x18,0x28,0x48,0xFE,0x08},/*"4",20*/ {0x00,0xF4,0x92,0x92,0x92,0x8C},/*"5",21*/ {0x00,0x3C,0x52,0x92,0x92,0x0C},/*"6",22*/ {0x00,0x80,0x8E,0x90,0xA0,0xC0},/*"7",23*/ {0x00,0x6C,0x92,0x92,0x92,0x6C},/*"8",24*/ {0x00,0x60,0x92,0x92,0x94,0x78},/*"9",25*/ {0x00,0x00,0x36,0x36,0x00,0x00},/*":",26*/ {0x00,0x00,0x37,0x36,0x00,0x00},/*";",27*/ {0x00,0x10,0x28,0x44,0x82,0x00},/*"<",28*/ {0x00,0x24,0x24,0x24,0x24,0x24},/*"=",29*/ {0x00,0x00,0x82,0x44,0x28,0x10},/*">",30*/ {0x00,0x40,0x80,0x9A,0x90,0x60},/*"?",31*/ {0x00,0x7C,0x82,0xBA,0xAA,0x78},/*"@",32*/ {0x00,0x7E,0x88,0x88,0x88,0x7E},/*"A",33*/ {0x00,0xFE,0x92,0x92,0x92,0x6C},/*"B",34*/ {0x00,0x7C,0x82,0x82,0x82,0x44},/*"C",35*/ {0x00,0xFE,0x82,0x82,0x82,0x7C},/*"D",36*/ {0x00,0xFE,0x92,0x92,0x92,0x82},/*"E",37*/ {0x00,0xFE,0x90,0x90,0x90,0x80},/*"F",38*/ {0x00,0x7C,0x82,0x92,0x92,0x5E},/*"G",39*/ {0x00,0xFE,0x10,0x10,0x10,0xFE},/*"H",40*/ {0x00,0x00,0x82,0xFE,0x82,0x00},/*"I",41*/ {0x00,0x0C,0x02,0x02,0x02,0xFC},/*"J",42*/ {0x00,0xFE,0x10,0x28,0x44,0x82},/*"K",43*/ {0x00,0xFE,0x02,0x02,0x02,0x02},/*"L",44*/ {0x00,0xFE,0x40,0x20,0x40,0xFE},/*"M",45*/ {0x00,0xFE,0x40,0x20,0x10,0xFE},/*"N",46*/ {0x00,0x7C,0x82,0x82,0x82,0x7C},/*"O",47*/ {0x00,0xFE,0x90,0x90,0x90,0x60},/*"P",48*/ {0x00,0x7C,0x82,0x8A,0x84,0x7A},/*"Q",49*/ {0x00,0xFE,0x90,0x90,0x98,0x66},/*"R",50*/ {0x00,0x64,0x92,0x92,0x92,0x4C},/*"S",51*/ {0x00,0x80,0x80,0xFE,0x80,0x80},/*"T",52*/ {0x00,0xFC,0x02,0x02,0x02,0xFC},/*"U",53*/ {0x00,0xF8,0x04,0x02,0x04,0xF8},/*"V",54*/ {0x00,0xFC,0x02,0x3C,0x02,0xFC},/*"W",55*/ {0x00,0xC6,0x28,0x10,0x28,0xC6},/*"X",56*/ {0x00,0xE0,0x10,0x0E,0x10,0xE0},/*"Y",57*/ {0x00,0x8E,0x92,0xA2,0xC2,0x00},/*"Z",58*/ {0x00,0x00,0xFE,0x82,0x82,0x00},/*"[",59*/ {0x00,0x40,0x20,0x10,0x08,0x04},/*"\",60*/ {0x00,0x00,0x82,0x82,0xFE,0x00},/*"]",61*/ {0x00,0x20,0x40,0x80,0x40,0x20},/*"^",62*/ {0x01,0x01,0x01,0x01,0x01,0x01},/*"_",63*/ {0x00,0x00,0xC0,0xE0,0x00,0x00},/*"`",64*/ {0x00,0x04,0x2A,0x2A,0x2A,0x1E},/*"a",65*/ {0x00,0xFE,0x22,0x22,0x22,0x1C},/*"b",66*/ {0x00,0x1C,0x22,0x22,0x22,0x14},/*"c",67*/ {0x00,0x1C,0x22,0x22,0x22,0xFE},/*"d",68*/ {0x00,0x1C,0x2A,0x2A,0x2A,0x10},/*"e",69*/ {0x00,0x10,0x7E,0x90,0x90,0x00},/*"f",70*/ {0x00,0x18,0x25,0x25,0x25,0x3E},/*"g",71*/ {0x00,0xFE,0x20,0x20,0x1E,0x00},/*"h",72*/ {0x00,0x00,0x00,0xBE,0x02,0x00},/*"i",73*/ {0x00,0x02,0x01,0x21,0xBE,0x00},/*"j",74*/ {0x00,0xFE,0x08,0x14,0x22,0x00},/*"k",75*/ {0x00,0x00,0x00,0xFE,0x02,0x00},/*"l",76*/ {0x00,0x3E,0x20,0x18,0x20,0x1E},/*"m",77*/ {0x00,0x3E,0x20,0x20,0x1E,0x00},/*"n",78*/ {0x00,0x1C,0x22,0x22,0x22,0x1C},/*"o",79*/ {0x00,0x3F,0x22,0x22,0x22,0x1C},/*"p",80*/ {0x00,0x1C,0x22,0x22,0x22,0x3F},/*"q",81*/ {0x00,0x22,0x1E,0x22,0x20,0x10},/*"r",82*/ {0x00,0x10,0x2A,0x2A,0x2A,0x04},/*"s",83*/ {0x00,0x20,0x7C,0x22,0x24,0x00},/*"t",84*/ {0x00,0x3C,0x02,0x04,0x3E,0x00},/*"u",85*/ {0x00,0x38,0x04,0x02,0x04,0x38},/*"v",86*/ {0x00,0x3C,0x06,0x0C,0x06,0x3C},/*"w",87*/ {0x00,0x36,0x08,0x08,0x36,0x00},/*"x",88*/ {0x00,0x39,0x05,0x06,0x3C,0x00},/*"y",89*/ {0x00,0x26,0x2A,0x2A,0x32,0x00},/*"z",90*/ {0x00,0x10,0x7C,0x82,0x82,0x00},/*"{",91*/ {0x00,0x00,0x00,0xEE,0x00,0x00},/*"|",92*/ {0x00,0x00,0x82,0x82,0x7C,0x10},/*"}",93*/ {0x00,0x40,0x80,0x40,0x80,0x00},/*"~",94*/ }; //06*12==宽*高 ASCII字符集点阵 (宋体) const unsigned char asc2_0612[95][12]={ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/ {0x00,0x00,0x00,0x00,0x3F,0x40,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",1*/ {0x00,0x00,0x30,0x00,0x40,0x00,0x30,0x00,0x40,0x00,0x00,0x00},/*""",2*/ {0x09,0x00,0x0B,0xC0,0x3D,0x00,0x0B,0xC0,0x3D,0x00,0x09,0x00},/*"#",3*/ {0x18,0xC0,0x24,0x40,0x7F,0xE0,0x22,0x40,0x31,0x80,0x00,0x00},/*"$",4*/ {0x18,0x00,0x24,0xC0,0x1B,0x00,0x0D,0x80,0x32,0x40,0x01,0x80},/*"%",5*/ {0x03,0x80,0x1C,0x40,0x27,0x40,0x1C,0x80,0x07,0x40,0x00,0x40},/*"&",6*/ {0x10,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x20,0x40,0x40,0x20},/*"(",8*/ {0x00,0x00,0x40,0x20,0x20,0x40,0x1F,0x80,0x00,0x00,0x00,0x00},/*")",9*/ {0x09,0x00,0x06,0x00,0x1F,0x80,0x06,0x00,0x09,0x00,0x00,0x00},/*"*",10*/ {0x04,0x00,0x04,0x00,0x3F,0x80,0x04,0x00,0x04,0x00,0x00,0x00},/*"+",11*/ {0x00,0x10,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*",",12*/ {0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00},/*"-",13*/ {0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*".",14*/ {0x00,0x20,0x01,0xC0,0x06,0x00,0x38,0x00,0x40,0x00,0x00,0x00},/*"/",15*/ {0x1F,0x80,0x20,0x40,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00},/*"0",16*/ {0x00,0x00,0x10,0x40,0x3F,0xC0,0x00,0x40,0x00,0x00,0x00,0x00},/*"1",17*/ {0x18,0xC0,0x21,0x40,0x22,0x40,0x24,0x40,0x18,0x40,0x00,0x00},/*"2",18*/ {0x10,0x80,0x20,0x40,0x24,0x40,0x24,0x40,0x1B,0x80,0x00,0x00},/*"3",19*/ {0x02,0x00,0x0D,0x00,0x11,0x00,0x3F,0xC0,0x01,0x40,0x00,0x00},/*"4",20*/ {0x3C,0x80,0x24,0x40,0x24,0x40,0x24,0x40,0x23,0x80,0x00,0x00},/*"5",21*/ {0x1F,0x80,0x24,0x40,0x24,0x40,0x34,0x40,0x03,0x80,0x00,0x00},/*"6",22*/ {0x30,0x00,0x20,0x00,0x27,0xC0,0x38,0x00,0x20,0x00,0x00,0x00},/*"7",23*/ {0x1B,0x80,0x24,0x40,0x24,0x40,0x24,0x40,0x1B,0x80,0x00,0x00},/*"8",24*/ {0x1C,0x00,0x22,0xC0,0x22,0x40,0x22,0x40,0x1F,0x80,0x00,0x00},/*"9",25*/ {0x00,0x00,0x00,0x00,0x08,0x40,0x00,0x00,0x00,0x00,0x00,0x00},/*":",26*/ {0x00,0x00,0x00,0x00,0x04,0x60,0x00,0x00,0x00,0x00,0x00,0x00},/*";",27*/ {0x00,0x00,0x04,0x00,0x0A,0x00,0x11,0x00,0x20,0x80,0x40,0x40},/*"<",28*/ {0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x09,0x00,0x00,0x00},/*"=",29*/ {0x00,0x00,0x40,0x40,0x20,0x80,0x11,0x00,0x0A,0x00,0x04,0x00},/*">",30*/ {0x18,0x00,0x20,0x00,0x23,0x40,0x24,0x00,0x18,0x00,0x00,0x00},/*"?",31*/ {0x1F,0x80,0x20,0x40,0x27,0x40,0x29,0x40,0x1F,0x40,0x00,0x00},/*"@",32*/ {0x00,0x40,0x07,0xC0,0x39,0x00,0x0F,0x00,0x01,0xC0,0x00,0x40},/*"A",33*/ {0x20,0x40,0x3F,0xC0,0x24,0x40,0x24,0x40,0x1B,0x80,0x00,0x00},/*"B",34*/ {0x1F,0x80,0x20,0x40,0x20,0x40,0x20,0x40,0x30,0x80,0x00,0x00},/*"C",35*/ {0x20,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00},/*"D",36*/ {0x20,0x40,0x3F,0xC0,0x24,0x40,0x2E,0x40,0x30,0xC0,0x00,0x00},/*"E",37*/ {0x20,0x40,0x3F,0xC0,0x24,0x40,0x2E,0x00,0x30,0x00,0x00,0x00},/*"F",38*/ {0x0F,0x00,0x10,0x80,0x20,0x40,0x22,0x40,0x33,0x80,0x02,0x00},/*"G",39*/ {0x20,0x40,0x3F,0xC0,0x04,0x00,0x04,0x00,0x3F,0xC0,0x20,0x40},/*"H",40*/ {0x20,0x40,0x20,0x40,0x3F,0xC0,0x20,0x40,0x20,0x40,0x00,0x00},/*"I",41*/ {0x00,0x60,0x20,0x20,0x20,0x20,0x3F,0xC0,0x20,0x00,0x20,0x00},/*"J",42*/ {0x20,0x40,0x3F,0xC0,0x24,0x40,0x0B,0x00,0x30,0xC0,0x20,0x40},/*"K",43*/ {0x20,0x40,0x3F,0xC0,0x20,0x40,0x00,0x40,0x00,0x40,0x00,0xC0},/*"L",44*/ {0x3F,0xC0,0x3C,0x00,0x03,0xC0,0x3C,0x00,0x3F,0xC0,0x00,0x00},/*"M",45*/ {0x20,0x40,0x3F,0xC0,0x0C,0x40,0x23,0x00,0x3F,0xC0,0x20,0x00},/*"N",46*/ {0x1F,0x80,0x20,0x40,0x20,0x40,0x20,0x40,0x1F,0x80,0x00,0x00},/*"O",47*/ {0x20,0x40,0x3F,0xC0,0x24,0x40,0x24,0x00,0x18,0x00,0x00,0x00},/*"P",48*/ {0x1F,0x80,0x21,0x40,0x21,0x40,0x20,0xE0,0x1F,0xA0,0x00,0x00},/*"Q",49*/ {0x20,0x40,0x3F,0xC0,0x24,0x40,0x26,0x00,0x19,0xC0,0x00,0x40},/*"R",50*/ {0x18,0xC0,0x24,0x40,0x24,0x40,0x22,0x40,0x31,0x80,0x00,0x00},/*"S",51*/ {0x30,0x00,0x20,0x40,0x3F,0xC0,0x20,0x40,0x30,0x00,0x00,0x00},/*"T",52*/ {0x20,0x00,0x3F,0x80,0x00,0x40,0x00,0x40,0x3F,0x80,0x20,0x00},/*"U",53*/ {0x20,0x00,0x3E,0x00,0x01,0xC0,0x07,0x00,0x38,0x00,0x20,0x00},/*"V",54*/ {0x38,0x00,0x07,0xC0,0x3C,0x00,0x07,0xC0,0x38,0x00,0x00,0x00},/*"W",55*/ {0x20,0x40,0x39,0xC0,0x06,0x00,0x39,0xC0,0x20,0x40,0x00,0x00},/*"X",56*/ {0x20,0x00,0x38,0x40,0x07,0xC0,0x38,0x40,0x20,0x00,0x00,0x00},/*"Y",57*/ {0x30,0x40,0x21,0xC0,0x26,0x40,0x38,0x40,0x20,0xC0,0x00,0x00},/*"Z",58*/ {0x00,0x00,0x00,0x00,0x7F,0xE0,0x40,0x20,0x40,0x20,0x00,0x00},/*"[",59*/ {0x00,0x00,0x70,0x00,0x0C,0x00,0x03,0x80,0x00,0x40,0x00,0x00},/*"\",60*/ {0x00,0x00,0x40,0x20,0x40,0x20,0x7F,0xE0,0x00,0x00,0x00,0x00},/*"]",61*/ {0x00,0x00,0x20,0x00,0x40,0x00,0x20,0x00,0x00,0x00,0x00,0x00},/*"^",62*/ {0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10},/*"_",63*/ {0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/ {0x00,0x00,0x02,0x80,0x05,0x40,0x05,0x40,0x03,0xC0,0x00,0x40},/*"a",65*/ {0x20,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x03,0x80,0x00,0x00},/*"b",66*/ {0x00,0x00,0x03,0x80,0x04,0x40,0x04,0x40,0x06,0x40,0x00,0x00},/*"c",67*/ {0x00,0x00,0x03,0x80,0x04,0x40,0x24,0x40,0x3F,0xC0,0x00,0x40},/*"d",68*/ {0x00,0x00,0x03,0x80,0x05,0x40,0x05,0x40,0x03,0x40,0x00,0x00},/*"e",69*/ {0x00,0x00,0x04,0x40,0x1F,0xC0,0x24,0x40,0x24,0x40,0x20,0x00},/*"f",70*/ {0x00,0x00,0x02,0xE0,0x05,0x50,0x05,0x50,0x06,0x50,0x04,0x20},/*"g",71*/ {0x20,0x40,0x3F,0xC0,0x04,0x40,0x04,0x00,0x03,0xC0,0x00,0x40},/*"h",72*/ {0x00,0x00,0x04,0x40,0x27,0xC0,0x00,0x40,0x00,0x00,0x00,0x00},/*"i",73*/ {0x00,0x10,0x00,0x10,0x04,0x10,0x27,0xE0,0x00,0x00,0x00,0x00},/*"j",74*/ {0x20,0x40,0x3F,0xC0,0x01,0x40,0x07,0x00,0x04,0xC0,0x04,0x40},/*"k",75*/ {0x20,0x40,0x20,0x40,0x3F,0xC0,0x00,0x40,0x00,0x40,0x00,0x00},/*"l",76*/ {0x07,0xC0,0x04,0x00,0x07,0xC0,0x04,0x00,0x03,0xC0,0x00,0x00},/*"m",77*/ {0x04,0x40,0x07,0xC0,0x04,0x40,0x04,0x00,0x03,0xC0,0x00,0x40},/*"n",78*/ {0x00,0x00,0x03,0x80,0x04,0x40,0x04,0x40,0x03,0x80,0x00,0x00},/*"o",79*/ {0x04,0x10,0x07,0xF0,0x04,0x50,0x04,0x40,0x03,0x80,0x00,0x00},/*"p",80*/ {0x00,0x00,0x03,0x80,0x04,0x40,0x04,0x50,0x07,0xF0,0x00,0x10},/*"q",81*/ {0x04,0x40,0x07,0xC0,0x02,0x40,0x04,0x00,0x04,0x00,0x00,0x00},/*"r",82*/ {0x00,0x00,0x06,0x40,0x05,0x40,0x05,0x40,0x04,0xC0,0x00,0x00},/*"s",83*/ {0x00,0x00,0x04,0x00,0x1F,0x80,0x04,0x40,0x00,0x40,0x00,0x00},/*"t",84*/ {0x04,0x00,0x07,0x80,0x00,0x40,0x04,0x40,0x07,0xC0,0x00,0x40},/*"u",85*/ {0x04,0x00,0x07,0x00,0x04,0xC0,0x01,0x80,0x06,0x00,0x04,0x00},/*"v",86*/ {0x06,0x00,0x01,0xC0,0x07,0x00,0x01,0xC0,0x06,0x00,0x00,0x00},/*"w",87*/ {0x04,0x40,0x06,0xC0,0x01,0x00,0x06,0xC0,0x04,0x40,0x00,0x00},/*"x",88*/ {0x04,0x10,0x07,0x10,0x04,0xE0,0x01,0x80,0x06,0x00,0x04,0x00},/*"y",89*/ {0x00,0x00,0x04,0x40,0x05,0xC0,0x06,0x40,0x04,0x40,0x00,0x00},/*"z",90*/ {0x00,0x00,0x00,0x00,0x04,0x00,0x7B,0xE0,0x40,0x20,0x00,0x00},/*"{",91*/ {0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0,0x00,0x00,0x00,0x00},/*"|",92*/ {0x00,0x00,0x40,0x20,0x7B,0xE0,0x04,0x00,0x00,0x00,0x00,0x00},/*"}",93*/ {0x40,0x00,0x80,0x00,0x40,0x00,0x20,0x00,0x20,0x00,0x40,0x00},/*"~",94*/ }; //12*24==宽*高 ASCII字符集点阵 (宋体) const unsigned char asc2_1224[95][36]={ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x38, 0x0F,0xFE,0x38,0x0F,0x80,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"!",1*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x06,0x00,0x00,0x0C,0x00,0x00,0x38,0x00,0x00, 0x31,0x00,0x00,0x06,0x00,0x00,0x0C,0x00,0x00,0x38,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,/*""",2*/ 0x00,0x00,0x00,0x00,0x61,0x80,0x00,0x67,0xF8,0x07,0xF9,0x80,0x00,0x61,0x80,0x00,0x61,0x80, 0x00,0x61,0x80,0x00,0x61,0x80,0x00,0x67,0xF8,0x07,0xF9,0x80,0x00,0x61,0x80,0x00,0x00,0x00,/*"#",3*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xC0,0xE0,0x03,0xE0,0xF0,0x06,0x30,0x08,0x04,0x18,0x08, 0x1F,0xFF,0xFE,0x04,0x0E,0x08,0x07,0x87,0xF0,0x03,0x81,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,/*"$",4*/ 0x01,0xF0,0x00,0x06,0x0C,0x00,0x04,0x04,0x08,0x06,0x0C,0x70,0x01,0xF9,0xC0,0x00,0x0E,0x00, 0x00,0x3B,0xE0,0x00,0xEC,0x18,0x07,0x08,0x08,0x04,0x0C,0x18,0x00,0x03,0xE0,0x00,0x00,0x00,/*"%",5*/ 0x00,0x01,0xE0,0x00,0x07,0xF0,0x03,0xF8,0x18,0x04,0x1C,0x08,0x04,0x17,0x08,0x07,0xE1,0xD0, 0x03,0xC0,0xE0,0x00,0x23,0xB0,0x00,0x3C,0x08,0x00,0x20,0x08,0x00,0x00,0x10,0x00,0x00,0x00,/*"&",6*/ 0x00,0x00,0x00,0x01,0x00,0x00,0x31,0x00,0x00,0x32,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"'",7*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00, 0x01,0xFF,0xC0,0x07,0x80,0xF0,0x0C,0x00,0x18,0x10,0x00,0x04,0x20,0x00,0x02,0x00,0x00,0x00,/*"(",8*/ 0x00,0x00,0x00,0x20,0x00,0x02,0x10,0x00,0x04,0x0C,0x00,0x18,0x07,0x80,0xF0,0x01,0xFF,0xC0, 0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*")",9*/ 0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x66,0x00,0x00,0x66,0x00,0x00,0x3C,0x00,0x00,0x18,0x00, 0x03,0xFF,0xC0,0x00,0x18,0x00,0x00,0x3C,0x00,0x00,0x66,0x00,0x00,0x66,0x00,0x00,0x42,0x00,/*"*",10*/ 0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00, 0x01,0xFF,0xC0,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,/*"+",11*/ 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x31,0x00,0x00,0x32,0x00,0x00,0x1C,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*",",12*/ 0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00, 0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x00,0x00,/*"-",13*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*".",14*/ 0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x1C,0x00,0x00,0x70,0x00,0x01,0x80,0x00,0x0E,0x00, 0x00,0x38,0x00,0x00,0xC0,0x00,0x07,0x00,0x00,0x1C,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,/*"/",15*/ 0x00,0x00,0x00,0x00,0x7F,0x80,0x01,0xFF,0xE0,0x03,0x80,0x70,0x06,0x00,0x18,0x04,0x00,0x08, 0x04,0x00,0x08,0x06,0x00,0x18,0x03,0x80,0x70,0x01,0xFF,0xE0,0x00,0x7F,0x80,0x00,0x00,0x00,/*"0",16*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x08,0x01,0x00,0x08,0x01,0x00,0x08,0x03,0xFF,0xF8, 0x07,0xFF,0xF8,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,/*"1",17*/ 0x00,0x00,0x00,0x01,0xC0,0x38,0x02,0xC0,0x58,0x04,0x00,0x98,0x04,0x01,0x18,0x04,0x02,0x18, 0x04,0x04,0x18,0x06,0x1C,0x18,0x03,0xF8,0x18,0x01,0xE0,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,/*"2",18*/ 0x00,0x00,0x00,0x01,0xC0,0xE0,0x03,0xC0,0xF0,0x04,0x00,0x08,0x04,0x08,0x08,0x04,0x08,0x08, 0x06,0x18,0x08,0x03,0xF4,0x18,0x01,0xE7,0xF0,0x00,0x01,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,/*"3",19*/ 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x0D,0x00,0x00,0x11,0x00,0x00,0x61,0x00,0x00,0x81,0x08, 0x03,0x01,0x08,0x07,0xFF,0xF8,0x0F,0xFF,0xF8,0x00,0x01,0x08,0x00,0x01,0x08,0x00,0x00,0x00,/*"4",20*/ 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0xFC,0xD0,0x06,0x08,0x08,0x06,0x10,0x08,0x06,0x10,0x08, 0x06,0x10,0x08,0x06,0x18,0x38,0x06,0x0F,0xF0,0x06,0x07,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,/*"5",21*/ 0x00,0x00,0x00,0x00,0x3F,0x80,0x01,0xFF,0xE0,0x03,0x84,0x30,0x02,0x08,0x18,0x04,0x10,0x08, 0x04,0x10,0x08,0x04,0x10,0x08,0x07,0x18,0x10,0x03,0x0F,0xF0,0x00,0x07,0xC0,0x00,0x00,0x00,/*"6",22*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x07,0x00,0x00,0x06,0x00,0x00,0x06,0x00,0xF8, 0x06,0x07,0xF8,0x06,0x18,0x00,0x06,0xE0,0x00,0x07,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,/*"7",23*/ 0x00,0x00,0x00,0x01,0xE1,0xE0,0x03,0xF7,0xF0,0x06,0x34,0x10,0x04,0x18,0x08,0x04,0x18,0x08, 0x04,0x0C,0x08,0x04,0x0C,0x08,0x06,0x16,0x18,0x03,0xF3,0xF0,0x01,0xC1,0xE0,0x00,0x00,0x00,/*"8",24*/ 0x00,0x00,0x00,0x00,0xF8,0x00,0x03,0xFC,0x30,0x03,0x06,0x38,0x04,0x02,0x08,0x04,0x02,0x08, 0x04,0x02,0x08,0x04,0x04,0x10,0x03,0x08,0xF0,0x01,0xFF,0xC0,0x00,0x7F,0x00,0x00,0x00,0x00,/*"9",25*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x38, 0x00,0x70,0x38,0x00,0x70,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*":",26*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x1A, 0x00,0x30,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*";",27*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x14,0x00,0x00,0x22,0x00,0x00,0x41,0x00, 0x00,0x80,0x80,0x01,0x00,0x40,0x02,0x00,0x20,0x04,0x00,0x10,0x08,0x00,0x08,0x00,0x00,0x00,/*"<",28*/ 0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x21,0x00,0x00,0x21,0x00,0x00,0x21,0x00,0x00,0x21,0x00, 0x00,0x21,0x00,0x00,0x21,0x00,0x00,0x21,0x00,0x00,0x21,0x00,0x00,0x21,0x00,0x00,0x00,0x00,/*"=",29*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x04,0x00,0x10,0x02,0x00,0x20,0x01,0x00,0x40, 0x00,0x80,0x80,0x00,0x41,0x00,0x00,0x22,0x00,0x00,0x14,0x00,0x00,0x08,0x00,0x00,0x00,0x00,/*">",30*/ 0x00,0x00,0x00,0x03,0xC0,0x00,0x04,0xC0,0x00,0x04,0x00,0x00,0x08,0x00,0x38,0x08,0x0F,0x38, 0x08,0x08,0x38,0x08,0x10,0x00,0x0C,0x30,0x00,0x07,0xE0,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,/*"?",31*/ 0x00,0x00,0x00,0x00,0x3F,0x80,0x00,0xFF,0xE0,0x03,0x80,0x70,0x02,0x0F,0x10,0x06,0x70,0x88, 0x04,0xC0,0x88,0x04,0x83,0x08,0x04,0x7F,0x88,0x02,0xC0,0x90,0x03,0x01,0x20,0x00,0xFE,0x40,/*"@",32*/ 0x00,0x00,0x08,0x00,0x00,0x18,0x00,0x01,0xF8,0x00,0x3E,0x08,0x01,0xC2,0x00,0x07,0x02,0x00, 0x07,0xE2,0x00,0x00,0xFE,0x00,0x00,0x1F,0xC8,0x00,0x01,0xF8,0x00,0x00,0x38,0x00,0x00,0x08,/*"A",33*/ 0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x08,0x08,0x04,0x08,0x08,0x04,0x08,0x08, 0x04,0x08,0x08,0x06,0x18,0x08,0x03,0xF4,0x18,0x01,0xE7,0xF0,0x00,0x01,0xE0,0x00,0x00,0x00,/*"B",34*/ 0x00,0x00,0x00,0x00,0x3F,0x80,0x01,0xFF,0xE0,0x03,0x80,0x70,0x02,0x00,0x18,0x04,0x00,0x08, 0x04,0x00,0x08,0x04,0x00,0x08,0x04,0x00,0x10,0x06,0x00,0x20,0x07,0x80,0xC0,0x00,0x00,0x00,/*"C",35*/ 0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x00,0x08,0x04,0x00,0x08,0x04,0x00,0x08, 0x04,0x00,0x18,0x02,0x00,0x10,0x03,0x80,0x70,0x01,0xFF,0xE0,0x00,0x7F,0x80,0x00,0x00,0x00,/*"D",36*/ 0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x08,0x08,0x04,0x08,0x08,0x04,0x08,0x08, 0x04,0x08,0x08,0x04,0x3E,0x08,0x04,0x00,0x08,0x06,0x00,0x18,0x01,0x00,0x60,0x00,0x00,0x00,/*"E",37*/ 0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x08,0x08,0x04,0x08,0x00,0x04,0x08,0x00, 0x04,0x08,0x00,0x04,0x3E,0x00,0x06,0x00,0x00,0x06,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x00,/*"F",38*/ 0x00,0x00,0x00,0x00,0x3F,0x80,0x01,0xFF,0xE0,0x03,0x80,0x70,0x06,0x00,0x18,0x04,0x00,0x08, 0x04,0x02,0x08,0x04,0x02,0x08,0x02,0x03,0xF0,0x07,0x83,0xF0,0x00,0x02,0x00,0x00,0x02,0x00,/*"G",39*/ 0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x08,0x08,0x00,0x08,0x00,0x00,0x08,0x00, 0x00,0x08,0x00,0x00,0x08,0x00,0x04,0x08,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x00,0x08,/*"H",40*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x04,0x00,0x08,0x04,0x00,0x08,0x07,0xFF,0xF8, 0x07,0xFF,0xF8,0x04,0x00,0x08,0x04,0x00,0x08,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,/*"I",41*/ 0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x07,0x00,0x00,0x01,0x04,0x00,0x01,0x04,0x00,0x01, 0x04,0x00,0x03,0x07,0xFF,0xFE,0x07,0xFF,0xFC,0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,/*"J",42*/ 0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x0C,0x08,0x00,0x18,0x00,0x00,0x3E,0x00, 0x04,0xC7,0x80,0x05,0x03,0xC8,0x06,0x00,0xF8,0x04,0x00,0x38,0x04,0x00,0x18,0x00,0x00,0x08,/*"K",43*/ 0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08, 0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x18,0x00,0x00,0x60,0x00,0x00,0x00,/*"L",44*/ 0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0x80,0x08,0x07,0xFC,0x00,0x00,0x7F,0xC0,0x00,0x03,0xF8, 0x00,0x07,0xC0,0x00,0x78,0x00,0x07,0x80,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x00,0x08,/*"M",45*/ 0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0x00,0x08,0x03,0xC0,0x00,0x00,0xE0,0x00,0x00,0x38,0x00, 0x00,0x1E,0x00,0x00,0x07,0x00,0x00,0x01,0xC0,0x04,0x00,0xF0,0x07,0xFF,0xF8,0x04,0x00,0x00,/*"N",46*/ 0x00,0x00,0x00,0x00,0x7F,0x80,0x01,0xFF,0xE0,0x03,0x80,0x70,0x06,0x00,0x18,0x04,0x00,0x08, 0x04,0x00,0x08,0x06,0x00,0x18,0x03,0x00,0x30,0x01,0xFF,0xE0,0x00,0x7F,0x80,0x00,0x00,0x00,/*"O",47*/ 0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x04,0x08,0x04,0x04,0x00,0x04,0x04,0x00, 0x04,0x04,0x00,0x04,0x04,0x00,0x06,0x0C,0x00,0x03,0xF8,0x00,0x01,0xF0,0x00,0x00,0x00,0x00,/*"P",48*/ 0x00,0x00,0x00,0x00,0x7F,0x80,0x01,0xFF,0xE0,0x03,0x80,0x70,0x06,0x00,0x88,0x04,0x00,0x88, 0x04,0x00,0xC8,0x06,0x00,0x3C,0x03,0x00,0x3E,0x01,0xFF,0xE6,0x00,0x7F,0x84,0x00,0x00,0x00,/*"Q",49*/ 0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x08,0x08,0x04,0x08,0x00,0x04,0x0C,0x00, 0x04,0x0F,0x00,0x04,0x0B,0xC0,0x06,0x10,0xF0,0x03,0xF0,0x38,0x01,0xE0,0x08,0x00,0x00,0x08,/*"R",50*/ 0x00,0x00,0x00,0x01,0xE0,0xF8,0x03,0xF0,0x30,0x06,0x30,0x10,0x04,0x18,0x08,0x04,0x18,0x08, 0x04,0x0C,0x08,0x04,0x0C,0x08,0x02,0x06,0x18,0x02,0x07,0xF0,0x07,0x81,0xE0,0x00,0x00,0x00,/*"S",51*/ 0x01,0x80,0x00,0x06,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x08,0x07,0xFF,0xF8, 0x07,0xFF,0xF8,0x04,0x00,0x08,0x04,0x00,0x00,0x04,0x00,0x00,0x06,0x00,0x00,0x01,0x80,0x00,/*"T",52*/ 0x04,0x00,0x00,0x07,0xFF,0xE0,0x07,0xFF,0xF0,0x04,0x00,0x18,0x00,0x00,0x08,0x00,0x00,0x08, 0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x04,0x00,0x10,0x07,0xFF,0xE0,0x04,0x00,0x00,/*"U",53*/ 0x04,0x00,0x00,0x06,0x00,0x00,0x07,0xE0,0x00,0x07,0xFE,0x00,0x04,0x1F,0xE0,0x00,0x01,0xF8, 0x00,0x00,0x38,0x00,0x01,0xE0,0x04,0x3E,0x00,0x07,0xC0,0x00,0x06,0x00,0x00,0x04,0x00,0x00,/*"V",54*/ 0x04,0x00,0x00,0x07,0xE0,0x00,0x07,0xFF,0xC0,0x04,0x1F,0xF8,0x00,0x07,0xC0,0x07,0xF8,0x00, 0x07,0xFF,0x80,0x04,0x3F,0xF8,0x00,0x07,0xC0,0x04,0xF8,0x00,0x07,0x00,0x00,0x04,0x00,0x00,/*"W",55*/ 0x00,0x00,0x00,0x04,0x00,0x08,0x06,0x00,0x18,0x07,0xC0,0x78,0x05,0xF1,0xC8,0x00,0x3E,0x00, 0x00,0x1F,0x80,0x04,0x63,0xE8,0x07,0x80,0xF8,0x06,0x00,0x18,0x04,0x00,0x08,0x00,0x00,0x00,/*"X",56*/ 0x04,0x00,0x00,0x06,0x00,0x00,0x07,0x80,0x00,0x07,0xE0,0x08,0x04,0x7C,0x08,0x00,0x1F,0xF8, 0x00,0x07,0xF8,0x00,0x18,0x08,0x04,0xE0,0x08,0x07,0x00,0x00,0x06,0x00,0x00,0x04,0x00,0x00,/*"Y",57*/ 0x00,0x00,0x00,0x01,0x00,0x08,0x06,0x00,0x38,0x04,0x00,0xF8,0x04,0x03,0xE8,0x04,0x0F,0x08, 0x04,0x7C,0x08,0x05,0xF0,0x08,0x07,0xC0,0x08,0x07,0x00,0x18,0x04,0x00,0x60,0x00,0x00,0x00,/*"Z",58*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFE, 0x20,0x00,0x02,0x20,0x00,0x02,0x20,0x00,0x02,0x20,0x00,0x02,0x20,0x00,0x02,0x00,0x00,0x00,/*"[",59*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x07,0x00,0x00,0x00,0xC0,0x00,0x00,0x38,0x00, 0x00,0x06,0x00,0x00,0x01,0xC0,0x00,0x00,0x30,0x00,0x00,0x0E,0x00,0x00,0x01,0x00,0x00,0x00,/*"\",60*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x02,0x20,0x00,0x02,0x20,0x00,0x02,0x20,0x00,0x02, 0x20,0x00,0x02,0x3F,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"]",61*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x10,0x00,0x00,0x30,0x00,0x00, 0x20,0x00,0x00,0x30,0x00,0x00,0x10,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"^",62*/ 0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01, 0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,/*"_",63*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x10,0x00,0x00, 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"`",64*/ 0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x19,0xF8,0x00,0x1B,0x18,0x00,0x22,0x08,0x00,0x26,0x08, 0x00,0x24,0x08,0x00,0x24,0x10,0x00,0x3F,0xF8,0x00,0x1F,0xF8,0x00,0x00,0x08,0x00,0x00,0x18,/*"a",65*/ 0x00,0x00,0x00,0x04,0x00,0x00,0x07,0xFF,0xF8,0x0F,0xFF,0xF0,0x00,0x18,0x18,0x00,0x10,0x08, 0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x30,0x18,0x00,0x1F,0xF0,0x00,0x0F,0xC0,0x00,0x00,0x00,/*"b",66*/ 0x00,0x00,0x00,0x00,0x07,0xC0,0x00,0x1F,0xF0,0x00,0x18,0x30,0x00,0x20,0x08,0x00,0x20,0x08, 0x00,0x20,0x08,0x00,0x3C,0x08,0x00,0x1C,0x10,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,/*"c",67*/ 0x00,0x00,0x00,0x00,0x07,0xC0,0x00,0x1F,0xF0,0x00,0x38,0x18,0x00,0x20,0x08,0x00,0x20,0x08, 0x00,0x20,0x08,0x04,0x10,0x10,0x07,0xFF,0xF8,0x0F,0xFF,0xF0,0x00,0x00,0x10,0x00,0x00,0x00,/*"d",68*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xC0,0x00,0x1F,0xF0,0x00,0x12,0x30,0x00,0x22,0x18, 0x00,0x22,0x08,0x00,0x22,0x08,0x00,0x32,0x08,0x00,0x1E,0x10,0x00,0x0E,0x20,0x00,0x00,0x00,/*"e",69*/ 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x08,0x00,0x20,0x08,0x01,0xFF,0xF8,0x03,0xFF,0xF8, 0x06,0x20,0x08,0x04,0x20,0x08,0x04,0x20,0x08,0x07,0x20,0x00,0x03,0x00,0x00,0x00,0x00,0x00,/*"f",70*/ 0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x0E,0x6E,0x00,0x1F,0xF3,0x00,0x31,0xB1,0x00,0x20,0xB1, 0x00,0x20,0xB1,0x00,0x31,0x91,0x00,0x1F,0x13,0x00,0x2E,0x1E,0x00,0x20,0x0E,0x00,0x30,0x00,/*"g",71*/ 0x00,0x00,0x00,0x04,0x00,0x08,0x07,0xFF,0xF8,0x0F,0xFF,0xF8,0x00,0x10,0x08,0x00,0x20,0x00, 0x00,0x20,0x00,0x00,0x20,0x08,0x00,0x3F,0xF8,0x00,0x1F,0xF8,0x00,0x00,0x08,0x00,0x00,0x00,/*"h",72*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x20,0x08,0x06,0x3F,0xF8, 0x06,0x3F,0xF8,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,/*"i",73*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x03,0x00,0x20,0x01,0x00,0x20,0x01, 0x00,0x20,0x03,0x06,0x3F,0xFE,0x06,0x3F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"j",74*/ 0x00,0x00,0x00,0x04,0x00,0x08,0x07,0xFF,0xF8,0x0F,0xFF,0xF8,0x00,0x01,0x88,0x00,0x03,0x00, 0x00,0x2F,0xC0,0x00,0x38,0xF8,0x00,0x20,0x38,0x00,0x20,0x08,0x00,0x00,0x08,0x00,0x00,0x00,/*"k",75*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x04,0x00,0x08,0x04,0x00,0x08,0x07,0xFF,0xF8, 0x0F,0xFF,0xF8,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,/*"l",76*/ 0x00,0x20,0x08,0x00,0x3F,0xF8,0x00,0x3F,0xF8,0x00,0x10,0x08,0x00,0x20,0x00,0x00,0x3F,0xF8, 0x00,0x3F,0xF8,0x00,0x10,0x08,0x00,0x20,0x00,0x00,0x3F,0xF8,0x00,0x3F,0xF8,0x00,0x00,0x08,/*"m",77*/ 0x00,0x00,0x00,0x00,0x20,0x08,0x00,0x3F,0xF8,0x00,0x3F,0xF8,0x00,0x10,0x08,0x00,0x10,0x00, 0x00,0x20,0x00,0x00,0x20,0x08,0x00,0x3F,0xF8,0x00,0x1F,0xF8,0x00,0x00,0x08,0x00,0x00,0x00,/*"n",78*/ 0x00,0x00,0x00,0x00,0x07,0xC0,0x00,0x0F,0xF0,0x00,0x18,0x30,0x00,0x30,0x08,0x00,0x20,0x08, 0x00,0x20,0x08,0x00,0x30,0x08,0x00,0x18,0x30,0x00,0x0F,0xF0,0x00,0x07,0xC0,0x00,0x00,0x00,/*"o",79*/ 0x00,0x00,0x00,0x00,0x20,0x01,0x00,0x3F,0xFF,0x00,0x3F,0xFF,0x00,0x10,0x11,0x00,0x20,0x09, 0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x30,0x38,0x00,0x1F,0xF0,0x00,0x0F,0xC0,0x00,0x00,0x00,/*"p",80*/ 0x00,0x00,0x00,0x00,0x07,0xC0,0x00,0x1F,0xF0,0x00,0x38,0x18,0x00,0x20,0x08,0x00,0x20,0x08, 0x00,0x20,0x09,0x00,0x10,0x11,0x00,0x1F,0xFF,0x00,0x3F,0xFF,0x00,0x00,0x01,0x00,0x00,0x00,/*"q",81*/ 0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x3F,0xF8,0x00,0x3F,0xF8,0x00,0x08,0x08, 0x00,0x10,0x08,0x00,0x20,0x08,0x00,0x20,0x00,0x00,0x30,0x00,0x00,0x30,0x00,0x00,0x00,0x00,/*"r",82*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x78,0x00,0x1E,0x18,0x00,0x33,0x08,0x00,0x23,0x08, 0x00,0x21,0x08,0x00,0x21,0x88,0x00,0x21,0x98,0x00,0x30,0xF0,0x00,0x38,0x60,0x00,0x00,0x00,/*"s",83*/ 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0xFF,0xF0,0x03,0xFF,0xF8, 0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,/*"t",84*/ 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x3F,0xF0,0x00,0x7F,0xF8,0x00,0x00,0x18,0x00,0x00,0x08, 0x00,0x00,0x08,0x00,0x20,0x10,0x00,0x3F,0xF8,0x00,0x7F,0xF0,0x00,0x00,0x10,0x00,0x00,0x00,/*"u",85*/ 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x30,0x00,0x00,0x3C,0x00,0x00,0x3F,0x80,0x00,0x23,0xF0, 0x00,0x00,0x78,0x00,0x00,0x70,0x00,0x23,0x80,0x00,0x3C,0x00,0x00,0x30,0x00,0x00,0x20,0x00,/*"v",86*/ 0x00,0x20,0x00,0x00,0x3C,0x00,0x00,0x3F,0xE0,0x00,0x23,0xF8,0x00,0x00,0xE0,0x00,0x27,0x00, 0x00,0x3E,0x00,0x00,0x3F,0xE0,0x00,0x21,0xF8,0x00,0x01,0xE0,0x00,0x3E,0x00,0x00,0x20,0x00,/*"w",87*/ 0x00,0x00,0x00,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x38,0x38,0x00,0x3E,0x68,0x00,0x27,0x80, 0x00,0x03,0xC8,0x00,0x2C,0xF8,0x00,0x38,0x38,0x00,0x20,0x18,0x00,0x20,0x08,0x00,0x00,0x00,/*"x",88*/ 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x30,0x03,0x00,0x3C,0x01,0x00,0x3F,0x83,0x00,0x23,0xEC, 0x00,0x00,0x70,0x00,0x23,0x80,0x00,0x3C,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x00,0x00,/*"y",89*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x08,0x00,0x20,0x38,0x00,0x20,0xF8,0x00,0x23,0xE8, 0x00,0x2F,0x88,0x00,0x3E,0x08,0x00,0x38,0x08,0x00,0x20,0x18,0x00,0x00,0x70,0x00,0x00,0x00,/*"z",90*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00, 0x00,0x14,0x00,0x1F,0xF7,0xFC,0x30,0x00,0x06,0x20,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,/*"{",91*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"|",92*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x02,0x30,0x00,0x06,0x1F,0xF7,0xFC,0x00,0x14,0x00, 0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"}",93*/ 0x00,0x00,0x00,0x18,0x00,0x00,0x60,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0x00, 0x10,0x00,0x00,0x08,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x0C,0x00,0x00,0x10,0x00,0x00,/*"~",94*/ };   3.4、main.c #include "main.h" int main(void) { uint8_t i; CLOCK_EnableClock(kCLOCK_Gpio0); BOARD_InitDEBUG_UARTPins(); BOARD_PowerMode_OD(); BOARD_InitBootClocks(); BOARD_InitDebugConsole(); init_utick(); SysTick_Init(); init_led(); init_key(); init_lcd_jlx12864g(); lcd_showString(0,0, (uint8_t*)"MCXN947_BOARD_TEST",6,12); lcd_showString(0,13,(uint8_t*)"JLX12864G-SPI",6,12); lcd_showString(0,26,(uint8_t*)"2024/12/14",6,12); lcd_refreshGram(); while (1) { SysTick_Delay_ms(500); led_red_tog(); //lcd_clear(); lcd_showString(0,39,(uint8_t*)"MCXN947_BOARD [OK]",6,12); lcd_refreshGram(); SysTick_Delay_ms(500); //lcd_clear(); lcd_showString(0,39,(uint8_t*)"TTTTTTTTTTTTT [OK]",6,12); lcd_refreshGram(); } }   3.5、main.h #ifndef _MAIN_H_ #define _MAIN_H_ #include "pin_mux.h" #include "clock_config.h" #include "board.h" #include "fsl_debug_console.h" #include "fsl_gpio.h" #include "fsl_port.h" #include "fsl_lpi2c.h" #include "fsl_common.h" #include "fsl_lpspi.h" #include "fsl_lpspi_edma.h" #include "fsl_utick.h" #include "led/led.h" #include "systick/systick.h" #include "key/key.h" #include "fsl_p3t1755.h" #include "fsl_i3c.h" #include "utick/utick.h" #include "lcd/jlx12864g.h" #endif   四、运行结果   下载程序后,显示屏显示 [localvideo]ec5f286ce86c0e88e7d9465d74c14699[/localvideo]    

  • 2024-12-12
  • 回复了主题帖: 【英飞凌PSOC™ 4100S Max】⑤SPI点亮TFT LCD屏幕

    模拟SPI刷新速度有点慢,硬件SPI方式会好些。

  • 发表了主题帖: 【FRDM-MCXN947】 移植FreeRTOS

    本帖最后由 TL-LED 于 2024-12-12 21:54 编辑 移植FreeRTOS到开发板   一、FreeRTOS源码下载   源码下载地址:https://github.com/FreeRTOS/FreeRTOS     二、添加源码到工程   2.1、将下载的源码复制到项目工程的middleware目录下   2.2、添加文件到工程       2.3、添加头文件路径   三、程序代码   3.1、FreeRTOSConfig.h /* * FreeRTOS V202212.01 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in * the Software without restriction, including without limitation the rights to * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * https://www.FreeRTOS.org * https://github.com/FreeRTOS * */ #ifndef FREERTOS_CONFIG_H #define FREERTOS_CONFIG_H /*----------------------------------------------------------- * Application specific definitions. * * These definitions should be adjusted for your particular hardware and * application requirements. * * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. * * See http://www.freertos.org/a00110.html. *----------------------------------------------------------*/ /* Ensure definitions are only used by the compiler, and not by the assembler. */ #if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__) #include <stdint.h> extern uint32_t SystemCoreClock; #endif #ifndef configENABLE_FPU #define configENABLE_FPU 1 #endif #ifndef configENABLE_MPU #define configENABLE_MPU 0 #endif #ifndef configENABLE_TRUSTZONE #define configENABLE_TRUSTZONE 0 #endif #ifndef configRUN_FREERTOS_SECURE_ONLY #define configRUN_FREERTOS_SECURE_ONLY 1 #endif #define configUSE_PREEMPTION 1 #define configSUPPORT_STATIC_ALLOCATION 0//1 #define configSUPPORT_DYNAMIC_ALLOCATION 1 #define configUSE_IDLE_HOOK 0 #define configUSE_TICK_HOOK 0 #define configCPU_CLOCK_HZ ( SystemCoreClock ) #define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) #define configMAX_PRIORITIES ( 56 ) #define configMINIMAL_STACK_SIZE ( ( uint16_t ) 512 ) #define configTOTAL_HEAP_SIZE ( ( size_t ) 15 * 1024 ) #define configMAX_TASK_NAME_LEN ( 16 ) #define configUSE_TRACE_FACILITY 1 #define configUSE_16_BIT_TICKS 0 #define configUSE_MUTEXES 1 #define configQUEUE_REGISTRY_SIZE 8 #define configUSE_RECURSIVE_MUTEXES 1 #define configUSE_COUNTING_SEMAPHORES 1 #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 #define configUSE_MALLOC_FAILED_HOOK 0//1 #define configCHECK_FOR_STACK_OVERFLOW 0//2 /* Defaults to size_t for backward compatibility, but can be changed * if lengths will always be less than the number of bytes in a size_t. */ #define configMESSAGE_BUFFER_LENGTH_TYPE size_t /* USER CODE END MESSAGE_BUFFER_LENGTH_TYPE */ /* Software timer definitions. */ #define configUSE_TIMERS 1 #define configTIMER_TASK_PRIORITY ( 2 ) #define configTIMER_QUEUE_LENGTH 10 #define configTIMER_TASK_STACK_DEPTH 256 /* Set the following definitions to 1 to include the API function, or zero * to exclude the API function. */ #define INCLUDE_vTaskPrioritySet 1 #define INCLUDE_uxTaskPriorityGet 1 #define INCLUDE_vTaskDelete 1 #define INCLUDE_vTaskCleanUpResources 0 #define INCLUDE_vTaskSuspend 1 #define INCLUDE_vTaskDelayUntil 1 #define INCLUDE_vTaskDelay 1 #define INCLUDE_xTaskGetSchedulerState 1 #define INCLUDE_xTimerPendFunctionCall 1 #define INCLUDE_xQueueGetMutexHolder 1 #define INCLUDE_uxTaskGetStackHighWaterMark 1 #define INCLUDE_eTaskGetState 1 /* Cortex-M specific definitions. */ #ifdef __NVIC_PRIO_BITS /* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */ #define configPRIO_BITS __NVIC_PRIO_BITS #else #define configPRIO_BITS 4 #endif /* The lowest interrupt priority that can be used in a call to a "set priority" * function. */ #define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15 /* The highest interrupt priority that can be used by any interrupt service * routine that makes calls to interrupt safe FreeRTOS API functions. DO NOT * CALL INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A * HIGHER PRIORITY THAN THIS! (higher priorities are lower numeric values. */ #define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5 /* Interrupt priorities used by the kernel port layer itself. These are generic * to all Cortex-M ports, and do not rely on any particular library functions. */ #define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << ( 8 - configPRIO_BITS ) ) /* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */ #define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << ( 8 - configPRIO_BITS ) ) /* Normal assert() semantics without relying on the provision of an assert.h * header file. */ #define configASSERT( x ) if ( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); } /* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS * standard names. */ #define vPortSVCHandler SVC_Handler #define xPortPendSVHandler PendSV_Handler #define xPortSysTickHandler SysTick_Handler /* Allow system call from within FreeRTOS kernel only. */ #define configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY 1 /* STM32H743 has 16 MPU regions and therefore it is necessary to configure * configTOTAL_MPU_REGIONS correctly. */ #define configTOTAL_MPU_REGIONS 16 /* The default TEX,S,C,B setting marks the SRAM as shareable and as a result, * disables cache. Do not mark the SRAM as shareable because caching is being * used. TEX=0, S=0, C=1, B=1. */ #define configTEX_S_C_B_SRAM ( 0x03UL ) #endif /* FREERTOS_CONFIG_H */   3.2、fun_task.c #include "main.h" #define START_TASK_PRO 1 #define START_STK_SIZE 128 TaskHandle_t StartTask_Handler; #define TASK1_PRIO 4 #define TASK1_STK_SIZE 128 static TaskHandle_t Task1Task_Handler = NULL; #define TASK2_PRIO 3 #define TASK2_STK_SIZE 128 static TaskHandle_t Task2Task_Handler = NULL; void start_task(void *pvParameters); void gui_task(void *pvParameters); void task1(void *pvParameters); void task2(void *pvParameters); void task_create(void) { //start_task xTaskCreate((TaskFunction_t )start_task, (const char* )"start_task", (uint16_t )START_STK_SIZE, (void* )NULL, (UBaseType_t )START_TASK_PRO, (TaskHandle_t* )&StartTask_Handler); vTaskStartScheduler(); } void start_task(void *pvParameters) { taskENTER_CRITICAL(); //task1 xTaskCreate((TaskFunction_t )task1, (const char* )"task1", (uint16_t )TASK1_STK_SIZE, (void* )NULL, (UBaseType_t )TASK1_PRIO, (TaskHandle_t* )&Task1Task_Handler); //task2 xTaskCreate((TaskFunction_t )task2, (const char* )"task2", (uint16_t )TASK2_STK_SIZE, (void* )NULL, (UBaseType_t )TASK2_PRIO, (TaskHandle_t* )&Task2Task_Handler); taskEXIT_CRITICAL(); vTaskDelete(StartTask_Handler); } //task1 void task1(void *pvParameters) { while (1) { PRINTF("task1 run ...\r\n"); vTaskDelay(200); } } //task2 void task2(void *pvParameters) { while (1) { PRINTF("task2 run ...\r\n"); vTaskDelay(100); } }   3.3、fun_task.h #ifndef __FUN_TASK_H #define __FUN_TASK_H void task_create(void); #endif   3.4、main.c #include "main.h" int main(void) { uint8_t i; CLOCK_EnableClock(kCLOCK_Gpio0); BOARD_InitDEBUG_UARTPins(); BOARD_PowerMode_OD(); BOARD_InitBootClocks(); BOARD_InitDebugConsole(); init_led(); init_key(); task_create(); while (1) { } }   3.5、main.h #ifndef _MAIN_H_ #define _MAIN_H_ #include "pin_mux.h" #include "clock_config.h" #include "board.h" #include "fsl_debug_console.h" #include "fsl_gpio.h" #include "fsl_port.h" #include "fsl_lpi2c.h" #include "fsl_common.h" #include "fsl_lpspi.h" #include "fsl_lpspi_edma.h" #include "fsl_utick.h" #include "led/led.h" #include "systick/systick.h" #include "key/key.h" #include "fsl_p3t1755.h" #include "fsl_i3c.h" #include "p3t1755/p3t1755.h" #include "utick/utick.h" #include "FreeRTOS.h" #include "task.h" #include "fun_task.h" #endif   四、运行结果   下载程序后,串口输出          

  • 发表了主题帖: 【FRDM-MCXN947】 P3T1755温度传感器测试

    读取P3T1755温度传感器的值,通过串口打印输出。   一、硬件部分   P3T1755电路图部分   二、接口和时钟配置   2.1、配置I3C接口   2.2、配置I3C时钟   也可以在程序中配置,配置代码 /* Attach PLL0 clock to I3C, 150MHz / 6 = 25MHz. */ CLOCK_SetClkDiv(kCLOCK_DivI3c1FClk, 6U); CLOCK_AttachClk(kPLL0_to_I3C1FCLK);   三、程序部分   3.1、fsl_p3t1755.c /* * Copyright 2022, 2024 NXP * * SPDX-License-Identifier: BSD-3-Clause */ #include "fsl_p3t1755.h" /******************************************************************************* * Definitions ******************************************************************************/ /******************************************************************************* * Prototypes ******************************************************************************/ /******************************************************************************* * Variables ******************************************************************************/ /******************************************************************************* * Code ******************************************************************************/ status_t P3T1755_WriteReg(p3t1755_handle_t *handle, uint32_t regAddress, uint8_t *regData, size_t dataSize) { status_t result; result = handle->writeTransfer(handle->sensorAddress, regAddress, regData, dataSize); return (result == kStatus_Success) ? result : kStatus_Fail; } status_t P3T1755_ReadReg(p3t1755_handle_t *handle, uint32_t regAddress, uint8_t *regData, size_t dataSize) { status_t result; result = handle->readTransfer(handle->sensorAddress, regAddress, regData, dataSize); return (result == kStatus_Success) ? result : kStatus_Fail; } status_t P3T1755_Init(p3t1755_handle_t *handle, p3t1755_config_t *config) { assert(handle != NULL); assert(config != NULL); assert(config->writeTransfer != NULL); assert(config->readTransfer != NULL); handle->writeTransfer = config->writeTransfer; handle->readTransfer = config->readTransfer; handle->sensorAddress = config->sensorAddress; return kStatus_Success; } status_t P3T1755_ReadTemperature(p3t1755_handle_t *handle, double *temperature) { status_t result = kStatus_Success; uint8_t data[2]; uint16_t temp; result = P3T1755_ReadReg(handle, P3T1755_TEMPERATURE_REG, &data[0], 2); if (result == kStatus_Success) { temp = (((uint16_t)data[0] << 8U) | (uint16_t)data[1]) >> 4U; *temperature = (double)temp * 0.0625; } return result; }   3.2、fsl_p3t1755.h /* * Copyright 2022 NXP * * SPDX-License-Identifier: BSD-3-Clause */ #ifndef _FSL_P3T1755_H_ #define _FSL_P3T1755_H_ #include "fsl_common.h" /* Registers. */ #define P3T1755_TEMPERATURE_REG (0x00U) #define P3T1755_CONFIG_REG (0x01U) /*! [url=home.php?mod=space&uid=159083]@brief[/url] Define sensor access function. */ typedef status_t (*sensor_write_transfer_func_t)(uint8_t deviceAddress, uint32_t regAddress, uint8_t *regData, size_t dataSize); typedef status_t (*sensor_read_transfer_func_t)(uint8_t deviceAddress, uint32_t regAddress, uint8_t *regData, size_t dataSize); typedef struct _p3t1755_handle { sensor_write_transfer_func_t writeTransfer; sensor_read_transfer_func_t readTransfer; uint8_t sensorAddress; } p3t1755_handle_t; typedef struct _p3t1755_config { sensor_write_transfer_func_t writeTransfer; sensor_read_transfer_func_t readTransfer; uint8_t sensorAddress; } p3t1755_config_t; #if defined(__cplusplus) extern "C" { #endif /*! * @brief Create handle for P3T1755, reset the sensor per user configuration. * * @param p3t1755_handle The pointer to #p3t1755_handle_t. * * [url=home.php?mod=space&uid=784970]@return[/url] kStatus_Success if success or kStatus_Fail if error. */ status_t P3T1755_Init(p3t1755_handle_t *handle, p3t1755_config_t *config); /*! * @brief Write Register with register data buffer. * * @param handle The pointer to #p3t1755_handle_t. * @param regAddress register address to write. * @param regData The pointer to data buffer to be write to the reg. * @param dataSize Size of the regData. * * @return kStatus_Success if success or kStatus_Fail if error. */ status_t P3T1755_WriteReg(p3t1755_handle_t *handle, uint32_t regAddress, uint8_t *regData, size_t dataSize); /*! * @brief Read Register to speficied data buffer. * * @param handle The pointer to #p3t1755_handle_t. * @param regAddress register address to read. * @param regData The pointer to data buffer to store the read out data. * @param dataSize Size of the regData to be read. * * @return kStatus_Success if success or kStatus_Fail if error. */ status_t P3T1755_ReadReg(p3t1755_handle_t *handle, uint32_t regAddress, uint8_t *regData, size_t dataSize); /*! * @brief Read temperature data. * * @param handle The pointer to #p3t1755_handle_t. * @param temperature The pointer to temperature data. * * @return kStatus_Success if success or kStatus_Fail if error. */ status_t P3T1755_ReadTemperature(p3t1755_handle_t *handle, double *temperature); #if defined(__cplusplus) } #endif /* __cplusplus */ #endif /* _FSL_P3T1755_H_ */   3.3、p3t1755.c #include "main.h" /******************************************************************************* * Prototypes ******************************************************************************/ static void i3c_master_callback(I3C_Type *base, i3c_master_handle_t *handle, status_t status, void *userData); /******************************************************************************* * Variables ******************************************************************************/ volatile status_t g_completionStatus; volatile bool g_masterCompletionFlag; i3c_master_handle_t g_i3c_m_handle; p3t1755_handle_t p3t1755Handle; const i3c_master_transfer_callback_t masterCallback = { .slave2Master = NULL, .ibiCallback = NULL, .transferComplete = i3c_master_callback}; /******************************************************************************* * Code ******************************************************************************/ static void i3c_master_callback(I3C_Type *base, i3c_master_handle_t *handle, status_t status, void *userData) { if (status == kStatus_Success) { g_masterCompletionFlag = true; } g_completionStatus = status; } status_t I3C_WriteSensor(uint8_t deviceAddress, uint32_t regAddress, uint8_t *regData, size_t dataSize) { status_t result = kStatus_Success; i3c_master_transfer_t masterXfer = {0}; uint32_t timeout = 0U; masterXfer.slaveAddress = deviceAddress; masterXfer.direction = kI3C_Write; masterXfer.busType = kI3C_TypeI3CSdr; masterXfer.subaddress = regAddress; masterXfer.subaddressSize = 1; masterXfer.data = regData; masterXfer.dataSize = dataSize; masterXfer.flags = kI3C_TransferDefaultFlag; g_masterCompletionFlag = false; g_completionStatus = kStatus_Success; result = I3C_MasterTransferNonBlocking(EXAMPLE_MASTER, &g_i3c_m_handle, &masterXfer); if (kStatus_Success != result) { return result; } while (!g_masterCompletionFlag) { timeout++; if ((g_completionStatus != kStatus_Success) || (timeout > I3C_TIME_OUT_INDEX)) { break; } } if (timeout == I3C_TIME_OUT_INDEX) { result = kStatus_Timeout; } result = g_completionStatus; return result; } status_t I3C_ReadSensor(uint8_t deviceAddress, uint32_t regAddress, uint8_t *regData, size_t dataSize) { status_t result = kStatus_Success; i3c_master_transfer_t masterXfer = {0}; uint32_t timeout = 0U; masterXfer.slaveAddress = deviceAddress; masterXfer.direction = kI3C_Read; masterXfer.busType = kI3C_TypeI3CSdr; masterXfer.subaddress = regAddress; masterXfer.subaddressSize = 1; masterXfer.data = regData; masterXfer.dataSize = dataSize; masterXfer.flags = kI3C_TransferDefaultFlag; g_masterCompletionFlag = false; g_completionStatus = kStatus_Success; result = I3C_MasterTransferNonBlocking(EXAMPLE_MASTER, &g_i3c_m_handle, &masterXfer); if (kStatus_Success != result) { return result; } while (!g_masterCompletionFlag) { timeout++; if ((g_completionStatus != kStatus_Success) || (timeout > I3C_TIME_OUT_INDEX)) { break; } } if (timeout == I3C_TIME_OUT_INDEX) { result = kStatus_Timeout; } result = g_completionStatus; return result; } status_t p3t1755_set_dynamic_address(void) { status_t result = kStatus_Success; i3c_master_transfer_t masterXfer = {0}; uint8_t g_master_txBuff[1]; /* Reset dynamic address. */ g_master_txBuff[0] = CCC_RSTDAA; masterXfer.slaveAddress = 0x7E; masterXfer.data = g_master_txBuff; masterXfer.dataSize = 1; masterXfer.direction = kI3C_Write; masterXfer.busType = kI3C_TypeI3CSdr; masterXfer.flags = kI3C_TransferDefaultFlag; result = I3C_MasterTransferBlocking(EXAMPLE_MASTER, &masterXfer); if (result != kStatus_Success) { return result; } /* Assign dynmic address. */ memset(&masterXfer, 0, sizeof(masterXfer)); g_master_txBuff[0] = CCC_SETDASA; masterXfer.slaveAddress = 0x7E; masterXfer.data = g_master_txBuff; masterXfer.dataSize = 1; masterXfer.direction = kI3C_Write; masterXfer.busType = kI3C_TypeI3CSdr; masterXfer.flags = kI3C_TransferNoStopFlag; result = I3C_MasterTransferBlocking(EXAMPLE_MASTER, &masterXfer); if (result != kStatus_Success) { return result; } memset(&masterXfer, 0, sizeof(masterXfer)); g_master_txBuff[0] = SENSOR_ADDR << 1; masterXfer.slaveAddress = SENSOR_SLAVE_ADDR; masterXfer.data = g_master_txBuff; masterXfer.dataSize = 1; masterXfer.direction = kI3C_Write; masterXfer.busType = kI3C_TypeI3CSdr; masterXfer.flags = kI3C_TransferDefaultFlag; return I3C_MasterTransferBlocking(EXAMPLE_MASTER, &masterXfer); } void init_p3t1755(void) { status_t result = kStatus_Success; i3c_master_config_t masterConfig; p3t1755_config_t p3t1755Config; // /* Attach PLL0 clock to I3C, 150MHz / 6 = 25MHz. */ // CLOCK_SetClkDiv(kCLOCK_DivI3c1FClk, 6U); // CLOCK_AttachClk(kPLL0_to_I3C1FCLK); init_p3t1755_pins(); PRINTF("\r\nI3C master read sensor data example.\r\n"); I3C_MasterGetDefaultConfig(&masterConfig); masterConfig.baudRate_Hz.i2cBaud = EXAMPLE_I2C_BAUDRATE; masterConfig.baudRate_Hz.i3cPushPullBaud = EXAMPLE_I3C_PP_BAUDRATE; masterConfig.baudRate_Hz.i3cOpenDrainBaud = EXAMPLE_I3C_OD_BAUDRATE; masterConfig.enableOpenDrainStop = false; masterConfig.disableTimeout = true; I3C_MasterInit(EXAMPLE_MASTER, &masterConfig, I3C_MASTER_CLOCK_FREQUENCY); /* Create I3C handle. */ I3C_MasterTransferCreateHandle(EXAMPLE_MASTER, &g_i3c_m_handle, &masterCallback, NULL); result = p3t1755_set_dynamic_address(); if (result != kStatus_Success) { PRINTF("\r\nP3T1755 set dynamic address failed.\r\n"); } p3t1755Config.writeTransfer = I3C_WriteSensor; p3t1755Config.readTransfer = I3C_ReadSensor; p3t1755Config.sensorAddress = SENSOR_ADDR; P3T1755_Init(&p3t1755Handle, &p3t1755Config); } void p3t1755_test(void) { status_t result = kStatus_Success; double temperature; while(1) { result = P3T1755_ReadTemperature(&p3t1755Handle, &temperature); if (result != kStatus_Success) { PRINTF("\r\nP3T1755 read temperature failed.\r\n"); } else { PRINTF("Temperature:%0.1f \r\n", temperature); } SysTick_Delay_ms(500); } }   3.4、p3t1755.h #ifndef __P3T1755_H #define __P3T1755_H #define EXAMPLE_MASTER I3C1 #define I3C_MASTER_CLOCK_FREQUENCY CLOCK_GetI3cClkFreq(1) #define SENSOR_SLAVE_ADDR 0x48U #define I3C_TIME_OUT_INDEX 100000000U #define SENSOR_ADDR 0x08U #define CCC_RSTDAA 0x06U #define CCC_SETDASA 0x87 #ifndef EXAMPLE_I2C_BAUDRATE #define EXAMPLE_I2C_BAUDRATE 400000 #endif #ifndef EXAMPLE_I3C_OD_BAUDRATE #define EXAMPLE_I3C_OD_BAUDRATE 1500000 #endif #ifndef EXAMPLE_I3C_PP_BAUDRATE #define EXAMPLE_I3C_PP_BAUDRATE 4000000 #endif void init_p3t1755(void); void p3t1755_test(void); #endif   3.5、main.c #include "main.h" int main(void) { uint8_t i; CLOCK_EnableClock(kCLOCK_Gpio0); BOARD_InitDEBUG_UARTPins(); BOARD_PowerMode_OD(); BOARD_InitBootClocks(); BOARD_InitDebugConsole(); init_utick(); SysTick_Init(); init_p3t1755(); init_led(); init_key(); p3t1755_test(); while (1) { SysTick_Delay_ms(500); led_red_tog(); } }   3.6、main.h #ifndef _MAIN_H_ #define _MAIN_H_ #include "pin_mux.h" #include "clock_config.h" #include "board.h" #include "fsl_debug_console.h" #include "fsl_gpio.h" #include "fsl_port.h" #include "fsl_lpi2c.h" #include "fsl_common.h" #include "fsl_lpspi.h" #include "fsl_lpspi_edma.h" #include "fsl_utick.h" #include "led/led.h" #include "systick/systick.h" #include "key/key.h" #include "fsl_p3t1755.h" #include "fsl_i3c.h" #include "p3t1755/p3t1755.h" #include "utick/utick.h" #endif   四、运行结果   程序下载后,串口输出温度值  

  • 发表了主题帖: 【FRDM-MCXN947】UTICK定时器

    测试N947内部的UTICK定时器,定时1MS中断。   一、UTICK内部框图     二、程序部分   2.1、utick.c #include "main.h" static void UTickCallback(void) { led_red_tog(); } void init_utick(void) { SYSCON->CLOCK_CTRL |= SYSCON_CLOCK_CTRL_FRO1MHZ_ENA_MASK; UTICK_Init(EXAMPLE_UTICK); UTICK_SetTick(EXAMPLE_UTICK, kUTICK_Repeat, UTICK_TIME_1MS - 1, UTickCallback); }   2.2、utick.h #ifndef __UTICK_H #define __UTICK_H #define EXAMPLE_UTICK UTICK0 #define UTICK_TIME_1MS (1000L) #define UTICK_TIME_1S (1000000UL) void init_utick(void); #endif   三、程序运行结果   下载程序后,测试红色LED引脚电平,查看输出波形    

  • 2024-12-10
  • 回复了主题帖: FRDM-MCXN947 下载问题linkserver

    打开个MDK工程,看能不能找到仿真器  

  • 发表了主题帖: 【极海APM32M3514电机通用评估板】 硬件I2C驱动OLED显示屏

    测试APM32M3514板卡硬件I2C方式驱动OLED显示屏。   一、硬件部分 测试使用PB8和PB9端口 需要将上面的电阻去掉,将PB8和PB9分别连接OLED显示的SCL和SDA引脚,PB8和PB9引脚服复用功能如下表。     二、程序部分   2.1、i2c.c #include "main.h" /* Waiting TIMEOUT */ #define I2CT_FLAG_TIMEOUT ((uint32_t)0x1000) #define I2CT_LONG_TIMEOUT ((uint32_t)(10 * I2CT_FLAG_TIMEOUT)) /*Debug Information output*/ #define I2C_DEBUG_ON 1 #define I2C_ERROR(fmt,arg...) printf("<<-Master-I2C_ERROR->> "fmt"\n",##arg) static volatile uint32_t I2CTimeout = I2CT_LONG_TIMEOUT; void init_i2c(void) { GPIO_Config_T gpioConfigStruct; I2C_Config_T i2cConfigStruct; /* Enable I2C related Clock */ RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOB); RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_I2C); RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG); /* Free I2C_SCL and I2C_SDA */ gpioConfigStruct.mode = GPIO_MODE_OUT; gpioConfigStruct.speed = GPIO_SPEED_50MHz; gpioConfigStruct.outtype = GPIO_OUT_TYPE_PP; gpioConfigStruct.pupd = GPIO_PUPD_NO; gpioConfigStruct.pin = GPIO_PIN_8; GPIO_Config(GPIOB, &gpioConfigStruct); gpioConfigStruct.pin = GPIO_PIN_9; GPIO_Config(GPIOB, &gpioConfigStruct); GPIO_SetBit(GPIOB, GPIO_PIN_8); GPIO_SetBit(GPIOB, GPIO_PIN_9); /* Connect I2C to SCL */ GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_8, GPIO_AF_PIN1); /* Connect I2C to SDA */ GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_9, GPIO_AF_PIN1); /* Config I2C GPIO */ gpioConfigStruct.mode = GPIO_MODE_AF; gpioConfigStruct.speed = GPIO_SPEED_50MHz; gpioConfigStruct.outtype = GPIO_OUT_TYPE_OD; gpioConfigStruct.pupd = GPIO_PUPD_NO; gpioConfigStruct.pin = GPIO_PIN_8; GPIO_Config(GPIOB, &gpioConfigStruct); gpioConfigStruct.pin = GPIO_PIN_9; GPIO_Config(GPIOB, &gpioConfigStruct); /* Config I2C */ I2C_Reset(); RCM_ConfigI2CCLK(RCM_I2CCLK_SYSCLK); i2cConfigStruct.ack = I2C_ACK_ENABLE; i2cConfigStruct.ackaddress = I2C_ACK_ADDRESS_7BIT; i2cConfigStruct.address1 = 0x30; i2cConfigStruct.analogfilter = I2C_ANALOG_FILTER_ENABLE; i2cConfigStruct.digitalfilter = I2C_DIGITAL_FILTER_0; i2cConfigStruct.mode = I2C_MODE_I2C; i2cConfigStruct.timing = 0x1042F013; I2C_Config(&i2cConfigStruct); /* Enable the I2C Interrupt */ I2C_EnableInterrupt(I2C_INT_RXIE | I2C_INT_ADDRIE | I2C_INT_STOPIE); /* NVIC configuration */ NVIC_EnableIRQRequest(I2C_IRQn, 1); /* slave configuration*/ I2C_EnableSlaveByteControl(); I2C_EnableReload(); I2C_EnableStretchClock(); /* Enable I2C */ I2C_Enable(); } void I2C_Isr(void) { uint8_t dat; if (I2C_ReadIntFlag(I2C_INT_FLAG_ADDR) == SET) { I2C_ConfigNumberOfBytes(1); I2C_ClearIntFlag(I2C_INT_FLAG_ADDR); } if (I2C_ReadStatusFlag(I2C_FLAG_RXBNE) == SET) { /* I2C_ConfigNumberOfBytes is necessary*/ I2C_ConfigNumberOfBytes(1); dat = (uint8_t)I2C_RxData(); printf("%c", dat); } if (I2C_ReadIntFlag(I2C_INT_FLAG_STOP) == SET) { I2C_ClearIntFlag(I2C_INT_FLAG_STOP); } } uint32_t I2C_TIMEOUT_UserCallback(uint8_t errorCode) { if (I2C_DEBUG_ON) { I2C_ERROR("I2C Wait TIMEOUT! errorCode = %d\r\n", errorCode); } return 0; } uint32_t I2C_WriteDat(uint8_t DevAddr, uint8_t* pBuffer, uint8_t NByte) { uint8_t wNum; I2CTimeout = I2CT_LONG_TIMEOUT; /* Wait until I2C is idle */ while (I2C_ReadStatusFlag(I2C_FLAG_BUSY) == SET) { init_i2c(); if ((I2CTimeout--) == 0) { return I2C_TIMEOUT_UserCallback(1); } } /* Disable I2C interrupt */ I2C_DisableInterrupt(I2C_INT_RXIE | I2C_INT_ADDRIE | I2C_INT_STOPIE); I2C_DisableReload(); /* I2C Send Configuration*/ I2C_HandlingTransfer(DevAddr, NByte, I2C_RELOAD_MODE_AUTOEND, I2C_GENERATE_START_WRITE); for(wNum = 0;wNum < NByte;wNum++) { I2C_TxData(pBuffer[wNum]); I2CTimeout = I2CT_LONG_TIMEOUT; while (I2C_ReadStatusFlag(I2C_FLAG_TXBE) == RESET) { if ((I2CTimeout--) == 0) { return I2C_TIMEOUT_UserCallback(2); } } } /* I2C Generate Stop signal */ I2C_EnableGenerateStop(); I2CTimeout = I2CT_LONG_TIMEOUT; while (I2C_ReadStatusFlag(I2C_FLAG_STOP) == RESET) { if ((I2CTimeout--) == 0) { return I2C_TIMEOUT_UserCallback(3); } } /* I2C Clear Stop Flag */ I2C_ClearIntFlag(I2C_INT_FLAG_STOP); return 0; }   2.2、i2c.h #ifndef _I2C_H #define _I2C_H void init_i2c(void); void I2C_Isr(void); uint32_t I2C_WriteDat(uint8_t DevAddr, uint8_t* pBuffer, uint8_t NByte); #endif   2.3、oled.c 使用的OLED显示屏驱动芯片是SSD1306 #include "main.h" #include "oled/codetab.h" #include "i2c/i2c.h" void oled_WriteByte(uint8_t addr, uint8_t dat) { i2c_Start(); i2c_SendByte(0x78); i2c_WaitAck(); i2c_SendByte(addr); i2c_WaitAck(); i2c_SendByte(dat); i2c_WaitAck(); i2c_Stop(); } void I2C_WriteByte(uint8_t addr, uint8_t dat) { uint8_t temp[2]; temp[0] = addr; temp[1] = dat; I2C_WriteDat(0x78, temp, 2); } void WriteCmd(unsigned char I2C_Command) { I2C_WriteByte(0x00, I2C_Command); } void WriteDat(unsigned char I2C_Data) { I2C_WriteByte(0x40, I2C_Data); } void OLED_WrCmd(unsigned char IIC_Command) { WriteCmd(IIC_Command); } void OLED_Init(void) { //i2c_CfgGpio(); APM_DelayMs(100); WriteCmd(0xAE); //display off WriteCmd(0x20); //Set Memory Addressing Mode WriteCmd(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid WriteCmd(0xb0); //Set Page Start Address for Page Addressing Mode,0-7 WriteCmd(0xc8); //Set COM Output Scan Direction WriteCmd(0x00); //---set low column address WriteCmd(0x10); //---set high column address WriteCmd(0x40); //--set start line address WriteCmd(0x81); //--set contrast control register WriteCmd(0xff); //亮度调节 0x00~0xff WriteCmd(0xa1); //--set segment re-map 0 to 127 WriteCmd(0xa6); //--set normal display WriteCmd(0xa8); //--set multiplex ratio(1 to 64) WriteCmd(0x3F); // WriteCmd(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content WriteCmd(0xd3); //-set display offset WriteCmd(0x00); //-not offset WriteCmd(0xd5); //--set display clock divide ratio/oscillator frequency WriteCmd(0xf0); //--set divide ratio WriteCmd(0xd9); //--set pre-charge period WriteCmd(0x22); // WriteCmd(0xda); //--set com pins hardware configuration WriteCmd(0x12); WriteCmd(0xdb); //--set vcomh WriteCmd(0x40); //0x20,0.77xVcc WriteCmd(0x8d); //--set DC-DC enable WriteCmd(0x14); // WriteCmd(0xaf); //--turn on oled panel } void OLED_SetPos(unsigned char x, unsigned char y) { WriteCmd(0xb0+y); WriteCmd(((x&0xf0)>>4)|0x10); WriteCmd((x&0x0f)|0x01); } void OLED_Fill(unsigned char fill_Data)//全屏填充 { unsigned char m,n; for(m=0;m<8;m++) { WriteCmd(0xb0+m); //page0-page1 WriteCmd(0x00); //low column start address WriteCmd(0x10); //high column start address for(n=0;n<128;n++) { WriteDat(fill_Data); } } } void OLED_CLS(void)//清屏 { OLED_Fill(0xff); } void OLED_ON(void) { WriteCmd(0X8D); //设置电荷泵 WriteCmd(0X14); //开启电荷泵 WriteCmd(0XAF); //OLED唤醒 } void OLED_OFF(void) { WriteCmd(0X8D); //设置电荷泵 WriteCmd(0X10); //关闭电荷泵 WriteCmd(0XAE); //OLED休眠 } void OLED_ShowStr(unsigned char x, unsigned char y, unsigned char ch[], unsigned char TextSize) { unsigned char c = 0,i = 0,j = 0; switch(TextSize) { case 1: { while(ch[j] != '\0') { c = ch[j] - 32; if(x > 126) { x = 0; y++; } OLED_SetPos(x,y); for(i=0;i<6;i++) WriteDat(F6x8[c][i]); x += 6; j++; } }break; case 2: { while(ch[j] != '\0') { c = ch[j] - 32; if(x > 120) { x = 0; y++; } OLED_SetPos(x,y); for(i=0;i<8;i++) WriteDat(F8X16[c*16+i]); OLED_SetPos(x,y+1); for(i=0;i<8;i++) WriteDat(F8X16[c*16+i+8]); x += 8; j++; } }break; } } void OLED_ShowCN(unsigned char x, unsigned char y, unsigned char N) { unsigned char wm=0; unsigned int adder=32*N; OLED_SetPos(x , y); for(wm = 0;wm < 16;wm++) { WriteDat(F16x16[adder]); adder += 1; } OLED_SetPos(x,y + 1); for(wm = 0;wm < 16;wm++) { WriteDat(F16x16[adder]); adder += 1; } } void OLED_DrawBMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP[]) { unsigned int j=0; unsigned char x,y; if(y1%8==0) y = y1/8; else y = y1/8 + 1; for(y=y0;y<y1;y++) { OLED_SetPos(x0,y); for(x=x0;x<x1;x++) { WriteDat(BMP[j++]); } } } void oled_test(void) { OLED_Init(); OLED_Fill(0x00); OLED_ShowStr(0,0,"APM32M3514 BOARD",2); OLED_ShowStr(0,2,"I2C OLED TEST",2); }   2.4、main.c int main(void) { APM_DelayInit(); APM_DelayMs(5000); init_usart(); init_led(); init_i2c(); OLED_Init(); oled_test(); while (1) { led_on(); APM_DelayMs(200); led_off(); APM_DelayMs(200); } }   三、运行结果   下载程序后,OLED显示屏显示  

  • 发表了主题帖: 【极海APM32M3514电机通用评估板】 运行freertos系统

    测试下在开发板上运行FreeRTOS系统。   一、下载FreeRTOS源码 下载地址:https://www.freertos.org/   二、添加代码   2.1、添加FreeRTOS源代码到工程   2.2、fun_task.c #include "main.h" #define START_TASK_PRO 1 #define START_STK_SIZE 64 TaskHandle_t StartTask_Handler; #define TASK1_PRIO 2 #define TASK1_STK_SIZE 64 static TaskHandle_t Task1Task_Handler = NULL; #define TASK2_PRIO 3 #define TASK2_STK_SIZE 64 static TaskHandle_t Task2Task_Handler = NULL; #define TASK3_PRIO 4 #define TASK3_STK_SIZE 64 static TaskHandle_t Task3Task_Handler = NULL; void start_task(void *pvParameters); void task1(void *pvParameters); void task2(void *pvParameters); void task3(void *pvParameters); void task_create(void) { //start_task xTaskCreate((TaskFunction_t )start_task, (const char* )"start_task", (uint16_t )START_STK_SIZE, (void* )NULL, (UBaseType_t )START_TASK_PRO, (TaskHandle_t* )&StartTask_Handler); vTaskStartScheduler(); } void start_task(void *pvParameters) { taskENTER_CRITICAL(); //task1 xTaskCreate((TaskFunction_t )task1, (const char* )"task1", (uint16_t )TASK1_STK_SIZE, (void* )NULL, (UBaseType_t )TASK1_PRIO, (TaskHandle_t* )&Task1Task_Handler); //task2 xTaskCreate((TaskFunction_t )task2, (const char* )"task2", (uint16_t )TASK2_STK_SIZE, (void* )NULL, (UBaseType_t )TASK2_PRIO, (TaskHandle_t* )&Task2Task_Handler); //task3 xTaskCreate((TaskFunction_t )task3, (const char* )"task3", (uint16_t )TASK3_STK_SIZE, (void* )NULL, (UBaseType_t )TASK3_PRIO, (TaskHandle_t* )&Task3Task_Handler); taskEXIT_CRITICAL(); vTaskDelete(StartTask_Handler); } //task1 void task1(void *pvParameters) { while (1) { printf("task1 run ...\r\n"); vTaskDelay(100); } } //task2 void task2(void *pvParameters) { while (1) { printf("task2 run ...\r\n"); vTaskDelay(200); } } //task3 void task3(void *pvParameters) { while (1) { printf("task3 run ...\r\n"); vTaskDelay(300); } }   2.3、main.c int main(void) { APM_DelayInit(); APM_DelayMs(5000); init_usart(); init_led(); task_create(); while (1) { } }   三、运行结果   下载程序后,串口输出内容:  

  • 回复了主题帖: 【极海APM32M3514电机通用评估板】 串口输出测试

    不语arc 发表于 2024-12-10 09:40 swd还能在线下载和调试吗 在main程序初始化后,加一个较长时间的延时,在这段时间内下载程序没有问题,不能仿真调试。

  • 2024-12-09
  • 发表了主题帖: 【极海APM32M3514电机通用评估板】 ADC输入测试

    ADC输入测试,串口输出ADC采样的电压值。   一、硬件部分   测试使用开发板上的电位器RV1,调整RV1改变ADC输入电压。 电路图部分如下: 对应MCU输入端口   二、程序部分   2.1、adc.c #include "main.h" void init_adc(void) { GPIO_Config_T gpioConfig; ADC_Config_T adcConfig; /* RCM Enable*/ RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOA); RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC); RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG); /* GPIO Configuration */ gpioConfig.pin = GPIO_PIN_7; gpioConfig.mode = GPIO_MODE_AN; gpioConfig.pupd = GPIO_PUPD_PU; GPIO_Config(GPIOA, &gpioConfig); /* ADC Configuration */ ADC_Reset(); ADC_ConfigStructInit(&adcConfig); /* Set resolution*/ adcConfig.resolution = ADC_RESOLUTION_12B; /* Set dataAlign*/ adcConfig.dataAlign = ADC_DATA_ALIGN_RIGHT; /* Set scanDir*/ adcConfig.scanDir = ADC_SCAN_DIR_UPWARD; /* Set convMode continous*/ adcConfig.convMode = ADC_CONVERSION_CONTINUOUS; /* Set extTrigConv*/ adcConfig.extTrigConv1 = ADC_EXT_TRIG_CONV_TRG0; /* Set TrigEdge*/ adcConfig.extTrigEdge1 = ADC_EXT_TRIG_EDGE_NONE; ADC_Config(&adcConfig); ADC_ConfigChannel(ADC_CHANNEL_7, ADC_SAMPLE_TIME_239_5); /* Enable Interrupt*/ ADC_EnableInterrupt(ADC_INT_CS); NVIC_EnableIRQRequest(ADC_COMP_IRQn, 2); /* Calibration*/ ADC_ReadCalibrationFactor(); /* Enable ADC*/ ADC_Enable(); } void ADC_Isr(void) { uint32_t adcData = 0; uint32_t voltage = 0; if (ADC_ReadIntFlag(ADC_INT_FLAG_CS) == SET) { ADC_ClearIntFlag(ADC_INT_FLAG_CS); /* Read ADC Conversion value */ adcData = ADC_ReadConversionValue(); /* voltage(mV) = adcData * (3300mV / 4095) */ voltage = (adcData * 3300) / 4095; /* output to serial port */ printf("voltage : %d mV\r\n", voltage); } }   2.2、adc.h #ifndef _ADC_H #define _ADC_H void init_adc(void); void ADC_Isr(void); #endif   2.3、main.c #include "main.h" int main(void) { APM_DelayInit(); APM_DelayMs(5000); init_usart(); init_led(); init_adc(); /* Wait until ADC is ready */ while (!ADC_ReadStatusFlag(ADC_FLAG_ADRDY)); ADC_StartConversion(); while (1) { led_on(); APM_DelayMs(100); led_off(); APM_DelayMs(100); } } 2.4、main.h #ifndef __MAIN_H #define __MAIN_H #ifdef __cplusplus extern "C" { #endif /* Includes */ #include <stdio.h> #include <string.h> #include "Board.h" #include "apm32m35xx.h" #include "bsp_delay.h" #include "apm32m35xx_rcm.h" #include "apm32m35xx_gpio.h" #include "apm32m35xx_misc.h" #include "apm32m35xx_usart.h" #include "apm32m35xx_adc.h" #include "led/led.h" #include "usart/usart.h" #include "adc/adc.h" #ifdef __cplusplus } #endif #endif   三、程序运行结果   下载程序后,串口打印ADC采集的电压值  

统计信息

已有1096人来访过

  • 芯积分:1708
  • 好友:3
  • 主题:240
  • 回复:197

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言