【国民技术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.移植实操和过程总结
怎么搭建开发环境,传送门
总结:在过程中搭建环境或者移植中,遇到一些困难,只要认真解决,在群上多问问,多动脑子,多多动手编程,这样会发现原来是这样的,我怎么没想到~
FinSH主要用于调试、查看系统信息,也支持敲代码,不再是只看而无法输入代码。
用户在控制终端输入命令,控制终端通过通信协议的方式将命令传给N32G4FR FinSH,而FinSH会读取设备输入命令,解析并执行输出回应,将结果显示在控制终端上。
本文以串口UART1作为FinSH的输入输出端口与 PC 进行通信,描述如何在 N32G4FR开发板上实现 FinSH shell 功能。
在 RT-Thread Nano 上添加 FinSH 组件,实现FinSH功能需要开启路径:rt-thread/components/finsh,添加头文件路径和源文件。
SSD1306 IIC读写时序
SSD1306 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
#define RT_USING_RTC
#define RT_USING_SOFT_RTC
library name |
url |
RTT_SSD1306 |
传送门 |
rtt-ssd1306 API使用
3.参赛作品代码与演示视频
代码
我上传代码,在github网址/example/02SSD1306,就是SSD1306开源地址,其他项目,欢迎浏览。
传送门
#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)
#define GREEN_LED GET_PIN(B, 5)
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();
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
RUN TEST
运行测试视频