打印
[STM32F1]

STM32例程分享+Stemwin之Graph的初级应用

[复制链接]
5020|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
最近利用STM32F103RCT6自制了一块小开发板,并成功移植了STemwin。利用STemwin的Graph控件绘制了不同频率的正弦波合成方波的图像。效果图如下:
奇次谐波为1的图像:

奇次谐波为5的图像:


奇次谐波为35的图像:


程序和原理图如下:
STM32F1 ILI9341.pdf (105.94 KB)
STemwin Graph.zip (1.7 MB)

沙发
纪国圣|  楼主 | 2017-10-1 09:41 | 只看该作者
在本例程中,重点讲述STemwin的移植和Graph控件的基本使用。
先介绍一下程序框架。程序框架如下图所示:
首先添加的是最基础的TFT驱动,内存管理和定时器的驱动。
我使用的是TFT使用3.2寸ILI9341屏,在ILI9341.c中重点是TFTLCD_Init(void)函数。因为该函数中需要大量的有关屏幕的参数配置,如果配置不当,会出现屏幕不正常显示。该参数的配置有的TFT厂家会提供给客户,免去了个人配置的麻烦。
这里添加定时器的原因是STemwin需要单片机为其提供工作时钟,这里使用定时器4定时1ms。在定时器4中的中断函数内,通过OS_TimeMS++;来实现为STemwin提供工作时钟。
void TIM4_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM4,TIM_IT_Update)!=RESET)
        {       
                OS_TimeMS++;
        }
        TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
}

使用特权

评论回复
板凳
纪国圣|  楼主 | 2017-10-1 10:31 | 只看该作者
接着在工程中添加STemwin_Config和STemwin_Lib两个文件夹。在STemwin_Config中,将GUIDRV_Template.c,LCDConf_FlexColor_Template.c,GUIConf.c,GUI_X.c,GUI_X_Touch_Analog.c添加其中。本程序没有使用操作系统以及使用CM3为核心的STM32F103RCT6,因此在STemwin_Lib中添加STemWin522_CM3_Keil文件,如果使用操作系统,必须选择STemWin522_CM3_OS_Keil.lib,同时GUI_X.c更换为带相应操作系统名称的文件。
这里再说明一下STemwin_Config中各文件的含义。
GUIDRV_Template.c为STemwin提供画点、读点、画线等函数,而这些需要用户去提供。一般在TFT驱动程序中写好画点TFTLcdWirteColorData(unsigned int color)
和读点LCD_ReadPoint(u16 x,u16 y)函数,再配合设置区域TFTLCD_SetAreaXY(unsigned int x,unsigned int y)和写寄存器函数TFTLCD_WR_REG(0x2C);即可完成配置。
GUIDRV_Template.c中_SetPixelIndex(GUI_DEVICE * pDevice, int x, int y, int PixelIndex)函数填写:

GUIDRV_Template.c中_GetPixelIndex(GUI_DEVICE * pDevice, int x, int y)函数填写:

GUIDRV_Template.c中_FillRect(GUI_DEVICE * pDevice, int x0, int y0, int x1, int y1)函数填写:

GUIDRV_Template.c中_DrawBitLine16BPP(GUI_DEVICE * pDevice, int x, int y, U16 const GUI_UNI_PTR * p, int xsize)函数填写:


LCDConf_FlexColor_Template.c为STemwin提供驱动屏幕的外部信息及初始化。一般需要用户根据使用的屏幕定义宏变量XSIZE_PHYS、YSIZE_PHYS、VXSIZE_PHYS、VYSIZE_PHYS以及改写LCD_X_Config(void)函数。
LCDConf_FlexColor_Template.c中宏变量设置:

LCDConf_FlexColor_Template.c中LCD_X_Config(void)函数填写:

GUIConf.c为STenwim提供相应内存配置。由于ST,32F103RCT6内存小,所以在实际填写中需要注意合理填写。

GUIConf.h为STenwim提供相应配置,如是否使用操作系统,是否使用游标,是否支持触摸等信息。

GUI_X.c无需配置,直接使用STemWinLibrary522文件夹中自带的文件即可。再次说明一下,如果使用操作系统,请将该文件更换为包含相应操作系统的文件。例如使用Keil自带的RTX,则应使用GUI_X_RTX.c文件并做相应的修改。
GUI_X_Touch_Analog.c为为STenwim提供触摸信息。这里用户在GUI_TOUCH_X_MeasureX(void)和GUI_TOUCH_X_MeasureY(void)分别填写触摸传感器提供的X和Y轴的坐标。

使用特权

评论回复
地板
纪国圣|  楼主 | 2017-10-1 11:09 | 只看该作者
移植完成后,再介绍一下Graph控件的使用。STemwin控件的使用思想在于控件的句柄。使用过matlab做GUI界面的同学应该对这个词不陌生。在对控件做相应操作时,一定要先获得控件的句柄,而句柄则是控件的“身份识别信息”。在main函数中,先申明
WM_HWIN hGraph;     //Graph控件句柄
GRAPH_DATA_Handle hData;   //曲线的句柄
GRAPH_SCALE_Handle hScale;     //刻度的句柄

其次给句柄赋值:
hGraph = WM_GetDialogItem(hWin, ID_GRAPH_0);                                                        //1获得Graph控件句柄
hData = GRAPH_DATA_YT_Create(GUI_GREEN,240, &m, 1);                                        //2.获取数据对象的句柄
GRAPH_AttachData(hGraph, hData);                                                                        //3.将数据对象添加到Graoh控件中

然后对Graph控件进行配置:
GRAPH_SetVSizeX(hGraph, 240);                                                                                //设置X和Y轴的虚拟尺寸
GRAPH_SetVSizeY(hGraph, 320);
GRAPH_SetGridDistX(hGraph, 10);                                                                                //设置栅格距离
GRAPH_SetGridDistY(hGraph, 10);
GRAPH_SetGridVis(hGraph, 1);                                                                                        //显示栅格
GRAPH_DATA_YT_SetAlign(hData, GRAPH_ALIGN_LEFT);                                                //数据左对齐
GRAPH_DATA_YT_Clear(hData);                                                                                //清除数据对象的所有数据项

hScale = GRAPH_SCALE_Create(28, GUI_TA_RIGHT, GRAPH_SCALE_CF_VERTICAL | GRAPH_SCALE_CF_HORIZONTAL, 10);                //刻度创建
GRAPH_AttachScale(hGraph, hScale);
GRAPH_SCALE_SetFactor(hScale,0.5);                                                                        //设置用于计算要绘制的编号的因子,也就是刻度的比例

本例程显示的是不同频率的正弦波合成方波的图像,在main.c函数中代码如下:
while(1)
{
                                for(i = 0;i <= 500;i++)
                                {
                                                n = 0;
                                                for(j = 1;j <= N;j = j + 2)                                                                                //计算合成方波
                                                {
                                                                n = n + 50.0*sin(2*3.14*0.01*i*j)/j;
                                                }
                                                n = n + 50;                                                                                                        //偏移波形
                                                m = (signed short)n;
                                                GRAPH_DATA_YT_AddValue(hData, m*2);                                                        //添加到hData中并显示
                                                GUI_Delay(10);                                                                                                        //STemwin刷新屏幕
                                }
}


使用特权

评论回复
5
纪国圣|  楼主 | 2017-10-1 11:19 | 只看该作者
最后说一下,本人使用的STemwin的版本是V5.22。
对于V5.12版本,网上有相应的中文版,可惜文件太大,我上传不了,大家可在网上自行搜索或教我怎么上传大附件。

使用特权

评论回复
6
xixi2017| | 2017-10-4 10:12 | 只看该作者
如果楼主想分享大文件可以用百度云,然后分享个链接过来,楼主的教程真棒。

使用特权

评论回复
7
aizaixiyuanqian| | 2017-10-4 10:26 | 只看该作者
做的不错,感谢分享。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

405

帖子

5

粉丝