国民技术
直播中

rx_ted

4年用户 101经验值
擅长:嵌入式技术
私信 关注

【国民技术N32项目移植】ssd1306项目移植

【国民技术N32项目移植】ssd1306项目移植

国民技术和RT-Thread合作,于是做了一个基于RT-Thread框架开发一个可视化界面,例如接口有GPIO、UART、I2C等等。

1.芯片资源

接口 描述
GPIO 点灯,熄灯
UART 串口,finsh
I2C ssd1306可视化
... ...

GPIO怎么接

点亮LED灯是GPIO的基础功能之一。如何让LED闪烁。

引脚 序号 描述
PB5 D3 点灯,熄灯
PA8 D1 点灯,熄灯

UART怎么接

UART是默认选UART1,如何让单片机发送接收消息。

引脚 序号 描述
PA9 RXD 串口接收
PA10 TXD 串口发送

I2C怎么接

I2C是默认选I2C1,如何让单片机连接SSD1306屏幕。

引脚 序号 描述
PB8 SCLK I2C时钟
PB9 SDA I2C读写数据

2.移植实操和过程总结

  • 1、N32G4FR在RT-Thread上正常运行

    平台上可以选择VS CODE 或者是Keil5,我选择前者。

    需要的工具:

    vscode

    arm-eabi-none-gcc(大多数是C语言)

    EIDE

    烧录工具:pwlink、swd,等

    移植库包(SDK、Core,Example等等)

怎么搭建开发环境,传送门

总结:在过程中搭建环境或者移植中,遇到一些困难,只要认真解决,在群上多问问,多动脑子,多多动手编程,这样会发现原来是这样的,我怎么没想到~

  • 2、N32G4FR在finsh上正常运行

FinSH主要用于调试、查看系统信息,也支持敲代码,不再是只看而无法输入代码。

用户在控制终端输入命令,控制终端通过通信协议的方式将命令传给N32G4FR FinSH,而FinSH会读取设备输入命令,解析并执行输出回应,将结果显示在控制终端上。

本文以串口UART1作为FinSH的输入输出端口与 PC 进行通信,描述如何在 N32G4FR开发板上实现 FinSH shell 功能。

在 RT-Thread Nano 上添加 FinSH 组件,实现FinSH功能需要开启路径:rt-thread/components/finsh,添加头文件路径和源文件。

  • 3、N32G4FR在SSD1306上正常运行

SSD1306 IIC读写时序

IIC读写时序

SSD1306 INIT初始化流程

init初始化流程

基于RT-Thread实现,OLED的I2C驱动都是自己修改,因为使用硬件IIC不能与库兼容起来,如果需要兼容则需要修改源码,目前已实现。其他人开发的库,包括I2C和SPI,但我只是删除了SPI函数,目前正常。

我选择RT_USING_I2C,且设置I2C1,速率就默认好了。

在rtconfig.h上面编辑

copy Previous file to this project, called rtconfig.h.

add other functions, such as ~~~~

#define RT_USING_I2C
#define RT_USING_I2C2 //can choice RT_USING_I2C1 or RT_USING_I2C3
#define RT_USING_RTC  // update date, but this isn't what is needed.
#define RT_USING_SOFT_RTC  // can't need this
//last two lines can be commented.
library name url
RTT_SSD1306 传送门

rtt-ssd1306 API使用

3.参赛作品代码与演示视频

代码

我上传代码,在github网址/example/02SSD1306,就是SSD1306开源地址,其他项目,欢迎浏览。

传送门

/*
 * @Author: rx-ted
 * @Date: 2023-01-20 19:52:12
 * @LastEditors: rx-ted
 * @LastEditTime: 2023-02-05 11:34:02
 */

#include "ssd1306.h"
#include <drv_gpio.h>
#include <drv_hwtimer.h>
#include <drv_usart.h>
#include <hwtimer.h>
#include <rtc.h>
#include <rtthread.h>
#include <serial.h>
#include <stdio.h>

#define RED_LED   GET_PIN(A, 8) // red led
#define GREEN_LED GET_PIN(B, 5) // red led

ALIGN(RT_ALIGN_SIZE)

void ssd1306_TestBorder()
{
    ssd1306_Fill(Black);

    u32 start = rt_tick_get();
    u32 end   = start;
    uint8_t x = 0;
    uint8_t y = 0;
    do {
        ssd1306_DrawPixel(x, y, Black);

        if ((y == 0) && (x < 127))
            x++;
        else if ((x == 127) && (y < 31))
            y++;
        else if ((y == 31) && (x > 0))
            x--;
        else
            y--;

        ssd1306_DrawPixel(x, y, White);
        ssd1306_UpdateScreen();

        rt_thread_mdelay(5);
        end = rt_tick_get();
    } while ((end - start) < 2000);

    rt_thread_mdelay(1000);
}

void ssd1306_TestFonts()
{
    ssd1306_Fill(Black);
    ssd1306_SetCursor(2, 0);
    ssd1306_WriteString("Font 16x26", Font_16x26, White);
    ssd1306_UpdateScreen();
    rt_thread_mdelay(1000);
    ssd1306_Fill(Black);
    ssd1306_SetCursor(2, 0);
    ssd1306_WriteString("Font 11x18", Font_11x18, White);
    ssd1306_UpdateScreen();
    rt_thread_mdelay(1000);
    ssd1306_Fill(Black);
    ssd1306_SetCursor(2, 0);
    ssd1306_WriteString("Font 7x10", Font_7x10, White);
    ssd1306_SetCursor(2, 10);
    ssd1306_WriteString("Font 6x8", Font_6x8, White);
    ssd1306_UpdateScreen();
}

void ssd1306_TestFPS()
{
    ssd1306_Fill(White);

    ssd1306_SetCursor(2, 0);
    ssd1306_WriteString("Test-", Font_7x10, Black);
    ssd1306_UpdateScreen();
    // ssd1306_Fill(White);
    // ssd1306_UpdateScreen();
    u32 start      = rt_tick_get();
    u32 end        = start;
    int fps        = 0;
    char message[] = "ABCDEFGHIJK";
    char buff[20];
    do {
        snprintf(buff, sizeof(buff), "FPS:%.2f", fps / ((end - start) / 1000.0));
        ssd1306_SetCursor(46, 15);
        ssd1306_WriteString(message, Font_7x10, Black);
        ssd1306_SetCursor(40, 0);
        ssd1306_WriteString(buff, Font_7x10, Black);
        ssd1306_UpdateScreen();

        char ch = message[0];
        memmove(message, message + 1, sizeof(message) - 2);
        message[sizeof(message) - 2] = ch;

        fps++;
        end = rt_tick_get();
    } while ((end - start) < 1000);

    rt_thread_mdelay(1000);
}

void ssd1306_TestLine()
{
    ssd1306_Line(1, 1, SSD1306_WIDTH - 1, SSD1306_HEIGHT - 1, White);
    ssd1306_Line(SSD1306_WIDTH - 1, 1, 1, SSD1306_HEIGHT - 1, White);
    ssd1306_UpdateScreen();
    return;
}

void ssd1306_TestRectangle()
{
    u32 delta;

    for (delta = 0; delta < 5; delta++)
    {
        ssd1306_DrawRectangle(1 + (5 * delta), 1 + (5 * delta), SSD1306_WIDTH - 1 - (5 * delta), SSD1306_HEIGHT - 1 - (5 * delta), White);
    }
    ssd1306_UpdateScreen();
    return;
}

void ssd1306_TestCircle()
{
    u32 delta;

    for (delta = 0; delta < 5; delta++)
    {
        ssd1306_DrawCircle(20 * delta + 30, 30, 10, White);
    }
    ssd1306_UpdateScreen();
    return;
}

void ssd1306_TestArc()
{
    ssd1306_DrawArc(30, 30, 30, 20, 270, White);
    ssd1306_UpdateScreen();
    return;
}

void ssd1306_TestPolyline()
{
    SSD1306_VERTEX loc_vertex[] =
        {
            {35, 40},
            {40, 20},
            {45, 28},
            {50, 10},
            {45, 16},
            {50, 10},
            {53, 16}};

    ssd1306_Polyline(loc_vertex, sizeof(loc_vertex) / sizeof(loc_vertex[0]), White);
    ssd1306_UpdateScreen();
    return;
}

void ssd1306_TestAll()
{

    ssd1306_TestFPS();
    rt_thread_mdelay(3000);

    ssd1306_TestBorder();

    ssd1306_TestFonts();
    rt_thread_mdelay(3000);

    ssd1306_Fill(Black);
    ssd1306_TestRectangle();
    ssd1306_TestLine();
    rt_thread_mdelay(3000);

    ssd1306_Fill(Black);
    ssd1306_TestPolyline();
    rt_thread_mdelay(3000);

    ssd1306_Fill(Black);
    ssd1306_TestArc();
    rt_thread_mdelay(3000);

    ssd1306_Fill(Black);
    ssd1306_TestCircle();
    rt_thread_mdelay(3000);
}
int main(void)
{
    ssd1306_Init();
    while (1)
    {
        ssd1306_TestAll();
    }
    return 0;
}

#ifdef FINSH_USING_MSH
MSH_CMD_EXPORT(ssd1306_TestAll, test ssd1306 oled driver);
#endif
// MSH_CMD_EXPORT(IR, "ir example");

RUN TEST

运行测试视频

ssd1306运行演示

更多回帖

发帖
×
20
完善资料,
赚取积分