先写gc9a01_driver.c和gc9a01_driver.h
gc9a01_driver.c
#include "gc9a01_driver.h"
#include "spi.h"
#include "gpio.h"
#include "main.h"
#include "debug.h"
#define MAX_TIMEOUT_VAL 5000
#define ORIENTATION 0
#define COLOR_MODE 0x3A
#define COLOR_MODE__12_BIT 0x03
#define COLOR_MODE__16_BIT 0x05
#define COLOR_MODE__18_BIT 0x06
// SPI 发送命令
void GC9A01_WriteCommand(uint8_t cmd) {
HAL_GPIO_SetValue(&g_gpio4_4, g_gpio4_4.pins, GPIO_LOW_LEVEL); // DC = 0 for command
HAL_SPI_WriteBlocking(&g_spi1, &cmd, sizeof(cmd), MAX_TIMEOUT_VAL);
}
// SPI 发送数据
void GC9A01_WriteData(uint8_t data) {
HAL_GPIO_SetValue(&g_gpio4_4, g_gpio4_4.pins, GPIO_HIGH_LEVEL); // DC = 1 for data
HAL_SPI_WriteBlocking(&g_spi1, &data, sizeof(data), MAX_TIMEOUT_VAL);
}
// 复位 GC9A01
void GC9A01_Reset(void) {
HAL_GPIO_SetValue(&g_gpio4_5, g_gpio4_5.pins, GPIO_LOW_LEVEL); // RST = 0 for RESET
BASE_FUNC_DELAY_MS(100);
HAL_GPIO_SetValue(&g_gpio4_5, g_gpio4_5.pins, GPIO_HIGH_LEVEL); // RST = 1
BASE_FUNC_DELAY_MS(120);
}
// 设置显示窗口
void GC9A01_SetAddressWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) {
GC9A01_WriteCommand(0x2A); // 列地址设置
GC9A01_WriteData(x0 >> 8);
GC9A01_WriteData(x0 & 0xFF);
GC9A01_WriteData(x1 >> 8);
GC9A01_WriteData(x1 & 0xFF);
GC9A01_WriteCommand(0x2B); // 行地址设置
GC9A01_WriteData(y0 >> 8);
GC9A01_WriteData(y0 & 0xFF);
GC9A01_WriteData(y1 >> 8);
GC9A01_WriteData(y1 & 0xFF);
GC9A01_WriteCommand(0x2C); // 准备写入内存
}
void GC9A01_FillScreen(uint16_t color) {
// 设置整个屏幕的绘图窗口
GC9A01_SetAddressWindow(0, 0, 239, 239); // 对于 240x240 的 GC9A01 显示屏,坐标从 0 开始
// 发送要填充的颜色数据
for (uint32_t i = 0; i < 240 * 240; i++) {
GC9A01_WriteData(color >> 8); // 发送颜色的高 8 位
GC9A01_WriteData(color & 0xFF); // 发送颜色的低 8 位
}
}
// 画一个像素
void GC9A01_DrawPixel(uint16_t x, uint16_t y, uint16_t color) {
GC9A01_SetAddressWindow(x, y, x, y);
GC9A01_WriteData(color >> 8);
GC9A01_WriteData(color & 0xFF);
}
// void gc9a01_flush_cb(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) {
// int32_t x, y;
// // 设置要刷新的区域
// GC9A01_SetAddressWindow(area->x1, area->y1, area->x2, area->y2);
// // 写入像素数据到 GC9A01
// for (y = area->y1; y <= area->y2; y++) {
// for (x = area->x1; x <= area->x2; x++) {
// uint16_t color = color_p->full; // 获取 RGB565 格式的颜色数据
// GC9A01_WriteData(color >> 8); // 发送颜色的高 8 位
// GC9A01_WriteData(color & 0xFF); // 发送颜色的低 8 位
// color_p++; // 指向下一个像素数据
// }
// }
// // 刷新完成后通知 LVGL
// lv_disp_flush_ready(disp_drv);
// }
void gc9a01_flush_cb(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) {
uint32_t width = area->x2 - area->x1 + 1;
uint32_t height = area->y2 - area->y1 + 1;
uint32_t size = width * height;
// Set the address window
GC9A01_WriteCommand(0x2A); // Column Address Set
uint8_t data[4];
data[0] = (area->x1 >> 8) & 0xFF;
data[1] = area->x1 & 0xFF;
data[2] = (area->x2 >> 8) & 0xFF;
data[3] = area->x2 & 0xFF;
GC9A01_WriteData(data);
GC9A01_WriteCommand(0x2B); // Page Address Set
data[0] = (area->y1 >> 8) & 0xFF;
data[1] = area->y1 & 0xFF;
data[2] = (area->y2 >> 8) & 0xFF;
data[3] = area->y2 & 0xFF;
GC9A01_WriteData(data);
GC9A01_WriteCommand(0x2C); // Memory Write
// Write pixel data
for (uint32_t i = 0; i < size; i++) {
uint16_t color = color_p[i].full;
data[0] = color >> 8;
data[1] = color & 0xFF;
GC9A01_WriteData(data);
}
lv_disp_flush_ready(disp_drv);
}
void GC9A01_init(void) {
GC9A01_Reset();
/* Initial Sequence */
GC9A01_WriteCommand(0xEF);
GC9A01_WriteCommand(0xEB);
GC9A01_WriteData(0x14);
GC9A01_WriteCommand(0xFE);
GC9A01_WriteCommand(0xEF);
GC9A01_WriteCommand(0xEB);
GC9A01_WriteData(0x14);
GC9A01_WriteCommand(0x84);
GC9A01_WriteData(0x40);
GC9A01_WriteCommand(0x85);
GC9A01_WriteData(0xFF);
GC9A01_WriteCommand(0x86);
GC9A01_WriteData(0xFF);
GC9A01_WriteCommand(0x87);
GC9A01_WriteData(0xFF);
GC9A01_WriteCommand(0x88);
GC9A01_WriteData(0x0A);
GC9A01_WriteCommand(0x89);
GC9A01_WriteData(0x21);
GC9A01_WriteCommand(0x8A);
GC9A01_WriteData(0x00);
GC9A01_WriteCommand(0x8B);
GC9A01_WriteData(0x80);
GC9A01_WriteCommand(0x8C);
GC9A01_WriteData(0x01);
GC9A01_WriteCommand(0x8D);
GC9A01_WriteData(0x01);
GC9A01_WriteCommand(0x8E);
GC9A01_WriteData(0xFF);
GC9A01_WriteCommand(0x8F);
GC9A01_WriteData(0xFF);
GC9A01_WriteCommand(0xB6);
GC9A01_WriteData(0x00);
GC9A01_WriteData(0x00);
GC9A01_WriteCommand(0x36);
#if ORIENTATION == 0
GC9A01_WriteData(0x18);
#elif ORIENTATION == 1
GC9A01_WriteData(0x28);
#elif ORIENTATION == 2
GC9A01_WriteData(0x48);
#else
GC9A01_WriteData(0x88);
#endif
GC9A01_WriteCommand(COLOR_MODE);
GC9A01_WriteData(COLOR_MODE__16_BIT);
GC9A01_WriteCommand(0x90);
GC9A01_WriteData(0x08);
GC9A01_WriteData(0x08);
GC9A01_WriteData(0x08);
GC9A01_WriteData(0x08);
GC9A01_WriteCommand(0xBD);
GC9A01_WriteData(0x06);
GC9A01_WriteCommand(0xBC);
GC9A01_WriteData(0x00);
GC9A01_WriteCommand(0xFF);
GC9A01_WriteData(0x60);
GC9A01_WriteData(0x01);
GC9A01_WriteData(0x04);
GC9A01_WriteCommand(0xC3);
GC9A01_WriteData(0x13);
GC9A01_WriteCommand(0xC4);
GC9A01_WriteData(0x13);
GC9A01_WriteCommand(0xC9);
GC9A01_WriteData(0x22);
GC9A01_WriteCommand(0xBE);
GC9A01_WriteData(0x11);
GC9A01_WriteCommand(0xE1);
GC9A01_WriteData(0x10);
GC9A01_WriteData(0x0E);
GC9A01_WriteCommand(0xDF);
GC9A01_WriteData(0x21);
GC9A01_WriteData(0x0c);
GC9A01_WriteData(0x02);
GC9A01_WriteCommand(0xF0);
GC9A01_WriteData(0x45);
GC9A01_WriteData(0x09);
GC9A01_WriteData(0x08);
GC9A01_WriteData(0x08);
GC9A01_WriteData(0x26);
GC9A01_WriteData(0x2A);
GC9A01_WriteCommand(0xF1);
GC9A01_WriteData(0x43);
GC9A01_WriteData(0x70);
GC9A01_WriteData(0x72);
GC9A01_WriteData(0x36);
GC9A01_WriteData(0x37);
GC9A01_WriteData(0x6F);
GC9A01_WriteCommand(0xF2);
GC9A01_WriteData(0x45);
GC9A01_WriteData(0x09);
GC9A01_WriteData(0x08);
GC9A01_WriteData(0x08);
GC9A01_WriteData(0x26);
GC9A01_WriteData(0x2A);
GC9A01_WriteCommand(0xF3);
GC9A01_WriteData(0x43);
GC9A01_WriteData(0x70);
GC9A01_WriteData(0x72);
GC9A01_WriteData(0x36);
GC9A01_WriteData(0x37);
GC9A01_WriteData(0x6F);
GC9A01_WriteCommand(0xED);
GC9A01_WriteData(0x1B);
GC9A01_WriteData(0x0B);
GC9A01_WriteCommand(0xAE);
GC9A01_WriteData(0x77);
GC9A01_WriteCommand(0xCD);
GC9A01_WriteData(0x63);
GC9A01_WriteCommand(0x70);
GC9A01_WriteData(0x07);
GC9A01_WriteData(0x07);
GC9A01_WriteData(0x04);
GC9A01_WriteData(0x0E);
GC9A01_WriteData(0x0F);
GC9A01_WriteData(0x09);
GC9A01_WriteData(0x07);
GC9A01_WriteData(0x08);
GC9A01_WriteData(0x03);
GC9A01_WriteCommand(0xE8);
GC9A01_WriteData(0x34);
GC9A01_WriteCommand(0x62);
GC9A01_WriteData(0x18);
GC9A01_WriteData(0x0D);
GC9A01_WriteData(0x71);
GC9A01_WriteData(0xED);
GC9A01_WriteData(0x70);
GC9A01_WriteData(0x70);
GC9A01_WriteData(0x18);
GC9A01_WriteData(0x0F);
GC9A01_WriteData(0x71);
GC9A01_WriteData(0xEF);
GC9A01_WriteData(0x70);
GC9A01_WriteData(0x70);
GC9A01_WriteCommand(0x63);
GC9A01_WriteData(0x18);
GC9A01_WriteData(0x11);
GC9A01_WriteData(0x71);
GC9A01_WriteData(0xF1);
GC9A01_WriteData(0x70);
GC9A01_WriteData(0x70);
GC9A01_WriteData(0x18);
GC9A01_WriteData(0x13);
GC9A01_WriteData(0x71);
GC9A01_WriteData(0xF3);
GC9A01_WriteData(0x70);
GC9A01_WriteData(0x70);
GC9A01_WriteCommand(0x64);
GC9A01_WriteData(0x28);
GC9A01_WriteData(0x29);
GC9A01_WriteData(0xF1);
GC9A01_WriteData(0x01);
GC9A01_WriteData(0xF1);
GC9A01_WriteData(0x00);
GC9A01_WriteData(0x07);
GC9A01_WriteCommand(0x66);
GC9A01_WriteData(0x3C);
GC9A01_WriteData(0x00);
GC9A01_WriteData(0xCD);
GC9A01_WriteData(0x67);
GC9A01_WriteData(0x45);
GC9A01_WriteData(0x45);
GC9A01_WriteData(0x10);
GC9A01_WriteData(0x00);
GC9A01_WriteData(0x00);
GC9A01_WriteData(0x00);
GC9A01_WriteCommand(0x67);
GC9A01_WriteData(0x00);
GC9A01_WriteData(0x3C);
GC9A01_WriteData(0x00);
GC9A01_WriteData(0x00);
GC9A01_WriteData(0x00);
GC9A01_WriteData(0x01);
GC9A01_WriteData(0x54);
GC9A01_WriteData(0x10);
GC9A01_WriteData(0x32);
GC9A01_WriteData(0x98);
GC9A01_WriteCommand(0x74);
GC9A01_WriteData(0x10);
GC9A01_WriteData(0x85);
GC9A01_WriteData(0x80);
GC9A01_WriteData(0x00);
GC9A01_WriteData(0x00);
GC9A01_WriteData(0x4E);
GC9A01_WriteData(0x00);
GC9A01_WriteCommand(0x98);
GC9A01_WriteData(0x3e);
GC9A01_WriteData(0x07);
GC9A01_WriteCommand(0x35);
GC9A01_WriteCommand(0x21);
GC9A01_WriteCommand(0x11);
BASE_FUNC_DELAY_MS(120);
GC9A01_WriteCommand(0x29);
BASE_FUNC_DELAY_MS(20);
}
gc9a01_driver.h
#ifndef GC9A01_DRIVER_H
#define GC9A01_DRIVER_H
#include <stdint.h> // 标准整数类型定义
#include "spi.h" // 包含 SPI 接口头文件
#include "gpio.h" // 包含 GPIO 接口头文件
// #include "lvgl.h"
// GC9A01屏幕长宽定义
#define GC9A01_WIDTH 240 // GC9A01显示屏的宽度为240像素
#define GC9A01_HEIGHT 240 // GC9A01显示屏的高度为240像素
// 基本颜色定义
#define GC9A01A_BLACK 0x0000 ///< 0, 0, 0
#define GC9A01A_NAVY 0x000F ///< 0, 0, 123
#define GC9A01A_DARKGREEN 0x03E0 ///< 0, 125, 0
#define GC9A01A_DARKCYAN 0x03EF ///< 0, 125, 123
#define GC9A01A_MAROON 0x7800 ///< 123, 0, 0
#define GC9A01A_PURPLE 0x780F ///< 123, 0, 123
#define GC9A01A_OLIVE 0x7BE0 ///< 123, 125, 0
#define GC9A01A_LIGHTGREY 0xC618 ///< 198, 195, 198
#define GC9A01A_DARKGREY 0x7BEF ///< 123, 125, 123
#define GC9A01A_BLUE 0x001F ///< 0, 0, 255
#define GC9A01A_GREEN 0x07E0 ///< 0, 255, 0
#define GC9A01A_CYAN 0x07FF ///< 0, 255, 255
#define GC9A01A_RED 0xF800 ///< 255, 0, 0
#define GC9A01A_MAGENTA 0xF81F ///< 255, 0, 255
#define GC9A01A_YELLOW 0xFFE0 ///< 255, 255, 0
#define GC9A01A_WHITE 0xFFFF ///< 255, 255, 255
#define GC9A01A_ORANGE 0xFD20 ///< 255, 165, 0
#define GC9A01A_GREENYELLOW 0xAFE5 ///< 173, 255, 41
#define GC9A01A_PINK 0xFC18 ///< 255, 130, 198
// 函数原型声明
void GC9A01_init(void);
void GC9A01_Reset(void);
void GC9A01_WriteCommand(uint8_t cmd);
void GC9A01_WriteData(uint8_t data);
void GC9A01_SetAddressWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1);
void GC9A01_FillScreen(uint16_t color);
void GC9A01_DrawPixel(uint16_t x, uint16_t y, uint16_t color);
void gc9a01_flush_cb(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p);
#endif // GC9A01_H
把这两个文件写在middleware
再写一个lcd_sample.c和lcd_sample.h
lcd_sample.c如下
#include "debug.h"
#include "gpio.h"
#include "main.h"
#include "gc9a01_driver.h"
// #include "lvgl.h"
void Lcd_Sample(void)
{
SystemInit();
GC9A01_init();
DBG_PRINTF("init_success! \r\n");
// GC9A01_DrawPixel(150, 150, GC9A01A_RED);
// GC9A01_DrawPixel(160, 160, GC9A01A_YELLOW);
GC9A01_FillScreen(GC9A01A_RED);
}
lcd_sample.h如下
#ifndef LCD_SAMPLE_H
#define LCD_SAMPLE_H
void Lcd_Sample(void);
#endif
main.c如下
/**
* @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved.
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
* following conditions are met:
* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following
* disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote
* products derived from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* @file main.c
* @author MCU Driver Team
* @brief Main program body.
*/
#include "typedefs.h"
#include "feature.h"
#include "main.h"
/* USER CODE BEGIN 0 */
/* USER CODE 区域内代码不会被覆盖,区域外会被生成的默认代码覆盖(其余USER CODE 区域同理) */
/* 建议用户放置头文件 */
#include "gc9a01_driver.h"
#include "lcd_sample.h"
/* USER CODE END 0 */
UART_Handle g_uart0;
SPI_Handle g_spi1;
/* USER CODE BEGIN 1 */
/* 建议用户定义全局变量、结构体、宏定义或函数声明等 */
// GPIO_Handle g_gpio3_0;
GPIO_Handle g_gpio4_4;
GPIO_Handle g_gpio4_5;
/* USER CODE END 1 */
int main(void)
{
/* USER CODE BEGIN 2 */
/* 建议用户放置初始化代码或启动代码等 */
/* USER CODE END 2 */
// GPIO_KeySample();
/* USER CODE BEGIN 3 */
/* 建议用户放置初始配置代码 */
Lcd_Sample();
/* USER CODE END 3 */
while (1) {
/* USER CODE BEGIN 4 */
/* 建议用户放置周期性执行代码 */
/* USER CODE END 4 */
}
/* USER CODE BEGIN 5 */
/* 建议用户放置代码流程 */
/* USER CODE END 5 */
return BASE_STATUS_OK;
}
/* USER CODE BEGIN 6 */
/* 建议用户放置自定义函数 */
/* USER CODE END 6 */
main.h如下
/**
* @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved.
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
* following conditions are met:
* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following
* disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote
* products derived from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* @file main.h
* @author MCU Driver Team
* @brief This file contains driver init functions.
*/
/* Define to prevent recursive inclusion ------------------------------------- */
#ifndef McuMagicTag_SYSTEM_INIT_H
#define McuMagicTag_SYSTEM_INIT_H
#include "uart.h"
#include "uart_ex.h"
#include "spi.h"
#include "spi_ex.h"
#include "gpio.h"
#include "crg.h"
#include "iocmg.h"
#include "lvgl.h"
#define IO_SPEED_FAST 0x00U
#define IO_SPEED_SLOW 0x01U
#define IO_DRV_LEVEL4 0x00U
#define IO_DRV_LEVEL3 0x01U
#define IO_DRV_LEVEL2 0x02U
#define IO_DRV_LEVEL1 0x03U
#define XTAL_DRV_LEVEL4 0x03U
#define XTAL_DRV_LEVEL3 0x02U
#define XTAL_DRV_LEVEL2 0x01U
#define XTAL_DRV_LEVEL1 0x00U
extern UART_Handle g_uart0;
extern SPI_Handle g_spi1;
extern GPIO_Handle g_gpio4_4;
extern GPIO_Handle g_gpio4_5;
BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect);
void SystemInit(void);
/* USER CODE BEGIN 0 */
/* USER CODE 区域内代码不会被覆盖,区域外会被生成的默认代码覆盖(其余USER CODE 区域同理) */
/* USER CODE END 0 */
#endif /* McuMagicTag_SYSTEM_INIT_H */
system_init.c如下
/**
* @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. All rights reserved.
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
* following conditions are met:
* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following
* disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote
* products derived from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* @file system_init.c
* @author MCU Driver Team
* @brief This file contains driver init functions.
*/
#include "main.h"
#include "ioconfig.h"
#include "iocmg_ip.h"
#define UART0_BAND_RATE 115200
#define SPI1_FREQ_SCR 2
#define SPI1_FREQ_CPSDVSR 2
BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect)
{
CRG_Handle crg;
crg.baseAddress = CRG;
crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC;
crg.pllPreDiv = CRG_PLL_PREDIV_5;
crg.pllFbDiv = 20; /* PLL Multiplier 20 */
crg.pllPostDiv = CRG_PLL_POSTDIV_5;
crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL;
crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3;
crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC;
crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is the div of the clk_1m in CLOCK. */
if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) {
return BASE_STATUS_ERROR;
}
*coreClkSelect = crg.coreClkSelect;
return BASE_STATUS_OK;
}
static void GPIO_Init(void)
{
HAL_CRG_IpEnableSet(GPIO4_BASE, IP_CLK_ENABLE);
g_gpio4_4.baseAddress = GPIO4;
g_gpio4_4.pins = GPIO_PIN_4;
HAL_GPIO_Init(&g_gpio4_4);
HAL_GPIO_SetDirection(&g_gpio4_4, g_gpio4_4.pins, GPIO_OUTPUT_MODE);
HAL_GPIO_SetValue(&g_gpio4_4, g_gpio4_4.pins, GPIO_LOW_LEVEL);
HAL_GPIO_SetIrqType(&g_gpio4_4, g_gpio4_4.pins, GPIO_INT_TYPE_NONE);
HAL_CRG_IpEnableSet(GPIO4_BASE, IP_CLK_ENABLE);
g_gpio4_5.baseAddress = GPIO4;
g_gpio4_5.pins = GPIO_PIN_5;
HAL_GPIO_Init(&g_gpio4_5);
HAL_GPIO_SetDirection(&g_gpio4_5, g_gpio4_5.pins, GPIO_OUTPUT_MODE);
HAL_GPIO_SetValue(&g_gpio4_5, g_gpio4_5.pins, GPIO_LOW_LEVEL);
HAL_GPIO_SetIrqType(&g_gpio4_5, g_gpio4_5.pins, GPIO_INT_TYPE_NONE);
return;
}
static void SPI1_Init(void)
{
HAL_CRG_IpEnableSet(SPI1_BASE, IP_CLK_ENABLE); /* SPI1 clock enable. */
g_spi1.baseAddress = SPI1;
g_spi1.mode = HAL_SPI_MASTER;
g_spi1.csMode = SPI_CHIP_SELECT_MODE_INTERNAL;
g_spi1.xFerMode = HAL_XFER_MODE_BLOCKING;
g_spi1.clkPolarity = HAL_SPI_CLKPOL_0;
g_spi1.clkPhase = HAL_SPI_CLKPHA_0;
g_spi1.endian = HAL_SPI_BIG_ENDIAN;
g_spi1.frameFormat = HAL_SPI_MODE_MOTOROLA;
g_spi1.dataWidth = SPI_DATA_WIDTH_8BIT;
g_spi1.freqScr = SPI1_FREQ_SCR;
g_spi1.freqCpsdvsr = SPI1_FREQ_CPSDVSR;
g_spi1.waitEn = BASE_CFG_DISABLE;
g_spi1.waitVal = 127; /* 127 is microwire wait time */
g_spi1.rxBuff = NULL;
g_spi1.txBuff = NULL;
g_spi1.transferSize = 0;
g_spi1.txCount = 0;
g_spi1.rxCount = 0;
g_spi1.state = HAL_SPI_STATE_RESET;
g_spi1.rxIntSize = SPI_RX_INTERRUPT_SIZE_1;
g_spi1.txIntSize = SPI_TX_INTERRUPT_SIZE_1;
g_spi1.rxDMABurstSize = SPI_RX_DMA_BURST_SIZE_1;
g_spi1.txDMABurstSize = SPI_TX_DMA_BURST_SIZE_1;
HAL_SPI_Init(&g_spi1);
HAL_SPI_ChipSelectChannelSet(&g_spi1, SPI_CHIP_SELECT_CHANNEL_0);
}
static void UART0_Init(void)
{
HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */
g_uart0.baseAddress = UART0;
g_uart0.baudRate = UART0_BAND_RATE;
g_uart0.dataLength = UART_DATALENGTH_8BIT;
g_uart0.stopBits = UART_STOPBITS_ONE;
g_uart0.parity = UART_PARITY_NONE;
g_uart0.txMode = UART_MODE_BLOCKING;
g_uart0.rxMode = UART_MODE_BLOCKING;
g_uart0.fifoMode = BASE_CFG_ENABLE;
g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8;
g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8;
g_uart0.hwFlowCtr = BASE_CFG_DISABLE;
g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X;
g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE;
HAL_UART_Init(&g_uart0);
}
static void IOConfig(void)
{
HAL_IOCMG_SetPinAltFuncMode(GPIO4_4_AS_GPIO4_4); /* Check function selection */
HAL_IOCMG_SetPinPullMode(GPIO4_4_AS_GPIO4_4, PULL_NONE); /* Pull-up and pull-down */
HAL_IOCMG_SetPinSchmidtMode(GPIO4_4_AS_GPIO4_4, SCHMIDT_DISABLE); /* Schmitt input on/off */
HAL_IOCMG_SetPinLevelShiftRate(GPIO4_4_AS_GPIO4_4, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */
HAL_IOCMG_SetPinDriveRate(GPIO4_4_AS_GPIO4_4, DRIVER_RATE_2); /* Output signal edge fast/slow */
HAL_IOCMG_SetPinAltFuncMode(GPIO4_5_AS_GPIO4_5); /* Check function selection */
HAL_IOCMG_SetPinPullMode(GPIO4_5_AS_GPIO4_5, PULL_NONE); /* Pull-up and pull-down */
HAL_IOCMG_SetPinSchmidtMode(GPIO4_5_AS_GPIO4_5, SCHMIDT_DISABLE); /* Schmitt input on/off */
HAL_IOCMG_SetPinLevelShiftRate(GPIO4_5_AS_GPIO4_5, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */
HAL_IOCMG_SetPinDriveRate(GPIO4_5_AS_GPIO4_5, DRIVER_RATE_2); /* Output signal edge fast/slow */
HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */
HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */
HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */
HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */
HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */
HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */
HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */
HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */
HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */
HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */
HAL_IOCMG_SetPinAltFuncMode(GPIO4_6_AS_SPI1_CLK); /* Check function selection */
HAL_IOCMG_SetPinPullMode(GPIO4_6_AS_SPI1_CLK, PULL_NONE); /* Pull-up and pull-down */
HAL_IOCMG_SetPinSchmidtMode(GPIO4_6_AS_SPI1_CLK, SCHMIDT_DISABLE); /* Schmitt input on/off */
HAL_IOCMG_SetPinLevelShiftRate(GPIO4_6_AS_SPI1_CLK, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */
HAL_IOCMG_SetPinDriveRate(GPIO4_6_AS_SPI1_CLK, DRIVER_RATE_2); /* Output signal edge fast/slow */
HAL_IOCMG_SetPinAltFuncMode(GPIO1_3_AS_SPI1_TXD); /* Check function selection */
HAL_IOCMG_SetPinPullMode(GPIO1_3_AS_SPI1_TXD, PULL_NONE); /* Pull-up and pull-down */
HAL_IOCMG_SetPinSchmidtMode(GPIO1_3_AS_SPI1_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */
HAL_IOCMG_SetPinLevelShiftRate(GPIO1_3_AS_SPI1_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */
HAL_IOCMG_SetPinDriveRate(GPIO1_3_AS_SPI1_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */
HAL_IOCMG_SetPinAltFuncMode(GPIO3_0_AS_SPI1_CSN1); /* Check function selection */
HAL_IOCMG_SetPinPullMode(GPIO3_0_AS_SPI1_CSN1, PULL_NONE); /* Pull-up and pull-down */
HAL_IOCMG_SetPinSchmidtMode(GPIO3_0_AS_SPI1_CSN1, SCHMIDT_DISABLE); /* Schmitt input on/off */
HAL_IOCMG_SetPinLevelShiftRate(GPIO3_0_AS_SPI1_CSN1, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */
HAL_IOCMG_SetPinDriveRate(GPIO3_0_AS_SPI1_CSN1, DRIVER_RATE_2); /* Output signal edge fast/slow */
HAL_IOCMG_SetPinAltFuncMode(GPIO1_4_AS_SPI1_RXD); /* Check function selection */
HAL_IOCMG_SetPinPullMode(GPIO1_4_AS_SPI1_RXD, PULL_NONE); /* Pull-up and pull-down */
HAL_IOCMG_SetPinSchmidtMode(GPIO1_4_AS_SPI1_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */
HAL_IOCMG_SetPinLevelShiftRate(GPIO1_4_AS_SPI1_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */
HAL_IOCMG_SetPinDriveRate(GPIO1_4_AS_SPI1_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */
}
void SystemInit(void)
{
IOConfig();
UART0_Init();
SPI1_Init();
GPIO_Init();
/* USER CODE BEGIN system_init */
/* USER CODE END system_init */
}
芯片配置如下
连线根据原理图找相应位置即可