Git Product home page Git Product logo

f1c200s_library's Introduction

项目简介

该项目是为全志 F1C100S/F1C200S 所编写的库函数,编写风格模仿 STM32 标准库,使得从 STM32 过来的人更容易上手。项目已经移植了 cherryusbfatfslvglrt-thread

准备工作

操作系统

windows、linux

编辑环境

推荐使用的编辑环境为 VSCode,是一个运行于 MacOS X、Windows 和 Linux 之上的,针对于编写现代 Web 和云应用的跨平台源代码编辑器;VSCode 免费而且功能强大,对 JavaScript 和 NodeJS 的支持非常好,自带很多功能,例如代码格式化,代码智能提示补全、Emmet 插件等。

VSCode推荐插件

  • C/C++:编写 C/C++ 必需的插件。

  • Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code:VSCode 中文插件。

  • Git Graph:可图形化查看 git 历史文件。

  • vscode-pdf:可在 VSCode 中直接浏览 PDF 文件。

  • vscode-yarkdown:可进行浏览以及编辑 markdown 文件。

  • Task Buttons:可在 vscode 下方直接生成任务按钮,方便操作。

编译器

该项目编译器为 arm-none-eabi-gcc

linux 平台可直接通过终端下载

sudo apt-get update
sudo apt-get install gcc-arm-none-eabi

编译与下载

编译

在 VSCode 的菜单栏中依次点击 终端-运行任务-编译。如果有安装插件Task Buttons,可在 VSCode 下方直接点击编译。

重新编译

在 VSCode 的菜单栏中依次点击 终端-运行任务-重新编译。如果有安装插件Task Buttons,可在 VSCode 下方直接点击重新编译。

下载SPI NOR FLASH

下载前,需将板子进入 FEL 模式,然后在 VSCode 的菜单栏中依次点击 终端-运行任务-下载到SPI NOR FLASH。如果有安装插件Task Buttons,可在VSCode下方直接点击下载。

下载SPI NAND FLASH

下载前,需将板子进入 FEL 模式,然后在 VSCode 的菜单栏中依次点击 终端-运行任务-下载到SPI NAND FLASH。如果有安装插件Task Buttons,可在VSCode下方直接点击下载。

注意:

  1. linux 需要安装 libusb

  2. 库中使用的spi nand flash型号为W25N01GVZEIG,如果使用的是其他型号,需要数据手册修改bootloader/sys-spi-flash.cSPINAND_PAGE_BITS的大小.

sudo apt-get update
sudo apt install pkg-config libusb-1.0-0-dev zlib1g-dev binutils libfdt-dev 

主文件夹介绍

文件夹 简介
.gitee gitee 平台 issue 和 pr 模板
.github github 平台 issue 和 pr 模板,以及 ci 检查
1.Software 项目程序源码
2.Hardware 使用嘉立创 EDA 专业版进行绘制,项目例子都基于该线路板进行编写。

Software文件夹介绍

文件夹 简介
.vscode VSCode 配置文件
bootloader bootloader 文件
dsp dsp 库(例如arm_mean_f32)
f1cx00s_lib 模仿 stm32 风格写的库函数
hardware 外设初始化
myresoure 界面左边为 lvgl 官方例子,界面右边为库函数测试例子。其中库函数例子外设初始化以及功能函数已在hardware,界面例子包括 gpioi2cpwmsdiospiuartusb
system 任务文件、延迟等等
third_party 第三方库,包含cherryusbfatfslvglrt-thread
tools 下载程序工具、code-format 工具(需要安装 astyle)
user main 函数、链接脚本

库函数使用说明

CCU

主要用于初始化各外设时钟,例如 串口SPII2C等等。

例如

CCU_BUS2_GatingClockCmd(CCU_BUS2Gating_UART1, ENABLE);
CCU_BUS2_GatingResetCmd(CCU_BUS2Gating_UART1, ENABLE);

EXTI

初始化

void EXTI_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;
    
    GPIO_AF_Remap(GPIOE, GPIO_PinSource3, GPIO_AF_PE3_EINTE3);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_DriveCurrent = GPIO_DriveCurrent_Level3;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOE, &GPIO_InitStructure);
    
    EXTI_InitStructure.EXTI_Line = EXTI_Line_3;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_Init(EXTIE, &EXTI_InitStructure);
    
    rt_hw_interrupt_install(PIOE_INTERRUPT, EXTIE_IRQHandler, NULL, "exite_irq");
    rt_hw_interrupt_umask(PIOE_INTERRUPT);
}

中断

void EXTIE_IRQHandler(int irqno, void *param)
{
  if (EXTI_GetFlagStatus(EXTIE, EXTI_Line_3) == SET)
  {
    /* 
        your code
    */
    EXTI_ClearFlag(EXTIE, EXTI_Line_3);
  }
}

GPIO

初始化

void GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_DriveCurrent = GPIO_DriveCurrent_Level3;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOE, &GPIO_InitStructure);
}

置0

GPIO_ResetBits(GPIOE, GPIO_Pin_5);

置1

GPIO_SetBits(GPIOE, GPIO_Pin_5);

I2C

初始化

void I2C_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    I2C_InitTypeDef I2C_InitStructure;
    
    CCU_BUS2_GatingClockCmd(CCU_BUS2Gating_I2C0, ENABLE);
    CCU_BUS2_GatingResetCmd(CCU_BUS2Gating_I2C0, ENABLE);
    
    GPIO_AF_Remap(GPIOE, GPIO_PinSource11, GPIO_AF_PE11_I2C0_SCK);
    GPIO_AF_Remap(GPIOE, GPIO_PinSource12, GPIO_AF_PE12_I2C0_SDA);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_DriveCurrent = GPIO_DriveCurrent_Level3;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOE, &GPIO_InitStructure);
    
    I2C_DeInit(I2C0);
    I2C_InitStructure.SlaveAddress = I2C_ADDR;
    I2C_InitStructure.ClockSpeed = 400 * 1000;
    I2C_Init(I2C0, &I2C_InitStructure);
    
    I2C_Cmd(I2C0, ENABLE);
}

写操作

I2C_Write_Reg(GT911_I2C, I2C_REG_SIZE_16BIT, reg, buf, len);

读操作

I2C_Read_Reg(GT911_I2C, I2C_REG_SIZE_16BIT, reg, buf, len);

LCD

例子查看hardware/src/lcd.c

请根据液晶屏的数据手册修改相应参数,请在hardware/inc/lcd.h中修改。

// LCD驱动参数设置
#define LCD_FREQ 30000000 //30Mhz 屏幕时钟
#define MY_DISP_HOR_RES 800 //屏幕水平分辨率
#define MY_DISP_VER_RES 480 //屏幕垂直分辨率

#define LCD_HOR_PULSE_WIDTH 8 // 水平脉宽
#define LCD_HOR_BACK_PORCH 8 // 水平后廊
#define LCD_HOR_FRONT_PORCH 4 // 水平前廊

#define LCD_VER_PULSE_WIDTH 8 // 垂直脉宽
#define LCD_VER_BACK_PORCH 10 // 垂直后廊
#define LCD_VER_FRONT_PORCH 4 // 垂直前廊

PWM

初始化

void PWM_Config(void)
{
    PWM_InitTypeDef PWM_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    
    GPIO_AF_Remap(GPIOE, GPIO_PinSource6, GPIO_AF_PE6_PWM1);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_DriveCurrent = GPIO_DriveCurrent_Level3;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOE, &GPIO_InitStructure);
    
    PWM_InitStructure.channel = PWM_CHANNEL_1;
    PWM_InitStructure.duty_cycle = 0;
    PWM_InitStructure.period = 463000; // 2160hz :1000000000/463000
    PWM_InitStructure.polarity = 1;
    PWM_Init(&PWM_InitStructure);
    
    PWM_Cmd(PWM_CHANNEL_1, ENABLE);
}

修改PWM占空比

PWM_Set_Duty(PWM_CHANNEL_1, value);

SDIO

初始化例子可查看hardware/src/sdcard.c。需移植FATFS进行使用,移植例子third_party/fatfs/diskio.c

SPI

初始化

void SPI_Config(void)
{
    SPI_InitTypeDef SPI_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    
    CCU_BUS0_GatingClockCmd(CCU_BUS0Gating_SPI0, ENABLE);
    CCU_BUS0_GatingResetCmd(CCU_BUS0Gating_SPI0, ENABLE);
    
    GPIO_AF_Remap(GPIOC, GPIO_PinSource0, GPIO_AF_PC0_SPI0_CLK);
    GPIO_AF_Remap(GPIOC, GPIO_PinSource2, GPIO_AF_PC2_SPI0_MISO);
    GPIO_AF_Remap(GPIOC, GPIO_PinSource3, GPIO_AF_PC3_SPI0_MOSI);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2 | GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_DriveCurrent = GPIO_DriveCurrent_Level3;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    
    /*W25QXX_CS*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_DriveCurrent = GPIO_DriveCurrent_Level3;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    
    W25QXX_CS = 1;
    
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_Init(SPI0, &SPI_InitStructure);
    
    SPI_Cmd(SPI0, ENABLE); // 使能SPI外设
}

写操作

SPI_TransmitData8(SPI0, TxData);

读操作

SPI_ReceiveData8(SPI0);

UART

初始化

void UART_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    UART_InitTypeDef UART_InitStructure;
    
    GPIO_AF_Remap(GPIOA, GPIO_PinSource2, GPIO_AF_PA2_UART1_RX);
    GPIO_AF_Remap(GPIOA, GPIO_PinSource3, GPIO_AF_PA3_UART1_TX);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_DriveCurrent = GPIO_DriveCurrent_Level3;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    CCU_BUS2_GatingClockCmd(CCU_BUS2Gating_UART1, ENABLE);
    CCU_BUS2_GatingResetCmd(CCU_BUS2Gating_UART1, ENABLE);
    
    UART_InitStructure.UART_BaudRate = 115200;
    UART_InitStructure.UART_WordLength = UART_WordLength_8b;
    UART_InitStructure.UART_StopBits = UART_StopBits_1;
    UART_InitStructure.UART_Parity = UART_Parity_No;
    UART_Init(UART1, &UART_InitStructure);
    
    UART_ITConfig(UART1, UART_IT_ERBFI, ENABLE);
    
    rt_hw_interrupt_install(UART1_INTERRUPT, UART1_IRQHandler, NULL, "uart1_irq");
    rt_hw_interrupt_umask(UART1_INTERRUPT);
}

写操作

for(uint16_t i = 0; i < strlen((char *)uart_Data.TXD_BUF); i++)
{
  UART_SendData(UART1, uart_Data.TXD_BUF[i]);
  while(UART_Get_Status(UART1, UART_USR_TFNF) != SET)
  {
  }
}

读操作

UART_ReceiveData(UART1);

USB

使用USB功能,需要配合Cherryusb进行使用。

主机

使用主机前,请在 user/common.h 中定义

#define TEST_USB_MODE TEST_USB_MODE_HOST

初始化例子可查看 hardware/src/usbh_msc_config.c。主机还需移植FATFS进行使用,移植例子third_party/fatfs/diskio.c

设备

使用设备前,请在 user/common.h 中定义

#define TEST_USB_MODE TEST_USB_MODE_DEVICE

初始化例子可查看 hardware/src/usbd_msc_config.c

WDOG

初始化

void WDOG_Config(void)
{
    WDOG_Set_Mode(WDOG_RST_MODE);
    WDOG_Set_Value(1);//喂狗周期为1s
    WDOG_Enable();
}

喂狗

WDOG_Feed();

f1c200s_library's People

Contributors

lhdjply avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

f1c200s_library's Issues

SDMMC驱动不正常,SD_InitializeCards返回超时错误(master)

软件版本

  • 软件已更新到最新版本

您使用的场景?

访问SD卡文件系统

您做了什么操作?

main函数中注释掉大部分任务,只留下UART_task,而SDIO_task设置与启动迁移至UART_task末尾执行,以便在SDIO_task能使用printf打印一些执行情况

您遇到了什么问题?

SD_Init中,执行SD_InitializeCards时返回超时错误
具体为其中的Send CMD9 SEND_CSD部分,发送完命令后,CmdResp2Error等待命令响应超时
(master分支表现如上,LVGL8.3分支也尝试了一下,结果类似,SD_Init返回超时,但暂时没去细测是否表现与master完全一致)

您期望的结果是怎样的?

想正常读写SD卡

Uart里My_Printf死机问题

软件版本

  • 软件已更新到最新版本

您使用的场景?

用的F1C100S芯片,windows平台,vscode

您做了什么操作?

在‘UART_IDLE_task(void * p)’函数内打印串口接收到的内容

static void UART_IDLE_task(void * p)
{
  while(1)
  {
    uart_idle(&uart_Data);

    if(uart_Data.receive_complete_flag == 1)
    {
      uart_Data.receive_complete_flag = 0;

      My_Printf("rxlen=%d,%s",uart_Data.len,uart_Data.RXD_BUF);
    }

    rt_thread_mdelay(1);
  }
}

您遇到了什么问题?

在原有的void My_Printf(char * fmt, ...)函数里使用了'uart_Data.TXD_BUF'作为vsprintf的格式化字符串缓存区,但在实际使用过程中,会造成死机现象。尝试定位问题,最后在函数内部创建一个局部数组作为缓存,就不会死机。我修改后的函数如下:

void My_Printf(char * fmt, ...)
{
  uint32_t i,len;
  va_list p;
  char buf[500];

  rt_enter_critical();
  va_start(p, fmt);
  len = vsnprintf(buf,499,fmt, p);
  va_end(p);

  for(i = 0; i < len; i++)
  {
    UART_SendData(UART1, buf[i]);
    while(UART_Get_Status(UART1, UART_USR_TFNF) != SET);
  }

  rt_exit_critical();
}

您期望的结果是怎样的?

麻烦有时间看下具体原因。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.