<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>LVGL on Rancho&#39;s Notes</title>
    <link>https://fan-pengfei.top/tags/lvgl/</link>
    <description>Recent content in LVGL on Rancho&#39;s Notes</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Fri, 07 Apr 2023 05:47:41 +0000</lastBuildDate>
    <atom:link href="https://fan-pengfei.top/tags/lvgl/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>基于Arduino的LVGL移植</title>
      <link>https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/</link>
      <pubDate>Fri, 07 Apr 2023 05:47:41 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;这是一篇如何将LVGL移植到Arduino的教程(基于芯片ESP32 Pico D4)；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;软件版本&#34;&gt;软件版本&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;这次实验使用的lvgl版本是8.1.1，要先配置好tft_espi，确保显示正常；如果要使用触摸屏设备，在移植之前要确保能获取到触摸数据；&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;工程配置&#34;&gt;工程配置&lt;/h2&gt;
&lt;h3 id=&#34;库安装&#34;&gt;库安装&lt;/h3&gt;
&lt;p&gt;添加lvgl库 ，最好也添加lv_examples库，自带的例子虽然内容完全一样，但是并不能直接使用；&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;库安装&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;然后复制为lv_conf_template.h为lv_conf.h：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;lv_conf.h创建&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;然后复制为lv_demo_conf_template.h为lv_demo_conf.h：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-3.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;lv_demo_conf.h创建&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;配置文件&#34;&gt;配置文件&lt;/h3&gt;
&lt;h4 id=&#34;lv_confh&#34;&gt;lv_conf.h&lt;/h4&gt;
&lt;p&gt;修改这几个地方；&lt;/p&gt;
&lt;p&gt;启动lv_conf.h：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-4.png&#34;&gt;
&lt;strong&gt;启动lv_conf&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;设置色深，一般都是16：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-5.png&#34;&gt;
&lt;strong&gt;设置色深&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;启动自定义时钟，不设置的话只会显示第一帧不动：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-6.png&#34;&gt;
&lt;strong&gt;启动自定义时钟&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;LV_DPI_DEF 注意这里，虽然LVGL的作者说这个没这么重要，但他会严重影响到LVGL的动画效果，你应该进行DPI的手动计算，例如240x280分辨率1.69英寸的屏幕，那么 DPI为：&lt;/p&gt;
&lt;p&gt;LV_DPI_DEF =\frac{\sqrt{240*280} }{1.69} ≈ 153
&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-7.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LV_DPI_DEF配置&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;也可以使能日志打印：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-8.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;使能日志打印&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&#34;lv_demo_confh&#34;&gt;lv_demo_conf.h&lt;/h4&gt;
&lt;p&gt;修改这几个地方；&lt;/p&gt;
&lt;p&gt;启动lv_demo_conf.h：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-9.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;启动Demo&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;配置要运行的Demo：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-10.png&#34;&gt;
&lt;strong&gt;Demo选择&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;自定义显示接口和外部输入接口&#34;&gt;自定义显示接口和外部输入接口&lt;/h2&gt;
&lt;h3 id=&#34;文件添加&#34;&gt;文件添加&lt;/h3&gt;
&lt;p&gt;在src文件夹下添加以下两个文件：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/%E5%9F%BA%E4%BA%8Earduino%E7%9A%84lvgl%E7%A7%BB%E6%A4%8D/img-11.png&#34;&gt;
&lt;strong&gt;自定义接口&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;代码内容&#34;&gt;代码内容&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;my_lv_ports.cpp&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;my_lv_ports.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;&amp;#34;CST816T.h&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// TFT_eSPI tft = TFT_eSPI(screenWidth, screenHeight); /* TFT instance */
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TFT_eSPI tft &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TFT_eSPI&lt;/span&gt;();     &lt;span style=&#34;color:#75715e&#34;&gt;/* TFT instance */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CST816T &lt;span style=&#34;color:#a6e22e&#34;&gt;touch&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;19&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;21&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;22&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;// sda, scl, rst, irq
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// /*Read the touchpad*/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;my_touchpad_read&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;lv_indev_drv_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;indev_driver, &lt;span style=&#34;color:#66d9ef&#34;&gt;lv_indev_data_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;data)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;bool&lt;/span&gt; FingerNum &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; gesture;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;uint16_t&lt;/span&gt; touchX, touchY;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    FingerNum &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; touch.&lt;span style=&#34;color:#a6e22e&#34;&gt;getTouch&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;touchX, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;touchY, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;gesture);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (FingerNum)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        data&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;state &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LV_INDEV_STATE_REL;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        data&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;point.x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; touchX;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        data&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;point.y &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; touchY;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#if LV_USE_LOG != 0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Serial.&lt;span style=&#34;color:#a6e22e&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Touch: x=%d y=%d mode=%d&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\r\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, touchX, touchY, gesture);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#endif
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        FingerNum &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        data&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;state &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LV_INDEV_STATE_PR;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;/* Display flushing */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;my_disp_flush&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;lv_disp_drv_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;disp, &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;lv_area_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;area,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                   &lt;span style=&#34;color:#66d9ef&#34;&gt;lv_color_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;color_p)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; w &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (area&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;x2 &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; area&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;x1 &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; h &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (area&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;y2 &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; area&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;y1 &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tft.&lt;span style=&#34;color:#a6e22e&#34;&gt;setSwapBytes&lt;/span&gt;(true);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// tft.pushImageDMA(area-&amp;gt;x1, area-&amp;gt;y1, w, h, (uint16_t *)&amp;amp;color_p-&amp;gt;full);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tft.&lt;span style=&#34;color:#a6e22e&#34;&gt;pushImage&lt;/span&gt;(area&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;x1, area&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;y1, w, h, (&lt;span style=&#34;color:#66d9ef&#34;&gt;uint16_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;color_p&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;full);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// tft.startWrite();
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// tft.setAddrWindow( area-&amp;gt;x1, area-&amp;gt;y1, w, h );
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// tft.pushColors( ( uint16_t * )&amp;amp;color_p-&amp;gt;full, w * h, true );
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// tft.endWrite();
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;lv_disp_flush_ready&lt;/span&gt;(disp);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#if LV_USE_LOG != 0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;my_print&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;buf)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Serial.&lt;span style=&#34;color:#a6e22e&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%s &lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\r\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;, buf);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#endif
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;my_disp_init&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 绘图缓冲初始化
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;//   static lv_disp_draw_buf_t draw_buf;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;//   static lv_color_t buf[screenWidth * 10];
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;//   lv_disp_draw_buf_init(&amp;amp;draw_buf, buf, NULL, screenWidth * 10);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;lv_disp_draw_buf_t&lt;/span&gt; draw_buf;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;lv_color_t&lt;/span&gt; buf_2_1[screenWidth &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;40&lt;/span&gt;]; &lt;span style=&#34;color:#75715e&#34;&gt;/*A buffer for 10 rows*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;lv_color_t&lt;/span&gt; buf_2_2[screenWidth &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;40&lt;/span&gt;]; &lt;span style=&#34;color:#75715e&#34;&gt;/*An other buffer for 10
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    rows*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;lv_disp_draw_buf_init&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;draw_buf, buf_2_1, buf_2_2,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                          screenWidth &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;30&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;/*Initialize
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;                          the display buffer*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// TFT驱动初始化
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tft.&lt;span style=&#34;color:#a6e22e&#34;&gt;begin&lt;/span&gt;(); &lt;span style=&#34;color:#75715e&#34;&gt;/* TFT init */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// tft.initDMA();
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tft.&lt;span style=&#34;color:#a6e22e&#34;&gt;setRotation&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;/* Landscape orientation, flipped */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 设置LVGL显示设备
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;lv_disp_drv_t&lt;/span&gt; disp_drv;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;lv_disp_drv_init&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;disp_drv);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/*Change the following line to your display resolution*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    disp_drv.hor_res &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; screenWidth;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    disp_drv.ver_res &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; screenHeight;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    disp_drv.flush_cb &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; my_disp_flush;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    disp_drv.draw_buf &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;draw_buf;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;lv_disp_drv_register&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;disp_drv);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    touch.&lt;span style=&#34;color:#a6e22e&#34;&gt;begin&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 设置LVGL输入设备（电阻屏）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;lv_indev_drv_t&lt;/span&gt; indev_drv;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;lv_indev_drv_init&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;indev_drv);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    indev_drv.type &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; LV_INDEV_TYPE_POINTER;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    indev_drv.read_cb &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; my_touchpad_read;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;lv_indev_drv_register&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;indev_drv);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 设置LVGL串口输出设备（调试用）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#if LV_USE_LOG != 0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;lv_log_register_print_cb&lt;/span&gt;(my_print);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#endif
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;my_lv_ports.h&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>AT32F403A系列单片机开发</title>
      <link>https://fan-pengfei.top/posts/at32f403a%E7%B3%BB%E5%88%97%E5%8D%95%E7%89%87%E6%9C%BA%E5%BC%80%E5%8F%91/</link>
      <pubDate>Wed, 12 Oct 2022 15:07:03 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/at32f403a%E7%B3%BB%E5%88%97%E5%8D%95%E7%89%87%E6%9C%BA%E5%BC%80%E5%8F%91/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;记录AT32开发中遇到的问题；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;硬件部分&#34;&gt;硬件部分：&lt;/h2&gt;
&lt;p&gt;硬件部分我是参考官方开发板来做的；&lt;/p&gt;
&lt;p&gt;经过测试，硬件部分没有任何问题；&lt;/p&gt;
&lt;p&gt;原理图
&lt;img alt=&#34;2e8cc9324c8e969b2ba048221939699&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/at32f403a%E7%B3%BB%E5%88%97%E5%8D%95%E7%89%87%E6%9C%BA%E5%BC%80%E5%8F%91/img-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;PCB仿真图
&lt;img alt=&#34;f12b1584db83aef4fbd8cc925b76d40&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/at32f403a%E7%B3%BB%E5%88%97%E5%8D%95%E7%89%87%E6%9C%BA%E5%BC%80%E5%8F%91/img-2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;实物图
&lt;img alt=&#34;bbea8d18667d74360d3ef9c638453d5&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/at32f403a%E7%B3%BB%E5%88%97%E5%8D%95%E7%89%87%E6%9C%BA%E5%BC%80%E5%8F%91/img-3.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;显示效果
&lt;img alt=&#34;dcf5793c87931e4e32513eca0f71157&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/at32f403a%E7%B3%BB%E5%88%97%E5%8D%95%E7%89%87%E6%9C%BA%E5%BC%80%E5%8F%91/img-4.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;有几个值得关注的地方，我将在下面列出：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;使用编码器开关作为输入设备；&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;使用CH340E芯片作为串口转USB；&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;通过TYPE-C接口的正反插实现不同的功能（连接CH340E芯片和AT32的USB引脚）：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;屏幕接口采用的是FPC0.5mm接口，方便安装；&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;硬件部分的测试很快就结束了，主要就是测试各个外设是否能正常使用；&lt;/p&gt;
&lt;p&gt;经测试，主控芯片、屏幕、spiflash、USB接口、CH340E、编码器开关、RTC时钟均能正常使用；&lt;/p&gt;
&lt;h2 id=&#34;软件开发&#34;&gt;软件开发：&lt;/h2&gt;
&lt;h3 id=&#34;参考资料&#34;&gt;参考资料：&lt;/h3&gt;
&lt;p&gt;主控芯片使用的是雅特力的AT32F403ACGU7，其特性如下所示：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;f9ed3e62565a45863771434081c095d&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/at32f403a%E7%B3%BB%E5%88%97%E5%8D%95%E7%89%87%E6%9C%BA%E5%BC%80%E5%8F%91/img-5.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;参考资料网站：&lt;a href=&#34;https://www.arterytek.com/cn/product/AT32F403A.jsp&#34;&gt;https://www.arterytek.com/cn/product/AT32F403A.jsp&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;ae1d18fa022ab02fffa6a006428d441&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/at32f403a%E7%B3%BB%E5%88%97%E5%8D%95%E7%89%87%E6%9C%BA%E5%BC%80%E5%8F%91/img-6.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;下载固件库源码，经解压后，可以在目录:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.&lt;span style=&#34;color:#ae81ff&#34;&gt;\A&lt;/span&gt;T32F403A_407_Firmware_Library_V2.1.2&lt;span style=&#34;color:#ae81ff&#34;&gt;\p&lt;/span&gt;roject&lt;span style=&#34;color:#ae81ff&#34;&gt;\a&lt;/span&gt;t_start_f403a&lt;span style=&#34;color:#ae81ff&#34;&gt;\e&lt;/span&gt;xamples
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;找到各个外设的例子：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ls
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;acc/        crm/    gpio/  spi/         wwdt/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;adc/        dac/    i2c/   sram/        xmc/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bpr/        debug/  i2s/   tmr/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;can/        dma/    pwc/   usart/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cortex_m4/  exint/  rtc/   usb_device/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;crc/        flash/  sdio/  wdt/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;首先当然是串口打印和点灯，这样能测试时钟配置是否正常，以及判断芯片好坏与否；&lt;/p&gt;
&lt;h3 id=&#34;具体开发&#34;&gt;具体开发：&lt;/h3&gt;
&lt;p&gt;关键代码如下：&lt;/p&gt;
&lt;h4 id=&#34;点灯&#34;&gt;点灯：&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;at32_led_init&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gpio_init_type gpio_init_struct;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/* enable the led clock */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;crm_periph_clock_enable&lt;/span&gt;(USER_LED_GPIO_CRM_CLK, TRUE);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/* set default parameter */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;gpio_default_para_init&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;gpio_init_struct);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/* configure the led gpio */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gpio_init_struct.gpio_pins &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; USER_LED_PIN;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gpio_init_struct.gpio_mode &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GPIO_MODE_OUTPUT;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gpio_init_struct.gpio_out_type &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GPIO_OUTPUT_PUSH_PULL;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gpio_init_struct.gpio_pull &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GPIO_PULL_NONE;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gpio_init_struct.gpio_drive_strength &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GPIO_DRIVE_STRENGTH_STRONGER;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;gpio_init&lt;/span&gt;(USER_LED_GPIO, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;gpio_init_struct);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;at32_led_on&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    USER_LED_GPIO&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;clr &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; USER_LED_PIN;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;at32_led_off&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    USER_LED_GPIO&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;scr &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; USER_LED_PIN;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;at32_led_toggle&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    USER_LED_GPIO&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;odt &lt;span style=&#34;color:#f92672&#34;&gt;^=&lt;/span&gt; USER_LED_PIN;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;串口&#34;&gt;串口：&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;uart_print_init&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;uint32_t&lt;/span&gt; baudrate)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gpio_init_type gpio_init_struct;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/* enable the uart and gpio clock */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;crm_periph_clock_enable&lt;/span&gt;(PRINT_UART_CRM_CLK, TRUE);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;crm_periph_clock_enable&lt;/span&gt;(PRINT_UART_TX_GPIO_CRM_CLK, TRUE);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;gpio_default_para_init&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;gpio_init_struct);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/* configure the uart tx pin */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gpio_init_struct.gpio_drive_strength &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GPIO_DRIVE_STRENGTH_STRONGER;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gpio_init_struct.gpio_out_type &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GPIO_OUTPUT_PUSH_PULL;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gpio_init_struct.gpio_mode &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GPIO_MODE_MUX;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gpio_init_struct.gpio_pins &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; PRINT_UART_TX_PIN;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gpio_init_struct.gpio_pull &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; GPIO_PULL_NONE;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;gpio_init&lt;/span&gt;(PRINT_UART_TX_GPIO, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;gpio_init_struct);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/* configure uart param */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;usart_init&lt;/span&gt;(PRINT_UART, baudrate, USART_DATA_8BITS, USART_STOP_1_BIT);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;usart_transmitter_enable&lt;/span&gt;(PRINT_UART, TRUE);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;usart_enable&lt;/span&gt;(PRINT_UART, TRUE);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;串口重定向&lt;/strong&gt;：&lt;/p&gt;</description>
    </item>
    <item>
      <title>lvgl显示txt文本(指定字体)</title>
      <link>https://fan-pengfei.top/posts/lvgl%E6%98%BE%E7%A4%BAtxt%E6%96%87%E6%9C%AC%E6%8C%87%E5%AE%9A%E5%AD%97%E4%BD%93/</link>
      <pubDate>Mon, 16 May 2022 03:38:12 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/lvgl%E6%98%BE%E7%A4%BAtxt%E6%96%87%E6%9C%AC%E6%8C%87%E5%AE%9A%E5%AD%97%E4%BD%93/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;前些天做微机课设，给小一加了几个功能，其中一个重要功能是显示中文文本；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;字体取模&#34;&gt;字体取模：&lt;/h2&gt;
&lt;p&gt;屏幕要显示图案，例如某个汉字或者数字、图案等，都需要对图案进行取模操作；&lt;/p&gt;
&lt;p&gt;使用的是&lt;code&gt;LvglFontTool&lt;/code&gt;工具，&lt;code&gt;LVGL&lt;/code&gt;官网的字体转化用于单个字体取模比较方便；批量的话，使用这个离线取模软件比较方便；&lt;/p&gt;
&lt;p&gt;操作界面如下所示：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;c941fa311425ab16f5bc3f354d99fc2&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/lvgl%E6%98%BE%E7%A4%BAtxt%E6%96%87%E6%9C%AC%E6%8C%87%E5%AE%9A%E5%AD%97%E4%BD%93/img-1.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;步骤还是很简单的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;首先选择字体，包括一个&lt;code&gt;TFF&lt;/code&gt;字体文件还有选择需要取模的字体大小；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;然后加入汉字，我是将所有常用的汉字都加入了；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;然后在右边配置一些选项，按照图片上的配置就可以；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最后点击开始转换就可以生成一个&lt;code&gt;myFont.c&lt;/code&gt;和&lt;code&gt;myFont.bin&lt;/code&gt;文件，&lt;code&gt;bin&lt;/code&gt;文件加载到&lt;code&gt;SPI FLASH&lt;/code&gt;中，C文件加入&lt;code&gt;Keil&lt;/code&gt;工程即可;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&#34;efcc7c6005ad5950310dbec4ab39cd3&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/lvgl%E6%98%BE%E7%A4%BAtxt%E6%96%87%E6%9C%AC%E6%8C%87%E5%AE%9A%E5%AD%97%E4%BD%93/img-2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;如果只需要显示数量比较少的文本，取模后得到的数组可以直接放在一个&lt;code&gt;.c&lt;/code&gt;或者&lt;code&gt;.h&lt;/code&gt;文件中，直接下载到单片机的&lt;code&gt;FLASH&lt;/code&gt;中即可，但是如果要显示各种不同样式和不同大小的字体，取模后得到的文件会很大，加载到&lt;code&gt;FLASH&lt;/code&gt;中存放是不合理的。&lt;/p&gt;
&lt;h2 id=&#34;文件放置&#34;&gt;文件放置：&lt;/h2&gt;
&lt;p&gt;小一这一版的硬件是带了一个&lt;code&gt;8M&lt;/code&gt;的&lt;code&gt;SPI FLASH&lt;/code&gt;，所以取模后的数据可以放在这块&lt;code&gt;SPI FLASH&lt;/code&gt;中，可以用哪些方法通过单片机读取&lt;code&gt;bin&lt;/code&gt;文件中的内容呢？&lt;/p&gt;
&lt;p&gt;一般是有两个方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;放入移植好的&lt;code&gt;Fatfs&lt;/code&gt;文件系统中，通过文件系统提供的接口读取该bin文件；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;加载进&lt;code&gt;SPI FLASH&lt;/code&gt;中，直接通过最底层的读取函数读取；&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;两种方案各有优缺点，第一种更换字体取模文件很方便，但是由于字体取模文件会频繁被读取，所以这个方案的效率会比较差；第二种方案更换字体取模文件比较麻烦，但是读取的效率会高不少。我是选择了第二种方案，第一种我也试了，效率确实不是很高。&lt;/p&gt;
&lt;p&gt;对于第二种方案，首先要将取模文件从PC机放入&lt;code&gt;SPI FLASH&lt;/code&gt;中，我采用的方案是将&lt;code&gt;SPI FLASH&lt;/code&gt;划分为两部分：&lt;/p&gt;
&lt;p&gt;前4MB
后4MB&lt;/p&gt;
&lt;p&gt;用于存储字体取模数据
用于建立文件系统&lt;/p&gt;
&lt;p&gt;然后将&lt;code&gt;SPI FLASH&lt;/code&gt;模拟为USB设备，插入PC机，会弹出一个U盘，将字体文件拖入；然后通过一个函数，将&lt;code&gt;bin&lt;/code&gt;文件分段读取并分段写入&lt;code&gt;SPI FLASH&lt;/code&gt;的前&lt;code&gt;4MB&lt;/code&gt;部分中，具体函数如下所示：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;write_to_flash&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; i;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    f_res &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;f_open&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;file1, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;myFont.bin&amp;#34;&lt;/span&gt;, FA_READ);&lt;span style=&#34;color:#75715e&#34;&gt;//打开对应文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    count_f &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; i  &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;如果有多个字体文件，可以将写入的地址偏移一个大小即可。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## 文件读取：
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;字体取模文件读取只需要修改`&lt;/span&gt;myFont.c&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;`中的一个函数：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;```&lt;/span&gt;c
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; __g_font_buf[&lt;span style=&#34;color:#ae81ff&#34;&gt;324&lt;/span&gt;]; &lt;span style=&#34;color:#75715e&#34;&gt;//如bin文件存在SPI FLASH可使用此buff
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;uint8_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;__user_font_getdata&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; offset, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; size)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;//如字模保存在SPI FLASH, SPIFLASH_Read(__g_font_buf,offset,size);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;//如字模已加载到SDRAM,直接返回偏移地址即可如:return (uint8_t*)(sdram_fontddr+offset);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;my_W25QXX_Read&lt;/span&gt;(__g_font_buf, offset, size);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; __g_font_buf;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;如果有多个字体文件，可以在对应的&lt;code&gt;myFont&lt;/code&gt;文件中将读出的地址偏移一个大小即可。&lt;/p&gt;</description>
    </item>
    <item>
      <title>LVGL开发</title>
      <link>https://fan-pengfei.top/posts/lvgl%E5%BC%80%E5%8F%91/</link>
      <pubDate>Mon, 03 Jan 2022 05:17:26 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/lvgl%E5%BC%80%E5%8F%91/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;最近要做一个GUI界面，自己开发各种功能是极其麻烦的(对的，我之前是做过的)，需要注意很多问题，而且开发起来很多功能基本上是实现不了的，所以只能想其他办法了，因为之前用LVGL做过一个很简单的GUI界面，所以这次也打算用LVGL来做，也算是再复习一下这个界面的使用。
以下是关于LVGL的简介以及特点：
LVGL(Light and Versatile Graphics Library，轻巧而多功能的图形库)是一个免费的开放源代码图形库，它提供创建具有易于使用的图形元素，精美的视觉效果和低内存占用的嵌入式GUI所需的一切。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;lvgl主要特性&#34;&gt;LVGL主要特性&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;功能强大的构建块，例如按钮，图表，列表，滑块，图像等.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;带有动画，抗锯齿，不透明，平滑滚动的高级图形.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;各种输入设备，例如触摸板，鼠标，键盘，编码器等.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;支持UTF-8编码的多语言.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;多显示器支持，如TFT，单色显示器.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;完全可定制的图形元素.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;独立于任何微控制器或显示器使用的硬件.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可扩展以使用很少的内存(64 kB闪存，16 kB RAM)进行操作.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;操作系统，支持外部存储器和GPU，但不是必需的.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;单帧缓冲区操作，即使具有高级图形效果.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用C语言编写，以实现最大的兼容性(与C ++兼容).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;模拟器可在没有嵌入式硬件的PC上进行嵌入式GUI设计.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可移植到MicroPython.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可快速上手的教程、示例、主题.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;丰富的文档教程.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在MIT许可下免费和开源.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;lvgl硬件要求&#34;&gt;LVGL硬件要求&lt;/h2&gt;
&lt;p&gt;基本上，每个现代控制器(肯定必须要能够驱动显示器)都适合运行LVGL。LVGL的最低运行要求很低：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;16、32或64位微控制器或处理器.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最低 16 MHz 时钟频率.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Flash/ROM:：对于非常重要的组件要求 &amp;gt;64 kB(建议 &amp;gt; 180 kB).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RAM
静态 RAM 使用量：~2 kB，取决于所使用的功能和对象类型.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;堆栈： &amp;gt; 2kB(建议 &amp;gt; 8 kB).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;动态数据(堆)：&amp;gt; 2 KB(如果使用多个对象，则建议 &amp;gt; 16 kB)。由 lv_conf.h 中的 LV_MEM_SIZE 宏进行设置.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;显示缓冲区：&amp;gt; “水平分辨率”像素(建议 &amp;gt; 10× “水平分辨率” ).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MCU 或外部显示控制器中的一帧缓冲区.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
