如何试管婴儿冻胚移植流程ugfx流程

1116人阅读
STM32(23)
IAR7.4+STM32CUBEMX调试通过。
显示部分,作为麦知智能小车的一部分。显示屏是OLED 1.3寸,控制器是sh1106,但像素是128*64,价格达到惊人的45元/片。
只提供代码,而不同时说明硬件电路图,是导致情景不能复现的主要原因。
这个是委托方提供的原理图和硬件,他每条线都有上拉电阻,显然是打算用模拟SPI。
我在代码里,将cs,dc,res配置为开漏输出,或者推挽输出,都可以正常显示图像。
不知道cs,dc,res在推挽模式下,会不会有问题,所以使用cube配置为OD,低速,而SCLK,SDA默认为PP(配置SPI的默认设置)
与ugfx接口的底层驱动:
&/pre&&p&&pre name=&code& class=&cpp&&/*
* This file is subject to the terms of the GFX License. If a copy of
* the license was not distributed with this file, you can obtain one at:
http://ugfx.org/license.html
* file: board_SSD1306.h
* author: yu
boards/addons/gdisp/board_SSD1306_spi.h
GDISP Graphic Driver subsystem board interface for the SSD1306 display.
* @note This file contains a mix of hardware specific and operating system specific
code. You will need to change it for your CPU and/or operating system.
#ifndef _GDISP_LLD_BOARD_H
#define _GDISP_LLD_BOARD_H
#include &stm32f1xx_hal.h&
#include &cmsis_os.h&
// The command byte to put on the front of each page line
//#define SSD1306_PAGE_PREFIX
// Co = 0, D/C = 1
// For a multiple display configuration we would put all this in a structure and then
// set g-&board to that structure.
#define OLED_DC_Port
#define OLED_DC_Pin
(GPIO_PIN_15)
#define OLED_CS_Port
#define OLED_CS_Pin
(GPIO_PIN_8)
#define OLED_RES_Port
#define OLED_RES_Pin
(GPIO_PIN_14)
#define OLED_RES(a) if (a) \
HAL_GPIO_WritePin(OLED_RES_Port,OLED_RES_Pin, GPIO_PIN_SET);\
HAL_GPIO_WritePin(OLED_RES_Port,OLED_RES_Pin, GPIO_PIN_RESET)
#define OLED_DC(a) if (a) \
HAL_GPIO_WritePin(OLED_DC_Port,OLED_DC_Pin, GPIO_PIN_SET);\
HAL_GPIO_WritePin(OLED_DC_Port,OLED_DC_Pin, GPIO_PIN_RESET)
#define OLED_CS(a) if (a) \
HAL_GPIO_WritePin(OLED_CS_Port,OLED_CS_Pin, GPIO_PIN_SET);\
HAL_GPIO_WritePin(OLED_CS_Port,OLED_CS_Pin, GPIO_PIN_RESET)
#define SET_RST HAL_GPIO_WritePin(OLED_RES_Port, OLED_RES_Pin, GPIO_PIN_SET);
#define CLR_RST HAL_GPIO_WritePin(OLED_RES_Port, OLED_RES_Pin, GPIO_PIN_RESET);
extern SPI_HandleTypeDef hspi1;
static void init_board(GDisplay *g) {
// As we are not using multiple displays we set g-&board to NULL as we don't use it.
g-&board = 0;
static void post_init_board(GDisplay *g) {
static void setpin_reset(GDisplay *g, bool_t state) {
static void acquire_bus(GDisplay *g) {
static void release_bus(GDisplay *g) {
static void write_cmd(GDisplay *g, uint8_t cmd) {
OLED_DC(0);
OLED_CS(0);
HAL_SPI_Transmit(&hspi1, &cmd, 1, 1);
OLED_CS(1);
static void write_data(GDisplay *g, uint8_t* data, uint16_t length) {
OLED_DC(1);
OLED_CS(0);
HAL_StatusTypeDef status = HAL_SPI_Transmit(&hspi1, data, length, 20);
if (status != HAL_OK) {
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_SET);
HAL_Delay(200);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_RESET);
OLED_CS(1);
ugfx默认支持chibios,是其一部分,使用IAR编译,会有警告,只能忽略,还没看到什么不良影响。
外设初始化代码,由CUBE生成,在此不需列出。
使用demo里面的代码,画一个矩形。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:703997次
积分:9150
积分:9150
排名:第1667名
原创:208篇
转载:37篇
译文:31篇
评论:56条
(2)(2)(1)(2)(5)(2)(3)(1)(2)(2)(7)(3)(2)(9)(1)(4)(1)(2)(3)(1)(2)(2)(3)(2)(4)(3)(7)(7)(2)(3)(4)(3)(1)(4)(5)(2)(2)(5)(7)(6)(3)(5)(7)(4)(5)(1)(8)(6)(4)(9)(11)(12)(6)(8)(3)(3)(3)(8)(6)(6)(8)(12)(5)(4)uGFX is a lightweight embedded library for displays and touchscreens providing everything required to build a fully featured embedded GUI.
The library is very small and fast because every unused feature is disabled and not linked into the finished binary.
Lightweight
Sources 100% open
Actively Developed
中文大概就是:轻量级,功能全,模块化,开源
移植硬件环境
主控:M451RG6AE
显示屏:OLED12864(SSD1306)SPI接口
系统开发环境
开发软件:CooCox CoIDE v2
编译器:GNU Tools ARM Embedded\4.7 2014q2
嵌入式RTOS:FreeRTOS8.2.1
第一步:完成SSD1306底层驱动
初始化函数:
void OLED_InitHard(void)
写命令函数:
void OLED_WriteCmd(u8 cmd)
写数据函数:
void OLED_WriteData(u8 dat)
第二步:拷贝ugfx源码到工程文件。然后实现基层接口函数
ugfx也是分好几层的,基本层,绘制层,窗口层等。我们主要移植基本层和绘制层,这个两个做好之后,窗口层就是配置问题。
首先将我们要用到的源码里面ssd1306的驱动文件,拷贝出来放在我们的工程文件下,另外还有
gfxconfig.h
然后就是源码文件/src下的文件加入工程。整体框架图:
最好我们就关心ugfx底层接口函数与ssd1306驱动的对接函数实现。
void init_board(GDisplay *g);
void post_init_board(GDisplay *g) ;
void setpin_reset(GDisplay *g, bool_t state);
void acquire_bus(GDisplay *g) ;
void release_bus(GDisplay *g) ;
void write_cmd(GDisplay *g, uint8_t cmd);
void write_data(GDisplay *g, uint8_t* data, uint16_t length);
然后我们要实现上面的三个主要函数,其它的可选:
init_board(GDisplay *g)
OLED_InitHard();
void post_init_board(GDisplay *g)
void setpin_reset(GDisplay *g, bool_t state)
void acquire_bus(GDisplay *g)
void release_bus(GDisplay *g)
void write_cmd(GDisplay *g, uint8_t cmd)
OLED_WriteCmd(cmd);
void write_data(GDisplay *g, uint8_t* data, uint16_t length)
int count=0;
for(count=0;count&count++)
OLED_WriteData(data[count]);
第三步:添加用户要实现的函数
主要有四个函数要实现,在你对应得文件下实现,例如我是下“gdisp_lld_SSD1306.c”下实现的:
void gfxSleepMicroseconds(us)
bsp_DelayUs(us);
void gfxSleepMilliseconds(ms)
bsp_DelayMS(ms);
void *gfxAlloc(u32 size)
xxx=malloc(size);
void gfxFree(void *ptr)
free(ptr);
第四步:编译,调错
完成上面的过程中,你肯定会遇到很多问题。我就是解决错误都用了一天呀。很多问题只能根据报错,然后自己的经验一点一点解决呀。
1:头文件包含不对,找不到相关定义申明
2:函数没有实现,链接找不到
3:各种宏定义开启关闭等
第五步:调用例子
在源文件里有相关例子。参考里面的配置和主函数来实现最基本的画点,画圆操作。
// Initialize and clear the display
gfxInit();
// Get the screen size
width = gdispGetWidth();
height = gdispGetHeight();
// Code Here
gdispDrawBox(10, 10, width/2, height/2, Yellow);
gdispFillArea(width/2, height/2, width/2-10, height/2-10, Blue);
gdispDrawLine(5, 30, width-50, height-40, Red);
for(i = 5, j = 0; i & width && j & i += 7, j += i/20)
gdispDrawPixel(i, j, White);
移植是个细致和经验活,做着很累,但做出来用着很好。日后我会出更多教程来了解内部源码吧。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:30161次
排名:千里之外
原创:21篇
转载:14篇
(4)(5)(4)(1)(2)(11)(2)(1)(7)21ic官方微信-->
后使用快捷导航没有帐号?
查看: 74|回复: 4
在M451上移植嵌入式GUI之ugfx
&&已结帖(0)
主题帖子积分
助理工程师, 积分 1844, 距离下一级还需 156 积分
助理工程师, 积分 1844, 距离下一级还需 156 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:34.10
主题帖子积分
助理工程师, 积分 1844, 距离下一级还需 156 积分
助理工程师, 积分 1844, 距离下一级还需 156 积分
很久以前就在M451上用Freertos8.1了,但是gui一直用的ZLGGUI,一直没改进。最近空闲下,花了两天搞定了uGFX的移植工作。
国内ugfx用的估计很少,以至于查资料只有开源官网,其它没有任何资料,只能根据自己的经验来移植了。
第一步:实现基本的底层驱动。
我用的是ssd1306这一款12864的oled。spi接口。主要实现底层接口函数。
初始化函数:
void OLED_InitHard(void);
写命令函数:
void OLED_WriteCmd(u8 cmd);
写数据函数:
void OLED_WriteData(u8 dat)
第二部:拷贝ugfx源码到工程文件。然后实现基层接口函数:
void init_board(GDisplay *g);
void post_init_board(GDisplay *g) ;
void setpin_reset(GDisplay *g, bool_t state);
void acquire_bus(GDisplay *g) ;
void release_bus(GDisplay *g) ;
void write_cmd(GDisplay *g, uint8_t cmd);
void write_data(GDisplay *g, uint8_t* data, uint16_t length);
其实主要就实现三个函数:
void init_board(GDisplay *g);
void write_cmd(GDisplay *g, uint8_t cmd);
void write_data(GDisplay *g, uint8_t* data, uint16_t length);
主要就是用上面ssd1306的驱动函数按要求去填这些函数。没啥难度。
第二部:简单配置,编译挑错。
配置ugfconfig。h头文件,然后编译调错。这是一个耐心的过程,我也搞了一天多才把报错的问题一一解决。什么变量未定义,某些函数没有实现了等慢慢自己去实现就ok了。
其中四个函数要自己实现的:
void& & & & gfxSleepMicroseconds(us)
{
& & & & bsp_DelayUs(us);
}
void& & & & gfxSleepMilliseconds(ms)
{
& & & & bsp_DelayMS(ms);
}
void *gfxAlloc(u32 size)
{
& & & & void *
& & & & xxx=malloc(size);
& & & &
}
void gfxFree(void *ptr)
{
& & & & free(ptr);
}复制代码
第四部:找源码里的例子进行验证。
在源码里有例子可以进行简单的画点,方框,字体等显示。
指纹模块 N3290x开发板 M453开发板 ISD9160开发板
淘宝店:/?spm=0126.d21.rWCQWR
主题帖子积分
中级工程师, 积分 4110, 距离下一级还需 890 积分
中级工程师, 积分 4110, 距离下一级还需 890 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级工程师, 积分 4110, 距离下一级还需 890 积分
中级工程师, 积分 4110, 距离下一级还需 890 积分
uGFX is a lightweight embedded library for displays and touchscreens providing everything required to build a fully featured embedded GUI. The library is very small and fast because every unused feature is disabled and not linked into the finished binary.
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
中级工程师, 积分 4110, 距离下一级还需 890 积分
中级工程师, 积分 4110, 距离下一级还需 890 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级工程师, 积分 4110, 距离下一级还需 890 积分
中级工程师, 积分 4110, 距离下一级还需 890 积分
第一次听说这个,看起来非常拉轰,学习一下
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
中级工程师, 积分 4110, 距离下一级还需 890 积分
中级工程师, 积分 4110, 距离下一级还需 890 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级工程师, 积分 4110, 距离下一级还需 890 积分
中级工程师, 积分 4110, 距离下一级还需 890 积分
看了一下,非常不错,正在学习。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
时间类勋章
技术高手奖章
人才类勋章
涓涓之细流
发帖类勋章whyynx_天涯社区
给whyynx发短消息:
TA的部落帖子
最近玩过的游戏}

我要回帖

更多关于 人工授精移植冻胚流程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信