diff --git a/404.html b/404.html index 8021484..c2209ca 100644 --- a/404.html +++ b/404.html @@ -30,11 +30,11 @@ HalfSweet's Blog - - + + -
跳至主要內容

404

页面不存在

看起来你访问了一个失效的链接

- +
跳至主要內容

404

页面不存在

这 是 四 零 四 !

+ diff --git a/about/index.html b/about/index.html index c117ef8..d26316d 100644 --- a/about/index.html +++ b/about/index.html @@ -30,11 +30,11 @@ 关于 | HalfSweet's Blog - - + +
跳至主要內容

关于

HalfSweet小于 1 分钟

自我介绍

  • 我是半糖,19岁,事学生
  • 爱好电子,精通(看过)多种单片机使用方法以及编程语言
  • 最喜欢的屏幕是墨水屏
  • 计划学习更多有关ee和cs的内容,并希望今后从事类似的工作

会的东西

编程语言

  • 略懂C/CPP语言

TODO

单片机

  • 基于Arduino平台的AVR系列
  • 基于Arduino/ESP-IDF/Micropython的ESP32系列 (其实是个连idf都不会装的菜鸡)
  • 基于HAL库的STM32系列
  • 8051/80251(特指STC32)
  • CCS的安装与卸载

其它

初次之外半糖略懂一些关于墨水屏的知识,以及能在有详细文档的参考下做出一些有意思的东西(比如说这个博客)。

联系方式

- + diff --git a/article/index.html b/article/index.html index 98004b8..e120679 100644 --- a/article/index.html +++ b/article/index.html @@ -30,8 +30,8 @@ 文章 | HalfSweet's Blog - - + +
跳至主要內容
对《为什么我对第三代郊狼失望》一文的澄清说明

在上文 为什么我对第三代郊狼失望 一文中,我对于第三代郊狼的硬件部分进行了一些初步分析,因为没有详细的一些资料,因此在一些地方可能存在一些错误。在昨晚(2024-03-19)郊狼作者找到我,与我群群友进行了一番友好的长时间地交流,也解答了我对设计上的一些疑问。在本文中我们会逐步分析前文中提到的问题。

@@ -46,6 +46,6 @@

通用,本文同样适用于 Arm-Cortex M 架构的 MCU。


HalfSweet大约 5 分钟单片机STC32STC8嵌入式CoreMark
在嵌入式设备上使用fmtlib

众所周知,在c++20以上的标准已经支持了std::format进行格式化输出,不过显而易见,嵌入式领域想要得到支持显然遥遥无期。但是我们已经厌倦了使用sprintf等方式来格式化字符串,c++的流特性又显得不够优雅,怎么才能用上类似于Python中format这样的方式来格式化并输出想要的字符串呢。


HalfSweet大约 5 分钟postsfmtlib嵌入式ESP8266ESP32ArduinoPlatformIOESP-IDF
- + diff --git a/assets/404.html-tjgzxrjF.js b/assets/404.html-DUtivPUn.js similarity index 94% rename from assets/404.html-tjgzxrjF.js rename to assets/404.html-DUtivPUn.js index 86a8bcb..d470799 100644 --- a/assets/404.html-tjgzxrjF.js +++ b/assets/404.html-DUtivPUn.js @@ -1 +1 @@ -import{_ as t}from"./plugin-vue_export-helper-DlAUqK2U.js";import{o as e,c as o,a as n}from"./app-q_LDn41G.js";const a={},r=n("p",null,"404 Not Found",-1),c=[r];function p(s,l){return e(),o("div",null,c)}const d=t(a,[["render",p],["__file","404.html.vue"]]),h=JSON.parse(`{"path":"/404.html","title":"","lang":"zh-CN","frontmatter":{"layout":"NotFound","description":"404 Not Found","head":[["meta",{"property":"og:url","content":"https://halfsweet.cn/404.html"}],["meta",{"property":"og:site_name","content":"HalfSweet's Blog"}],["meta",{"property":"og:description","content":"404 Not Found"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"HalfSweet"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"\\",\\"description\\":\\"404 Not Found\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0.01,"words":3},"filePathRelative":null,"excerpt":"

404 Not Found

\\n","autoDesc":true}`);export{d as comp,h as data}; +import{_ as t}from"./plugin-vue_export-helper-DlAUqK2U.js";import{o as e,c as o,a as n}from"./app-DligghWc.js";const a={},r=n("p",null,"404 Not Found",-1),c=[r];function p(s,l){return e(),o("div",null,c)}const d=t(a,[["render",p],["__file","404.html.vue"]]),h=JSON.parse(`{"path":"/404.html","title":"","lang":"zh-CN","frontmatter":{"layout":"NotFound","description":"404 Not Found","head":[["meta",{"property":"og:url","content":"https://halfsweet.cn/404.html"}],["meta",{"property":"og:site_name","content":"HalfSweet's Blog"}],["meta",{"property":"og:description","content":"404 Not Found"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"HalfSweet"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"\\",\\"description\\":\\"404 Not Found\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0.01,"words":3},"filePathRelative":null,"excerpt":"

404 Not Found

\\n","autoDesc":true}`);export{d as comp,h as data}; diff --git a/assets/app-q_LDn41G.js b/assets/app-DligghWc.js similarity index 97% rename from assets/app-q_LDn41G.js rename to assets/app-DligghWc.js index 8107698..6a5810e 100644 --- a/assets/app-q_LDn41G.js +++ b/assets/app-DligghWc.js @@ -1,6 +1,6 @@ function __vite__mapDeps(indexes) { if (!__vite__mapDeps.viteFileDeps) { - __vite__mapDeps.viteFileDeps = ["assets/index.html-BjDCDFcK.js","assets/plugin-vue_export-helper-DlAUqK2U.js","assets/index.html-Ddt16gXd.js","assets/index.html-tbRgCCxM.js","assets/index.html-JQjTbVf7.js","assets/index.html-9KHhnrQG.js","assets/index.html-BqNE83Tp.js","assets/index.html-BoAh0Ue-.js","assets/index.html-B03UjhVZ.js","assets/index.html-_XmV6XzZ.js","assets/index.html-vq7A5bJZ.js","assets/index.html-C_11f0wc.js","assets/index.html-C5tCR2Lv.js","assets/index.html-T9Tdh1DC.js","assets/index.html-DfLaS-g0.js","assets/index.html-BqpLzhd2.js","assets/index.html-DjMEortk.js","assets/index.html-Clikzz6O.js","assets/404.html-tjgzxrjF.js","assets/index.html-ByNehdus.js","assets/index.html-BuR8_gfx.js","assets/index.html-CwC0Y3vt.js","assets/index.html-C11GOzyf.js","assets/index.html-B0BQONx7.js","assets/index.html-CAJrOfb2.js","assets/index.html-B_yf-6yg.js","assets/index.html-Ku40apzB.js","assets/index.html-lov27Z1Y.js","assets/index.html-DooS4Jur.js","assets/index.html-D0OL2VSa.js","assets/index.html-wYSA4f6v.js","assets/index.html-CCXgpmhd.js","assets/index.html-BPzv_saF.js","assets/index.html-DaqcFT5Z.js","assets/index.html-CFV0-xiy.js","assets/index.html-B1miD6lF.js","assets/index.html-BF3gbJSq.js","assets/index.html-D2MPprum.js","assets/index.html-D0Xro9IC.js","assets/index.html-DpshIR5i.js","assets/index.html-DmwkZ3IX.js","assets/index.html-D4be0ngz.js","assets/index.html-HG2T5013.js","assets/index.html-Ddhxs9O-.js","assets/index.html-BsJpbz4T.js","assets/index.html-OsYs9_ih.js","assets/index.html-Bltotfym.js","assets/index.html-Dw0_03bN.js","assets/index.html-xRA-nFgT.js","assets/index.html-BkOWkGr0.js","assets/index.html-CdYPyfQS.js","assets/index.html-Dkwuk41p.js","assets/index.html-DPtxJ82B.js","assets/index.html-JdRoDqdx.js","assets/index.html-Db1qYjMb.js","assets/index.html-BIAJOnnJ.js","assets/index.html-B6ukxBY1.js","assets/index.html-CVq_TAeH.js","assets/index.html-DTMo7T57.js","assets/vue-repl-D6vugN8Y.js","assets/utils-B8VQ4rym-D7HXbP0h.js","assets/codemirror-editor-Cf6WG5HV.js"] + __vite__mapDeps.viteFileDeps = ["assets/index.html-D1YZ7jOc.js","assets/plugin-vue_export-helper-DlAUqK2U.js","assets/index.html-BFUnfahy.js","assets/index.html-VnGfOf4p.js","assets/index.html-BEhLK7A_.js","assets/index.html-DjdvzSRj.js","assets/index.html-DP5h2y3Z.js","assets/index.html-LvuOtC1p.js","assets/index.html-MvkaF6Zs.js","assets/index.html-B3i_-qTt.js","assets/index.html-DY4rfiH_.js","assets/index.html-6thP6gMB.js","assets/index.html-BE6zFLO0.js","assets/index.html-BttDIRc6.js","assets/index.html-BpbuqIOL.js","assets/index.html-BUExg3S4.js","assets/index.html-CjsJWDkx.js","assets/index.html-CeXufHKt.js","assets/404.html-DUtivPUn.js","assets/index.html-BHkIckQz.js","assets/index.html-CyeC7jFU.js","assets/index.html-CmAQ5YDA.js","assets/index.html-CwRQXK6M.js","assets/index.html-eNl3F0_i.js","assets/index.html-D6b4yBnc.js","assets/index.html-ujRWT25Q.js","assets/index.html-CC5A_Bsy.js","assets/index.html-Cmx6vSzQ.js","assets/index.html-WhwNyEeB.js","assets/index.html-D1dk3vFS.js","assets/index.html-BL1UIGC1.js","assets/index.html-BaWo4EHb.js","assets/index.html-yDrPHhjw.js","assets/index.html-1CYlyUUM.js","assets/index.html-L88jnadg.js","assets/index.html-DjwQLx4T.js","assets/index.html-D8YyVXhU.js","assets/index.html-DEY01Gtq.js","assets/index.html-CEFjPZdx.js","assets/index.html-BUt-Ypg5.js","assets/index.html-r-L49OAU.js","assets/index.html-DOHym-Nn.js","assets/index.html-Cx3snu14.js","assets/index.html-ApkFug1C.js","assets/index.html-D069BcOf.js","assets/index.html-DkBSQoRt.js","assets/index.html-ExrB7i9r.js","assets/index.html-DLbQjPwd.js","assets/index.html-BPUnAVOr.js","assets/index.html-D0vfk5YQ.js","assets/index.html-B93F0Yt1.js","assets/index.html-Dov7UYvO.js","assets/index.html-DbovN7oN.js","assets/index.html-BNEhJvvt.js","assets/index.html-DvjdSKrX.js","assets/index.html-DQhK9vZi.js","assets/index.html-DcciNTNK.js","assets/index.html-DnAcCEnZ.js","assets/index.html-CW73p-23.js","assets/vue-repl-CcWN1g0K.js","assets/utils-B8VQ4rym-D7HXbP0h.js","assets/codemirror-editor-C26JzzXV.js"] } return indexes.map((i) => __vite__mapDeps.viteFileDeps[i]) } @@ -20,25 +20,25 @@ function __vite__mapDeps(indexes) { * @vue/runtime-dom v3.4.21 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/const xp="http://www.w3.org/2000/svg",Ap="http://www.w3.org/1998/Math/MathML",Ut=typeof document<"u"?document:null,ra=Ut&&Ut.createElement("template"),kp={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const l=t==="svg"?Ut.createElementNS(xp,e):t==="mathml"?Ut.createElementNS(Ap,e):Ut.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&l.setAttribute("multiple",r.multiple),l},createText:e=>Ut.createTextNode(e),createComment:e=>Ut.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ut.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,l,o){const s=n?n.previousSibling:t.lastChild;if(l&&(l===o||l.nextSibling))for(;t.insertBefore(l.cloneNode(!0),n),!(l===o||!(l=l.nextSibling)););else{ra.innerHTML=r==="svg"?`${e}`:r==="mathml"?`${e}`:e;const i=ra.content;if(r==="svg"||r==="mathml"){const c=i.firstChild;for(;c.firstChild;)i.appendChild(c.firstChild);i.removeChild(c)}t.insertBefore(i,n)}return[s?s.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Nt="transition",Yn="animation",Fn=Symbol("_vtc"),Jt=(e,{slots:t})=>a($d,ac(e),t);Jt.displayName="Transition";const sc={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Tp=Jt.props=$e({},$i,sc),sn=(e,t=[])=>{Z(e)?e.forEach(n=>n(...t)):e&&e(...t)},la=e=>e?Z(e)?e.some(t=>t.length>1):e.length>1:!1;function ac(e){const t={};for(const R in e)R in sc||(t[R]=e[R]);if(e.css===!1)return t;const{name:n="v",type:r,duration:l,enterFromClass:o=`${n}-enter-from`,enterActiveClass:s=`${n}-enter-active`,enterToClass:i=`${n}-enter-to`,appearFromClass:c=o,appearActiveClass:u=s,appearToClass:f=i,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:h=`${n}-leave-to`}=e,g=Lp(l),E=g&&g[0],_=g&&g[1],{onBeforeEnter:b,onEnter:S,onEnterCancelled:y,onLeave:A,onLeaveCancelled:D,onBeforeAppear:x=b,onAppear:G=S,onAppearCancelled:H=y}=t,J=(R,ee,Te)=>{Ft(R,ee?f:i),Ft(R,ee?u:s),Te&&Te()},M=(R,ee)=>{R._isLeaving=!1,Ft(R,d),Ft(R,h),Ft(R,p),ee&&ee()},U=R=>(ee,Te)=>{const xe=R?G:S,q=()=>J(ee,R,Te);sn(xe,[ee,q]),oa(()=>{Ft(ee,R?c:o),Mt(ee,R?f:i),la(xe)||sa(ee,r,E,q)})};return $e(t,{onBeforeEnter(R){sn(b,[R]),Mt(R,o),Mt(R,s)},onBeforeAppear(R){sn(x,[R]),Mt(R,c),Mt(R,u)},onEnter:U(!1),onAppear:U(!0),onLeave(R,ee){R._isLeaving=!0;const Te=()=>M(R,ee);Mt(R,d),cc(),Mt(R,p),oa(()=>{R._isLeaving&&(Ft(R,d),Mt(R,h),la(A)||sa(R,r,_,Te))}),sn(A,[R,Te])},onEnterCancelled(R){J(R,!1),sn(y,[R])},onAppearCancelled(R){J(R,!0),sn(H,[R])},onLeaveCancelled(R){M(R),sn(D,[R])}})}function Lp(e){if(e==null)return null;if(Ce(e))return[Gl(e.enter),Gl(e.leave)];{const t=Gl(e);return[t,t]}}function Gl(e){return Pf(e)}function Mt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Fn]||(e[Fn]=new Set)).add(t)}function Ft(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[Fn];n&&(n.delete(t),n.size||(e[Fn]=void 0))}function oa(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Ip=0;function sa(e,t,n,r){const l=e._endId=++Ip,o=()=>{l===e._endId&&r()};if(n)return setTimeout(o,n);const{type:s,timeout:i,propCount:c}=ic(e,t);if(!s)return r();const u=s+"end";let f=0;const d=()=>{e.removeEventListener(u,p),o()},p=h=>{h.target===e&&++f>=c&&d()};setTimeout(()=>{f(n[g]||"").split(", "),l=r(`${Nt}Delay`),o=r(`${Nt}Duration`),s=aa(l,o),i=r(`${Yn}Delay`),c=r(`${Yn}Duration`),u=aa(i,c);let f=null,d=0,p=0;t===Nt?s>0&&(f=Nt,d=s,p=o.length):t===Yn?u>0&&(f=Yn,d=u,p=c.length):(d=Math.max(s,u),f=d>0?s>u?Nt:Yn:null,p=f?f===Nt?o.length:c.length:0);const h=f===Nt&&/\b(transform|all)(,|$)/.test(r(`${Nt}Property`).toString());return{type:f,timeout:d,propCount:p,hasTransform:h}}function aa(e,t){for(;e.lengthia(n)+ia(e[r])))}function ia(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function cc(){return document.body.offsetHeight}function Mp(e,t,n){const r=e[Fn];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const vl=Symbol("_vod"),uc=Symbol("_vsh"),Y4={beforeMount(e,{value:t},{transition:n}){e[vl]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Jn(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),Jn(e,!0),r.enter(e)):r.leave(e,()=>{Jn(e,!1)}):Jn(e,t))},beforeUnmount(e,{value:t}){Jn(e,t)}};function Jn(e,t){e.style.display=t?e[vl]:"none",e[uc]=!t}const Rp=Symbol(""),Pp=/(^|;)\s*display\s*:/;function Op(e,t,n){const r=e.style,l=De(n);let o=!1;if(n&&!l){if(t)if(De(t))for(const s of t.split(";")){const i=s.slice(0,s.indexOf(":")).trim();n[i]==null&&ol(r,i,"")}else for(const s in t)n[s]==null&&ol(r,s,"");for(const s in n)s==="display"&&(o=!0),ol(r,s,n[s])}else if(l){if(t!==n){const s=r[Rp];s&&(n+=";"+s),r.cssText=n,o=Pp.test(n)}}else t&&e.removeAttribute("style");vl in e&&(e[vl]=o?r.display:"",e[uc]&&(r.display="none"))}const ca=/\s*!important$/;function ol(e,t,n){if(Z(n))n.forEach(r=>ol(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=$p(e,t);ca.test(n)?e.setProperty(Xt(r),n.replace(ca,""),"important"):e[r]=n}}const ua=["Webkit","Moz","ms"],Wl={};function $p(e,t){const n=Wl[t];if(n)return n;let r=nt(t);if(r!=="filter"&&r in e)return Wl[t]=r;r=xr(r);for(let l=0;lKl||(zp.then(()=>Kl=0),Kl=Date.now());function jp(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;it(Up(r,n.value),t,5,[r])};return n.value=e,n.attached=Vp(),n}function Up(e,t){if(Z(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>l=>!l._stopped&&r&&r(l))}else return t}const ha=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,qp=(e,t,n,r,l,o,s,i,c)=>{const u=l==="svg";t==="class"?Mp(e,r,u):t==="style"?Op(e,n,r):Sr(t)?Ho(t)||Bp(e,t,n,r,s):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Gp(e,t,r,u))?Hp(e,t,r,o,s,i,c):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Dp(e,t,r,u))};function Gp(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&ha(t)&&re(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const l=e.tagName;if(l==="IMG"||l==="VIDEO"||l==="CANVAS"||l==="SOURCE")return!1}return ha(t)&&De(n)?!1:t in e}const fc=new WeakMap,dc=new WeakMap,ml=Symbol("_moveCb"),va=Symbol("_enterCb"),pc={name:"TransitionGroup",props:$e({},Tp,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=qn(),r=Oi();let l,o;return Ni(()=>{if(!l.length)return;const s=e.moveClass||`${e.name||"v"}-move`;if(!Xp(l[0].el,n.vnode.el,s))return;l.forEach(Yp),l.forEach(Jp);const i=l.filter(Qp);cc(),i.forEach(c=>{const u=c.el,f=u.style;Mt(u,s),f.transform=f.webkitTransform=f.transitionDuration="";const d=u[ml]=p=>{p&&p.target!==u||(!p||/transform$/.test(p.propertyName))&&(u.removeEventListener("transitionend",d),u[ml]=null,Ft(u,s))};u.addEventListener("transitionend",d)})}),()=>{const s=ae(e),i=ac(s);let c=s.tag||qe;l=o,o=t.default?Qo(t.default()):[];for(let u=0;udelete e.mode;pc.props;const Kp=pc;function Yp(e){const t=e.el;t[ml]&&t[ml](),t[va]&&t[va]()}function Jp(e){dc.set(e,e.el.getBoundingClientRect())}function Qp(e){const t=fc.get(e),n=dc.get(e),r=t.left-n.left,l=t.top-n.top;if(r||l){const o=e.el.style;return o.transform=o.webkitTransform=`translate(${r}px,${l}px)`,o.transitionDuration="0s",e}}function Xp(e,t,n){const r=e.cloneNode(),l=e[Fn];l&&l.forEach(i=>{i.split(/\s+/).forEach(c=>c&&r.classList.remove(c))}),n.split(/\s+/).forEach(i=>i&&r.classList.add(i)),r.style.display="none";const o=t.nodeType===1?t:t.parentNode;o.appendChild(r);const{hasTransform:s}=ic(r);return o.removeChild(r),s}const ma=e=>{const t=e.props["onUpdate:modelValue"]||!1;return Z(t)?n=>rl(t,n):t};function Zp(e){e.target.composing=!0}function ga(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Yl=Symbol("_assign"),J4={created(e,{modifiers:{lazy:t,trim:n,number:r}},l){e[Yl]=ma(l);const o=r||l.props&&l.props.type==="number";xn(e,t?"change":"input",s=>{if(s.target.composing)return;let i=e.value;n&&(i=i.trim()),o&&(i=uo(i)),e[Yl](i)}),n&&xn(e,"change",()=>{e.value=e.value.trim()}),t||(xn(e,"compositionstart",Zp),xn(e,"compositionend",ga),xn(e,"change",ga))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:r,number:l}},o){if(e[Yl]=ma(o),e.composing)return;const s=l||e.type==="number"?uo(e.value):e.value,i=t??"";s!==i&&(document.activeElement===e&&e.type!=="range"&&(n||r&&e.value.trim()===i)||(e.value=i))}},e1=["ctrl","shift","alt","meta"],t1={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>e1.some(n=>e[`${n}Key`]&&!t.includes(n))},Q4=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(l,...o)=>{for(let s=0;s{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=l=>{if(!("key"in l))return;const o=Xt(l.key);if(t.some(s=>s===o||n1[s]===o))return e(l)})},r1=$e({patchProp:qp},kp);let Jl,ya=!1;function l1(){return Jl=ya?Jl:ip(r1),ya=!0,Jl}const o1=(...e)=>{const t=l1().createApp(...e),{mount:n}=t;return t.mount=r=>{const l=a1(r);if(l)return n(l,!0,s1(l))},t};function s1(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function a1(e){return De(e)?document.querySelector(e):e}var i1=["link","meta","script","style","noscript","template"],c1=["title","base"],u1=([e,t,n])=>c1.includes(e)?e:i1.includes(e)?e==="meta"&&t.name?`${e}.${t.name}`:e==="template"&&t.id?`${e}.${t.id}`:JSON.stringify([e,Object.entries(t).map(([r,l])=>typeof l=="boolean"?l?[r,""]:null:[r,l]).filter(r=>r!=null).sort(([r],[l])=>r.localeCompare(l)),n]):null,f1=e=>{const t=new Set,n=[];return e.forEach(r=>{const l=u1(r);l&&!t.has(l)&&(t.add(l),n.push(r))}),n},d1=e=>e[0]==="/"?e:`/${e}`,hc=e=>e[e.length-1]==="/"||e.endsWith(".html")?e:`${e}/`,Zt=e=>/^(https?:)?\/\//.test(e),p1=/.md((\?|#).*)?$/,vr=(e,t="/")=>!!(Zt(e)||e.startsWith("/")&&!e.startsWith(t)&&!p1.test(e)),vc=e=>/^[a-z][a-z0-9+.-]*:/.test(e),Kt=e=>Object.prototype.toString.call(e)==="[object Object]",h1=e=>{const[t,...n]=e.split(/(\?|#)/);if(!t||t.endsWith("/"))return e;let r=t.replace(/(^|\/)README.md$/i,"$1index.html");return r.endsWith(".md")?r=r.substring(0,r.length-3)+".html":r.endsWith(".html")||(r=r+".html"),r.endsWith("/index.html")&&(r=r.substring(0,r.length-10)),r+n.join("")},ts=e=>e[e.length-1]==="/"?e.slice(0,-1):e,mc=e=>e[0]==="/"?e.slice(1):e,v1=(e,t)=>{const n=Object.keys(e).sort((r,l)=>{const o=l.split("/").length-r.split("/").length;return o!==0?o:l.length-r.length});for(const r of n)if(t.startsWith(r))return r;return"/"},m1=e=>typeof e=="function",Me=e=>typeof e=="string";const g1="modulepreload",y1=function(e){return"/"+e},ba={},V=function(t,n,r){let l=Promise.resolve();if(n&&n.length>0){const o=document.getElementsByTagName("link");l=Promise.all(n.map(s=>{if(s=y1(s),s in ba)return;ba[s]=!0;const i=s.endsWith(".css"),c=i?'[rel="stylesheet"]':"";if(!!r)for(let d=o.length-1;d>=0;d--){const p=o[d];if(p.href===s&&(!i||p.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${s}"]${c}`))return;const f=document.createElement("link");if(f.rel=i?"stylesheet":g1,i||(f.as="script",f.crossOrigin=""),f.href=s,document.head.appendChild(f),i)return new Promise((d,p)=>{f.addEventListener("load",d),f.addEventListener("error",()=>p(new Error(`Unable to preload CSS for ${s}`)))})}))}return l.then(()=>t()).catch(o=>{const s=new Event("vite:preloadError",{cancelable:!0});if(s.payload=o,window.dispatchEvent(s),!s.defaultPrevented)throw o})},b1=JSON.parse('{"/Catalogue/about.html":"/about/","/Catalogue/about.md":"/about/","/Catalogue/friends.html":"/friends/","/Catalogue/friends.md":"/friends/","/posts/Air32的HAL改造——适配MCO.html":"/posts/Air32-HAL-MCO/","/posts/Air32的HAL改造——适配MCO.md":"/posts/Air32-HAL-MCO/","/posts/HelloWorld.html":"/posts/HelloWorld/","/posts/HelloWorld.md":"/posts/HelloWorld/","/posts/不服来跑个分?将CoreMark移植到STC上试试.html":"/posts/STC_CoreMark/","/posts/不服来跑个分?将CoreMark移植到STC上试试.md":"/posts/STC_CoreMark/","/posts/为什么我对第三代郊狼失望.html":"/posts/why_i_am_disappointed_with_the_third_generation_of_wolf/","/posts/为什么我对第三代郊狼失望.md":"/posts/why_i_am_disappointed_with_the_third_generation_of_wolf/","/posts/使用Clion来进行Air32的开发.html":"/posts/Air32-Clion/","/posts/使用Clion来进行Air32的开发.md":"/posts/Air32-Clion/","/posts/发挥全部实力!Air32在HAL库环境下运行最高主频.html":"/posts/Air32-HAL-HighFreq/","/posts/发挥全部实力!Air32在HAL库环境下运行最高主频.md":"/posts/Air32-HAL-HighFreq/","/posts/在嵌入式设备上使用fmtlib.html":"/posts/embedded_fmtlib/","/posts/在嵌入式设备上使用fmtlib.md":"/posts/embedded_fmtlib/","/posts/基于conda进行手动配置novelAI.html":"/posts/conda_novelai/","/posts/基于conda进行手动配置novelAI.md":"/posts/conda_novelai/","/posts/墨水屏的坑——7.5寸墨水屏刷新为何出现条纹.html":"/posts/EpdTraps1/","/posts/墨水屏的坑——7.5寸墨水屏刷新为何出现条纹.md":"/posts/EpdTraps1/","/posts/对《为什么我对第三代郊狼失望》一文的澄清说明.html":"/posts/clarification_of_why_i_am_disappointed_with_the_third_generation_of_wolf/","/posts/对《为什么我对第三代郊狼失望》一文的澄清说明.md":"/posts/clarification_of_why_i_am_disappointed_with_the_third_generation_of_wolf/","/posts/嵌入式中的CI-CD.html":"/posts/Empedded-CI-CD/","/posts/嵌入式中的CI-CD.md":"/posts/Empedded-CI-CD/","/posts/更现代的开发方式?使用MDK6进行开发.html":"/posts/MDK6-Dev/","/posts/更现代的开发方式?使用MDK6进行开发.md":"/posts/MDK6-Dev/","/posts/更高效的日志查看方式——使用SEGGER-RTT.html":"/posts/SEGGER-RTT/","/posts/更高效的日志查看方式——使用SEGGER-RTT.md":"/posts/SEGGER-RTT/","/resume/FAE.html":"/kfGjHcdk36vg74_H/FAE/","/resume/FAE.md":"/kfGjHcdk36vg74_H/FAE/"}'),_1=Object.fromEntries([["/",{loader:()=>V(()=>import("./index.html-BjDCDFcK.js"),__vite__mapDeps([0,1])),meta:{y:"h",t:"HalfSweet's Blog",i:"home"}}],["/about/",{loader:()=>V(()=>import("./index.html-Ddt16gXd.js"),__vite__mapDeps([2,1])),meta:{y:"p",t:"关于"}}],["/friends/",{loader:()=>V(()=>import("./index.html-tbRgCCxM.js"),__vite__mapDeps([3,1])),meta:{y:"p",t:"友情链接"}}],["/posts/Air32-HAL-MCO/",{loader:()=>V(()=>import("./index.html-JQjTbVf7.js"),__vite__mapDeps([4,1])),meta:{a:{name:"HalfSweet",link:"https://github.com/HalfSweet"},d:16925724e5,l:"2023年8月20日",c:["单片机"],g:["Air32","合宙","MCO"],e:`

上篇文章 中,我们把 HAL 库移植给了 Air32,那现在让我们尝试添加一些 HAL 库特有的功能吧,比如这篇文章中描述的MCO

-`,r:{minutes:2.98,words:893},y:"a",t:"Air32 的 HAL 改造——适配 MCO"}}],["/posts/HelloWorld/",{loader:()=>V(()=>import("./index.html-9KHhnrQG.js"),__vite__mapDeps([5,1])),meta:{a:{name:"HalfSweet",link:"https://github.com/HalfSweet"},d:1667251547e3,l:"2022年10月31日",c:["网站"],g:["HelloWorld"],e:`

今天搭建好了属于自己的一个博客站,希望今后能保持记录的习惯,写下自己遇到的坑以及收获。这是博客的一个启程,也是自己的一个新起点。

+**/const xp="http://www.w3.org/2000/svg",Ap="http://www.w3.org/1998/Math/MathML",Ut=typeof document<"u"?document:null,ra=Ut&&Ut.createElement("template"),kp={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const l=t==="svg"?Ut.createElementNS(xp,e):t==="mathml"?Ut.createElementNS(Ap,e):Ut.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&l.setAttribute("multiple",r.multiple),l},createText:e=>Ut.createTextNode(e),createComment:e=>Ut.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ut.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,l,o){const s=n?n.previousSibling:t.lastChild;if(l&&(l===o||l.nextSibling))for(;t.insertBefore(l.cloneNode(!0),n),!(l===o||!(l=l.nextSibling)););else{ra.innerHTML=r==="svg"?`${e}`:r==="mathml"?`${e}`:e;const i=ra.content;if(r==="svg"||r==="mathml"){const c=i.firstChild;for(;c.firstChild;)i.appendChild(c.firstChild);i.removeChild(c)}t.insertBefore(i,n)}return[s?s.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Nt="transition",Yn="animation",Fn=Symbol("_vtc"),Jt=(e,{slots:t})=>a($d,ac(e),t);Jt.displayName="Transition";const sc={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Tp=Jt.props=$e({},$i,sc),sn=(e,t=[])=>{Z(e)?e.forEach(n=>n(...t)):e&&e(...t)},la=e=>e?Z(e)?e.some(t=>t.length>1):e.length>1:!1;function ac(e){const t={};for(const R in e)R in sc||(t[R]=e[R]);if(e.css===!1)return t;const{name:n="v",type:r,duration:l,enterFromClass:o=`${n}-enter-from`,enterActiveClass:s=`${n}-enter-active`,enterToClass:i=`${n}-enter-to`,appearFromClass:c=o,appearActiveClass:u=s,appearToClass:f=i,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:h=`${n}-leave-to`}=e,g=Lp(l),E=g&&g[0],_=g&&g[1],{onBeforeEnter:b,onEnter:S,onEnterCancelled:y,onLeave:A,onLeaveCancelled:D,onBeforeAppear:x=b,onAppear:G=S,onAppearCancelled:H=y}=t,J=(R,ee,Te)=>{Ft(R,ee?f:i),Ft(R,ee?u:s),Te&&Te()},M=(R,ee)=>{R._isLeaving=!1,Ft(R,d),Ft(R,h),Ft(R,p),ee&&ee()},U=R=>(ee,Te)=>{const xe=R?G:S,q=()=>J(ee,R,Te);sn(xe,[ee,q]),oa(()=>{Ft(ee,R?c:o),Mt(ee,R?f:i),la(xe)||sa(ee,r,E,q)})};return $e(t,{onBeforeEnter(R){sn(b,[R]),Mt(R,o),Mt(R,s)},onBeforeAppear(R){sn(x,[R]),Mt(R,c),Mt(R,u)},onEnter:U(!1),onAppear:U(!0),onLeave(R,ee){R._isLeaving=!0;const Te=()=>M(R,ee);Mt(R,d),cc(),Mt(R,p),oa(()=>{R._isLeaving&&(Ft(R,d),Mt(R,h),la(A)||sa(R,r,_,Te))}),sn(A,[R,Te])},onEnterCancelled(R){J(R,!1),sn(y,[R])},onAppearCancelled(R){J(R,!0),sn(H,[R])},onLeaveCancelled(R){M(R),sn(D,[R])}})}function Lp(e){if(e==null)return null;if(Ce(e))return[Gl(e.enter),Gl(e.leave)];{const t=Gl(e);return[t,t]}}function Gl(e){return Pf(e)}function Mt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Fn]||(e[Fn]=new Set)).add(t)}function Ft(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[Fn];n&&(n.delete(t),n.size||(e[Fn]=void 0))}function oa(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Ip=0;function sa(e,t,n,r){const l=e._endId=++Ip,o=()=>{l===e._endId&&r()};if(n)return setTimeout(o,n);const{type:s,timeout:i,propCount:c}=ic(e,t);if(!s)return r();const u=s+"end";let f=0;const d=()=>{e.removeEventListener(u,p),o()},p=h=>{h.target===e&&++f>=c&&d()};setTimeout(()=>{f(n[g]||"").split(", "),l=r(`${Nt}Delay`),o=r(`${Nt}Duration`),s=aa(l,o),i=r(`${Yn}Delay`),c=r(`${Yn}Duration`),u=aa(i,c);let f=null,d=0,p=0;t===Nt?s>0&&(f=Nt,d=s,p=o.length):t===Yn?u>0&&(f=Yn,d=u,p=c.length):(d=Math.max(s,u),f=d>0?s>u?Nt:Yn:null,p=f?f===Nt?o.length:c.length:0);const h=f===Nt&&/\b(transform|all)(,|$)/.test(r(`${Nt}Property`).toString());return{type:f,timeout:d,propCount:p,hasTransform:h}}function aa(e,t){for(;e.lengthia(n)+ia(e[r])))}function ia(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function cc(){return document.body.offsetHeight}function Mp(e,t,n){const r=e[Fn];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const vl=Symbol("_vod"),uc=Symbol("_vsh"),Y4={beforeMount(e,{value:t},{transition:n}){e[vl]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Jn(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),Jn(e,!0),r.enter(e)):r.leave(e,()=>{Jn(e,!1)}):Jn(e,t))},beforeUnmount(e,{value:t}){Jn(e,t)}};function Jn(e,t){e.style.display=t?e[vl]:"none",e[uc]=!t}const Rp=Symbol(""),Pp=/(^|;)\s*display\s*:/;function Op(e,t,n){const r=e.style,l=De(n);let o=!1;if(n&&!l){if(t)if(De(t))for(const s of t.split(";")){const i=s.slice(0,s.indexOf(":")).trim();n[i]==null&&ol(r,i,"")}else for(const s in t)n[s]==null&&ol(r,s,"");for(const s in n)s==="display"&&(o=!0),ol(r,s,n[s])}else if(l){if(t!==n){const s=r[Rp];s&&(n+=";"+s),r.cssText=n,o=Pp.test(n)}}else t&&e.removeAttribute("style");vl in e&&(e[vl]=o?r.display:"",e[uc]&&(r.display="none"))}const ca=/\s*!important$/;function ol(e,t,n){if(Z(n))n.forEach(r=>ol(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=$p(e,t);ca.test(n)?e.setProperty(Xt(r),n.replace(ca,""),"important"):e[r]=n}}const ua=["Webkit","Moz","ms"],Wl={};function $p(e,t){const n=Wl[t];if(n)return n;let r=nt(t);if(r!=="filter"&&r in e)return Wl[t]=r;r=xr(r);for(let l=0;lKl||(zp.then(()=>Kl=0),Kl=Date.now());function jp(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;it(Up(r,n.value),t,5,[r])};return n.value=e,n.attached=Vp(),n}function Up(e,t){if(Z(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>l=>!l._stopped&&r&&r(l))}else return t}const ha=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,qp=(e,t,n,r,l,o,s,i,c)=>{const u=l==="svg";t==="class"?Mp(e,r,u):t==="style"?Op(e,n,r):Sr(t)?Ho(t)||Bp(e,t,n,r,s):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Gp(e,t,r,u))?Hp(e,t,r,o,s,i,c):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Dp(e,t,r,u))};function Gp(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&ha(t)&&re(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const l=e.tagName;if(l==="IMG"||l==="VIDEO"||l==="CANVAS"||l==="SOURCE")return!1}return ha(t)&&De(n)?!1:t in e}const fc=new WeakMap,dc=new WeakMap,ml=Symbol("_moveCb"),va=Symbol("_enterCb"),pc={name:"TransitionGroup",props:$e({},Tp,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=qn(),r=Oi();let l,o;return Ni(()=>{if(!l.length)return;const s=e.moveClass||`${e.name||"v"}-move`;if(!Xp(l[0].el,n.vnode.el,s))return;l.forEach(Yp),l.forEach(Jp);const i=l.filter(Qp);cc(),i.forEach(c=>{const u=c.el,f=u.style;Mt(u,s),f.transform=f.webkitTransform=f.transitionDuration="";const d=u[ml]=p=>{p&&p.target!==u||(!p||/transform$/.test(p.propertyName))&&(u.removeEventListener("transitionend",d),u[ml]=null,Ft(u,s))};u.addEventListener("transitionend",d)})}),()=>{const s=ae(e),i=ac(s);let c=s.tag||qe;l=o,o=t.default?Qo(t.default()):[];for(let u=0;udelete e.mode;pc.props;const Kp=pc;function Yp(e){const t=e.el;t[ml]&&t[ml](),t[va]&&t[va]()}function Jp(e){dc.set(e,e.el.getBoundingClientRect())}function Qp(e){const t=fc.get(e),n=dc.get(e),r=t.left-n.left,l=t.top-n.top;if(r||l){const o=e.el.style;return o.transform=o.webkitTransform=`translate(${r}px,${l}px)`,o.transitionDuration="0s",e}}function Xp(e,t,n){const r=e.cloneNode(),l=e[Fn];l&&l.forEach(i=>{i.split(/\s+/).forEach(c=>c&&r.classList.remove(c))}),n.split(/\s+/).forEach(i=>i&&r.classList.add(i)),r.style.display="none";const o=t.nodeType===1?t:t.parentNode;o.appendChild(r);const{hasTransform:s}=ic(r);return o.removeChild(r),s}const ma=e=>{const t=e.props["onUpdate:modelValue"]||!1;return Z(t)?n=>rl(t,n):t};function Zp(e){e.target.composing=!0}function ga(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Yl=Symbol("_assign"),J4={created(e,{modifiers:{lazy:t,trim:n,number:r}},l){e[Yl]=ma(l);const o=r||l.props&&l.props.type==="number";xn(e,t?"change":"input",s=>{if(s.target.composing)return;let i=e.value;n&&(i=i.trim()),o&&(i=uo(i)),e[Yl](i)}),n&&xn(e,"change",()=>{e.value=e.value.trim()}),t||(xn(e,"compositionstart",Zp),xn(e,"compositionend",ga),xn(e,"change",ga))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:r,number:l}},o){if(e[Yl]=ma(o),e.composing)return;const s=l||e.type==="number"?uo(e.value):e.value,i=t??"";s!==i&&(document.activeElement===e&&e.type!=="range"&&(n||r&&e.value.trim()===i)||(e.value=i))}},e1=["ctrl","shift","alt","meta"],t1={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>e1.some(n=>e[`${n}Key`]&&!t.includes(n))},Q4=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(l,...o)=>{for(let s=0;s{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=l=>{if(!("key"in l))return;const o=Xt(l.key);if(t.some(s=>s===o||n1[s]===o))return e(l)})},r1=$e({patchProp:qp},kp);let Jl,ya=!1;function l1(){return Jl=ya?Jl:ip(r1),ya=!0,Jl}const o1=(...e)=>{const t=l1().createApp(...e),{mount:n}=t;return t.mount=r=>{const l=a1(r);if(l)return n(l,!0,s1(l))},t};function s1(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function a1(e){return De(e)?document.querySelector(e):e}var i1=["link","meta","script","style","noscript","template"],c1=["title","base"],u1=([e,t,n])=>c1.includes(e)?e:i1.includes(e)?e==="meta"&&t.name?`${e}.${t.name}`:e==="template"&&t.id?`${e}.${t.id}`:JSON.stringify([e,Object.entries(t).map(([r,l])=>typeof l=="boolean"?l?[r,""]:null:[r,l]).filter(r=>r!=null).sort(([r],[l])=>r.localeCompare(l)),n]):null,f1=e=>{const t=new Set,n=[];return e.forEach(r=>{const l=u1(r);l&&!t.has(l)&&(t.add(l),n.push(r))}),n},d1=e=>e[0]==="/"?e:`/${e}`,hc=e=>e[e.length-1]==="/"||e.endsWith(".html")?e:`${e}/`,Zt=e=>/^(https?:)?\/\//.test(e),p1=/.md((\?|#).*)?$/,vr=(e,t="/")=>!!(Zt(e)||e.startsWith("/")&&!e.startsWith(t)&&!p1.test(e)),vc=e=>/^[a-z][a-z0-9+.-]*:/.test(e),Kt=e=>Object.prototype.toString.call(e)==="[object Object]",h1=e=>{const[t,...n]=e.split(/(\?|#)/);if(!t||t.endsWith("/"))return e;let r=t.replace(/(^|\/)README.md$/i,"$1index.html");return r.endsWith(".md")?r=r.substring(0,r.length-3)+".html":r.endsWith(".html")||(r=r+".html"),r.endsWith("/index.html")&&(r=r.substring(0,r.length-10)),r+n.join("")},ts=e=>e[e.length-1]==="/"?e.slice(0,-1):e,mc=e=>e[0]==="/"?e.slice(1):e,v1=(e,t)=>{const n=Object.keys(e).sort((r,l)=>{const o=l.split("/").length-r.split("/").length;return o!==0?o:l.length-r.length});for(const r of n)if(t.startsWith(r))return r;return"/"},m1=e=>typeof e=="function",Me=e=>typeof e=="string";const g1="modulepreload",y1=function(e){return"/"+e},ba={},V=function(t,n,r){let l=Promise.resolve();if(n&&n.length>0){const o=document.getElementsByTagName("link");l=Promise.all(n.map(s=>{if(s=y1(s),s in ba)return;ba[s]=!0;const i=s.endsWith(".css"),c=i?'[rel="stylesheet"]':"";if(!!r)for(let d=o.length-1;d>=0;d--){const p=o[d];if(p.href===s&&(!i||p.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${s}"]${c}`))return;const f=document.createElement("link");if(f.rel=i?"stylesheet":g1,i||(f.as="script",f.crossOrigin=""),f.href=s,document.head.appendChild(f),i)return new Promise((d,p)=>{f.addEventListener("load",d),f.addEventListener("error",()=>p(new Error(`Unable to preload CSS for ${s}`)))})}))}return l.then(()=>t()).catch(o=>{const s=new Event("vite:preloadError",{cancelable:!0});if(s.payload=o,window.dispatchEvent(s),!s.defaultPrevented)throw o})},b1=JSON.parse('{"/Catalogue/about.html":"/about/","/Catalogue/about.md":"/about/","/Catalogue/friends.html":"/friends/","/Catalogue/friends.md":"/friends/","/posts/Air32的HAL改造——适配MCO.html":"/posts/Air32-HAL-MCO/","/posts/Air32的HAL改造——适配MCO.md":"/posts/Air32-HAL-MCO/","/posts/HelloWorld.html":"/posts/HelloWorld/","/posts/HelloWorld.md":"/posts/HelloWorld/","/posts/不服来跑个分?将CoreMark移植到STC上试试.html":"/posts/STC_CoreMark/","/posts/不服来跑个分?将CoreMark移植到STC上试试.md":"/posts/STC_CoreMark/","/posts/为什么我对第三代郊狼失望.html":"/posts/why_i_am_disappointed_with_the_third_generation_of_wolf/","/posts/为什么我对第三代郊狼失望.md":"/posts/why_i_am_disappointed_with_the_third_generation_of_wolf/","/posts/使用Clion来进行Air32的开发.html":"/posts/Air32-Clion/","/posts/使用Clion来进行Air32的开发.md":"/posts/Air32-Clion/","/posts/发挥全部实力!Air32在HAL库环境下运行最高主频.html":"/posts/Air32-HAL-HighFreq/","/posts/发挥全部实力!Air32在HAL库环境下运行最高主频.md":"/posts/Air32-HAL-HighFreq/","/posts/在嵌入式设备上使用fmtlib.html":"/posts/embedded_fmtlib/","/posts/在嵌入式设备上使用fmtlib.md":"/posts/embedded_fmtlib/","/posts/基于conda进行手动配置novelAI.html":"/posts/conda_novelai/","/posts/基于conda进行手动配置novelAI.md":"/posts/conda_novelai/","/posts/墨水屏的坑——7.5寸墨水屏刷新为何出现条纹.html":"/posts/EpdTraps1/","/posts/墨水屏的坑——7.5寸墨水屏刷新为何出现条纹.md":"/posts/EpdTraps1/","/posts/对《为什么我对第三代郊狼失望》一文的澄清说明.html":"/posts/clarification_of_why_i_am_disappointed_with_the_third_generation_of_wolf/","/posts/对《为什么我对第三代郊狼失望》一文的澄清说明.md":"/posts/clarification_of_why_i_am_disappointed_with_the_third_generation_of_wolf/","/posts/嵌入式中的CI-CD.html":"/posts/Empedded-CI-CD/","/posts/嵌入式中的CI-CD.md":"/posts/Empedded-CI-CD/","/posts/更现代的开发方式?使用MDK6进行开发.html":"/posts/MDK6-Dev/","/posts/更现代的开发方式?使用MDK6进行开发.md":"/posts/MDK6-Dev/","/posts/更高效的日志查看方式——使用SEGGER-RTT.html":"/posts/SEGGER-RTT/","/posts/更高效的日志查看方式——使用SEGGER-RTT.md":"/posts/SEGGER-RTT/","/resume/FAE.html":"/kfGjHcdk36vg74_H/FAE/","/resume/FAE.md":"/kfGjHcdk36vg74_H/FAE/"}'),_1=Object.fromEntries([["/",{loader:()=>V(()=>import("./index.html-D1YZ7jOc.js"),__vite__mapDeps([0,1])),meta:{y:"h",t:"HalfSweet's Blog",i:"home"}}],["/about/",{loader:()=>V(()=>import("./index.html-BFUnfahy.js"),__vite__mapDeps([2,1])),meta:{y:"p",t:"关于"}}],["/friends/",{loader:()=>V(()=>import("./index.html-VnGfOf4p.js"),__vite__mapDeps([3,1])),meta:{y:"p",t:"友情链接"}}],["/posts/Air32-HAL-MCO/",{loader:()=>V(()=>import("./index.html-BEhLK7A_.js"),__vite__mapDeps([4,1])),meta:{a:{name:"HalfSweet",link:"https://github.com/HalfSweet"},d:16925724e5,l:"2023年8月20日",c:["单片机"],g:["Air32","合宙","MCO"],e:`

上篇文章 中,我们把 HAL 库移植给了 Air32,那现在让我们尝试添加一些 HAL 库特有的功能吧,比如这篇文章中描述的MCO

+`,r:{minutes:2.98,words:893},y:"a",t:"Air32 的 HAL 改造——适配 MCO"}}],["/posts/HelloWorld/",{loader:()=>V(()=>import("./index.html-DjdvzSRj.js"),__vite__mapDeps([5,1])),meta:{a:{name:"HalfSweet",link:"https://github.com/HalfSweet"},d:1667251547e3,l:"2022年10月31日",c:["网站"],g:["HelloWorld"],e:`

今天搭建好了属于自己的一个博客站,希望今后能保持记录的习惯,写下自己遇到的坑以及收获。这是博客的一个启程,也是自己的一个新起点。

Hello, HalfSweet!

-`,r:{minutes:.28,words:85},y:"a",t:"HelloWorld"}}],["/posts/STC_CoreMark/",{loader:()=>V(()=>import("./index.html-BqNE83Tp.js"),__vite__mapDeps([6,1])),meta:{a:{name:"HalfSweet",link:"https://github.com/HalfSweet"},d:1681493976e3,l:"2023年4月14日",c:["单片机"],g:["STC32","STC8","嵌入式","CoreMark"],e:`

最近维护的 Air001 准备上线了,为了衬托出其强大的性价比,因此我想来做点缺德的事,让我们来和同样以高打性价比的 STC 系列单片机来对比下 CoreMark 的跑分吧,本文将会详细介绍移植过程以及跑分结果。测试的 MCU 为降龙棍 STC32G12K128打狗棒 STC8H8K64U

+`,r:{minutes:.28,words:85},y:"a",t:"HelloWorld"}}],["/posts/STC_CoreMark/",{loader:()=>V(()=>import("./index.html-DP5h2y3Z.js"),__vite__mapDeps([6,1])),meta:{a:{name:"HalfSweet",link:"https://github.com/HalfSweet"},d:1681493976e3,l:"2023年4月14日",c:["单片机"],g:["STC32","STC8","嵌入式","CoreMark"],e:`

最近维护的 Air001 准备上线了,为了衬托出其强大的性价比,因此我想来做点缺德的事,让我们来和同样以高打性价比的 STC 系列单片机来对比下 CoreMark 的跑分吧,本文将会详细介绍移植过程以及跑分结果。测试的 MCU 为降龙棍 STC32G12K128打狗棒 STC8H8K64U

通用,本文同样适用于 Arm-Cortex M 架构的 MCU。

-`,r:{minutes:4.64,words:1391},y:"a",t:"不服来跑个分?将 CoreMark 移植到 STC 上试试"}}],["/posts/why_i_am_disappointed_with_the_third_generation_of_wolf/",{loader:()=>V(()=>import("./index.html-BoAh0Ue-.js"),__vite__mapDeps([7,1])),meta:{a:{name:"HalfSweet",link:"https://github.com/HalfSweet"},d:1710525566e3,c:["posts"],g:["碎碎念","郊狼"],e:`

最近第三代郊狼开始内测了,作为一名电子爱好者,自然不能错过这个机会。于是我以原价 368 元的主机,以及 128 元两个智能按钮的价格,购买了一套第三代郊狼。

-`,r:{minutes:8.04,words:2412},y:"a",t:"为什么我对第三代郊狼失望"}}],["/posts/Air32-Clion/",{loader:()=>V(()=>import("./index.html-B03UjhVZ.js"),__vite__mapDeps([8,1])),meta:{a:{name:"HalfSweet",link:"https://github.com/HalfSweet"},d:16931682e5,l:"2023年8月27日",c:["单片机"],g:["Air32","合宙","Clion"],e:`

在上几篇文章中,我们将 HAL 库移植给了 Air32,但是我们的开发环境还是使用的 Keil,这样就会导致一些问题,比如 Keil 的代码提示不够友好,而且 Keil 的代码补全也不够完善,因此我们可以使用一个更好的开发环境,比如 Clion。

-`,r:{minutes:3.08,words:924},y:"a",t:"使用 Clion 来进行 Air32 的开发"}}],["/posts/Air32-HAL-HighFreq/",{loader:()=>V(()=>import("./index.html-_XmV6XzZ.js"),__vite__mapDeps([9,1])),meta:{a:{name:"HalfSweet",link:"https://github.com/HalfSweet"},d:16925634e5,l:"2023年8月20日",c:["单片机"],g:["Air32","合宙","超频"],e:`

最近打算把 Air32 也吃上 Arduino,发挥全部性能,就不用像是 Air001 那样束手束脚了,但是问题是 Arduino 的库是基于 HAL 的,那要用上 Arduino 就必定得先适配 HAL 库,那我们就来先尝试在 HAL 下让 Air32 跑到最高主频吧。

-`,r:{minutes:5.78,words:1733},y:"a",t:"发挥全部实力!Air32 在 HAL 库环境下运行最高主频"}}],["/posts/embedded_fmtlib/",{loader:()=>V(()=>import("./index.html-vq7A5bJZ.js"),__vite__mapDeps([10,1])),meta:{a:{name:"HalfSweet",link:"https://github.com/HalfSweet"},d:1675433337e3,l:"2023年2月3日",c:["posts"],g:["fmtlib","嵌入式","ESP8266","ESP32","Arduino","PlatformIO","ESP-IDF"],e:`

众所周知,在c++20以上的标准已经支持了std::format进行格式化输出,不过显而易见,嵌入式领域想要得到支持显然遥遥无期。但是我们已经厌倦了使用sprintf等方式来格式化字符串,c++的流特性又显得不够优雅,怎么才能用上类似于Python中format这样的方式来格式化并输出想要的字符串呢。

-`,r:{minutes:4.72,words:1415},y:"a",t:"在嵌入式设备上使用fmtlib"}}],["/posts/conda_novelai/",{loader:()=>V(()=>import("./index.html-C_11f0wc.js"),__vite__mapDeps([11,1])),meta:{a:{name:"HalfSweet",link:"https://github.com/HalfSweet"},d:1672924756e3,l:"2023年1月5日",c:["AI"],g:["人工智能","novelAI","conda"],e:`

最近大家应该都玩过novelAI了,出来的图片质量都非常棒,但是b站大佬给的配置只是打包了的bat文件,但是这显然不符合我们的折腾精神,于是我们来尝试使用conda来进行纯手工配置。

-`,r:{minutes:6.44,words:1933},y:"a",t:"基于conda进行手动配置novelAI"}}],["/posts/EpdTraps1/",{loader:()=>V(()=>import("./index.html-C5tCR2Lv.js"),__vite__mapDeps([12,1])),meta:{a:{name:"HalfSweet",link:"https://github.com/HalfSweet"},d:1667712637e3,l:"2022年11月6日",c:["墨水屏"],g:["墨水屏","UC8179","DEPG0750RWU790F30","遇到的坑"],e:`

前言

+`,r:{minutes:4.64,words:1391},y:"a",t:"不服来跑个分?将 CoreMark 移植到 STC 上试试"}}],["/posts/why_i_am_disappointed_with_the_third_generation_of_wolf/",{loader:()=>V(()=>import("./index.html-LvuOtC1p.js"),__vite__mapDeps([7,1])),meta:{a:{name:"HalfSweet",link:"https://github.com/HalfSweet"},d:1710525566e3,c:["posts"],g:["碎碎念","郊狼"],e:`

最近第三代郊狼开始内测了,作为一名电子爱好者,自然不能错过这个机会。于是我以原价 368 元的主机,以及 128 元两个智能按钮的价格,购买了一套第三代郊狼。

+`,r:{minutes:8.04,words:2412},y:"a",t:"为什么我对第三代郊狼失望"}}],["/posts/Air32-Clion/",{loader:()=>V(()=>import("./index.html-MvkaF6Zs.js"),__vite__mapDeps([8,1])),meta:{a:{name:"HalfSweet",link:"https://github.com/HalfSweet"},d:16931682e5,l:"2023年8月27日",c:["单片机"],g:["Air32","合宙","Clion"],e:`

在上几篇文章中,我们将 HAL 库移植给了 Air32,但是我们的开发环境还是使用的 Keil,这样就会导致一些问题,比如 Keil 的代码提示不够友好,而且 Keil 的代码补全也不够完善,因此我们可以使用一个更好的开发环境,比如 Clion。

+`,r:{minutes:3.08,words:924},y:"a",t:"使用 Clion 来进行 Air32 的开发"}}],["/posts/Air32-HAL-HighFreq/",{loader:()=>V(()=>import("./index.html-B3i_-qTt.js"),__vite__mapDeps([9,1])),meta:{a:{name:"HalfSweet",link:"https://github.com/HalfSweet"},d:16925634e5,l:"2023年8月20日",c:["单片机"],g:["Air32","合宙","超频"],e:`

最近打算把 Air32 也吃上 Arduino,发挥全部性能,就不用像是 Air001 那样束手束脚了,但是问题是 Arduino 的库是基于 HAL 的,那要用上 Arduino 就必定得先适配 HAL 库,那我们就来先尝试在 HAL 下让 Air32 跑到最高主频吧。

+`,r:{minutes:5.78,words:1733},y:"a",t:"发挥全部实力!Air32 在 HAL 库环境下运行最高主频"}}],["/posts/embedded_fmtlib/",{loader:()=>V(()=>import("./index.html-DY4rfiH_.js"),__vite__mapDeps([10,1])),meta:{a:{name:"HalfSweet",link:"https://github.com/HalfSweet"},d:1675433337e3,l:"2023年2月3日",c:["posts"],g:["fmtlib","嵌入式","ESP8266","ESP32","Arduino","PlatformIO","ESP-IDF"],e:`

众所周知,在c++20以上的标准已经支持了std::format进行格式化输出,不过显而易见,嵌入式领域想要得到支持显然遥遥无期。但是我们已经厌倦了使用sprintf等方式来格式化字符串,c++的流特性又显得不够优雅,怎么才能用上类似于Python中format这样的方式来格式化并输出想要的字符串呢。

+`,r:{minutes:4.72,words:1415},y:"a",t:"在嵌入式设备上使用fmtlib"}}],["/posts/conda_novelai/",{loader:()=>V(()=>import("./index.html-6thP6gMB.js"),__vite__mapDeps([11,1])),meta:{a:{name:"HalfSweet",link:"https://github.com/HalfSweet"},d:1672924756e3,l:"2023年1月5日",c:["AI"],g:["人工智能","novelAI","conda"],e:`

最近大家应该都玩过novelAI了,出来的图片质量都非常棒,但是b站大佬给的配置只是打包了的bat文件,但是这显然不符合我们的折腾精神,于是我们来尝试使用conda来进行纯手工配置。

+`,r:{minutes:6.44,words:1933},y:"a",t:"基于conda进行手动配置novelAI"}}],["/posts/EpdTraps1/",{loader:()=>V(()=>import("./index.html-BE6zFLO0.js"),__vite__mapDeps([12,1])),meta:{a:{name:"HalfSweet",link:"https://github.com/HalfSweet"},d:1667712637e3,l:"2022年11月6日",c:["墨水屏"],g:["墨水屏","UC8179","DEPG0750RWU790F30","遇到的坑"],e:`

前言

之前在我群里的同学应该都还记得,之前有朋友送给半糖两块7.5寸的墨水屏,其中一块是黑白双色的,标签型号是DEPG0750RWU790F30,驱动芯片则是UC8179。这块屏确实蛮好的,有着高达800*480的分辨率,并且因为是7.5寸所以可视面积非常大,但是在调试的过程中半糖发现了一个问题:这个屏幕的刷新过程中怎么会出现白色条纹,并且刷完的颜色非常怪?

-

其中上面一张图为我自己做的波形,第二张为使用的OTP波形,但是无一例外,都出现了刷新的问题。抱着也许是驱动板出问题了的想法,我重新lay了一次板子,焊接好之后发现问题确实有所改善,但是并不佳。后续在更换过程中发现采用cd32封装的68uH的电感刷新效果会更好一些,但是依旧存在刷新问题,特别是在UI中有竖着的线条的时候,特别影响观感。

`,r:{minutes:6.65,words:1996},y:"a",t:"墨水屏的坑——7.5寸墨水屏刷新为何出现条纹"}}],["/posts/clarification_of_why_i_am_disappointed_with_the_third_generation_of_wolf/",{loader:()=>V(()=>import("./index.html-T9Tdh1DC.js"),__vite__mapDeps([13,1])),meta:{a:{name:"HalfSweet",link:"https://github.com/HalfSweet"},d:1710914609e3,c:["posts"],g:["碎碎念","郊狼"],e:`

在上文 为什么我对第三代郊狼失望 一文中,我对于第三代郊狼的硬件部分进行了一些初步分析,因为没有详细的一些资料,因此在一些地方可能存在一些错误。在昨晚(2024-03-19)郊狼作者找到我,与我群群友进行了一番友好的长时间地交流,也解答了我对设计上的一些疑问。在本文中我们会逐步分析前文中提到的问题。

-`,r:{minutes:4.96,words:1487},y:"a",t:"对《为什么我对第三代郊狼失望》一文的澄清说明"}}],["/posts/Empedded-CI-CD/",{loader:()=>V(()=>import("./index.html-DfLaS-g0.js"),__vite__mapDeps([14,1])),meta:{a:{name:"HalfSweet",link:"https://github.com/HalfSweet"},d:17046306e5,l:"2024年1月7日",c:["单片机"],g:["Air001","合宙","CI/CD"],e:`

对于传统的嵌入式开发来说,我们一般常用的IDE都是诸如Keil、IAR等。这些IDE在方便了我们的开发的同时,也存在很多问题,例如在之前Keil-MDK5是不能跨平台的,仅限在Windows平台运行,并且它的授权也是一个老大难的问题。这样我们在团队协作的时候往往就会遇到很多问题,无法像是互联网的开发那样有一套完整的CI/CD流程。但是MDK6的更新解决了这个问题,第一它是跨平台的,这样在Windows、Linux以及MacOS上都能运行;并且也支持了很多命令行的操作,避免了繁琐的GUI操作,这样也更有利于自动化脚本的编写。

-`,r:{minutes:5.17,words:1550},y:"a",t:"嵌入式中的 CI/CD"}}],["/posts/MDK6-Dev/",{loader:()=>V(()=>import("./index.html-BqpLzhd2.js"),__vite__mapDeps([15,1])),meta:{a:{name:"HalfSweet",link:"https://github.com/HalfSweet"},d:16924464e5,l:"2023年8月19日",c:["单片机"],g:["Air001","Air32","合宙"],e:`

今日,在千呼万唤中,Arm 的 MDK6 桌面端终于出来了,本想作为第一批吃螃蟹的开发者,但是当时 Air32 和 Air001 的烧录均有问题,最后在 Arm 官方的支持下,终于可以正常使用了,那么现在我们就来尝试一下。

-`,r:{minutes:2.42,words:726},y:"a",t:"更现代的开发方式?使用 MDK6 进行开发"}}],["/posts/SEGGER-RTT/",{loader:()=>V(()=>import("./index.html-DjMEortk.js"),__vite__mapDeps([16,1])),meta:{a:{name:"HalfSweet",link:"https://github.com/HalfSweet"},d:1683384485e3,l:"2023年5月6日",c:["单片机"],g:["Air001","合宙","日志"],e:`

在日常的开发中,我们免不了使用各种各样的日志打印方式,使用调试器固然好用,但是无法直接打印局部变量以及会打断整个运行状态。并且对于众多Arduino的用户来说,直接打印日志显然是更直观的做法。但是直接使用串口打印的话需要一定的资源,并且速度会稍慢,并且可能会占用一个串口,对于资源就不多的MCU,我们有没有更方便的方法呢?

-`,r:{minutes:3.44,words:1033},y:"a",t:"更高效的日志查看方式——使用SEGGER-RTT"}}],["/kfGjHcdk36vg74_H/FAE/",{loader:()=>V(()=>import("./index.html-Clikzz6O.js"),__vite__mapDeps([17,1])),meta:{y:"p",t:"FAE 招聘广告!"}}],["/404.html",{loader:()=>V(()=>import("./404.html-tjgzxrjF.js"),__vite__mapDeps([18,1])),meta:{y:"p",t:""}}],["/posts/",{loader:()=>V(()=>import("./index.html-ByNehdus.js"),__vite__mapDeps([19,1])),meta:{y:"p",t:"Posts"}}],["/kfGjHcdk36vg74_H/",{loader:()=>V(()=>import("./index.html-BuR8_gfx.js"),__vite__mapDeps([20,1])),meta:{y:"p",t:"Kf Gj Hcdk36vg74 H"}}],["/category/",{loader:()=>V(()=>import("./index.html-CwC0Y3vt.js"),__vite__mapDeps([21,1])),meta:{y:"p",t:"分类",I:!1}}],["/category/%E5%8D%95%E7%89%87%E6%9C%BA/",{loader:()=>V(()=>import("./index.html-C11GOzyf.js"),__vite__mapDeps([22,1])),meta:{y:"p",t:"单片机 分类",I:!1}}],["/category/%E7%BD%91%E7%AB%99/",{loader:()=>V(()=>import("./index.html-B0BQONx7.js"),__vite__mapDeps([23,1])),meta:{y:"p",t:"网站 分类",I:!1}}],["/category/posts/",{loader:()=>V(()=>import("./index.html-CAJrOfb2.js"),__vite__mapDeps([24,1])),meta:{y:"p",t:"posts 分类",I:!1}}],["/category/ai/",{loader:()=>V(()=>import("./index.html-B_yf-6yg.js"),__vite__mapDeps([25,1])),meta:{y:"p",t:"AI 分类",I:!1}}],["/category/%E5%A2%A8%E6%B0%B4%E5%B1%8F/",{loader:()=>V(()=>import("./index.html-Ku40apzB.js"),__vite__mapDeps([26,1])),meta:{y:"p",t:"墨水屏 分类",I:!1}}],["/tag/",{loader:()=>V(()=>import("./index.html-lov27Z1Y.js"),__vite__mapDeps([27,1])),meta:{y:"p",t:"标签",I:!1}}],["/tag/air32/",{loader:()=>V(()=>import("./index.html-DooS4Jur.js"),__vite__mapDeps([28,1])),meta:{y:"p",t:"标签: Air32",I:!1}}],["/tag/%E5%90%88%E5%AE%99/",{loader:()=>V(()=>import("./index.html-D0OL2VSa.js"),__vite__mapDeps([29,1])),meta:{y:"p",t:"标签: 合宙",I:!1}}],["/tag/mco/",{loader:()=>V(()=>import("./index.html-wYSA4f6v.js"),__vite__mapDeps([30,1])),meta:{y:"p",t:"标签: MCO",I:!1}}],["/tag/helloworld/",{loader:()=>V(()=>import("./index.html-CCXgpmhd.js"),__vite__mapDeps([31,1])),meta:{y:"p",t:"标签: HelloWorld",I:!1}}],["/tag/stc32/",{loader:()=>V(()=>import("./index.html-BPzv_saF.js"),__vite__mapDeps([32,1])),meta:{y:"p",t:"标签: STC32",I:!1}}],["/tag/stc8/",{loader:()=>V(()=>import("./index.html-DaqcFT5Z.js"),__vite__mapDeps([33,1])),meta:{y:"p",t:"标签: STC8",I:!1}}],["/tag/%E5%B5%8C%E5%85%A5%E5%BC%8F/",{loader:()=>V(()=>import("./index.html-CFV0-xiy.js"),__vite__mapDeps([34,1])),meta:{y:"p",t:"标签: 嵌入式",I:!1}}],["/tag/coremark/",{loader:()=>V(()=>import("./index.html-B1miD6lF.js"),__vite__mapDeps([35,1])),meta:{y:"p",t:"标签: CoreMark",I:!1}}],["/tag/%E7%A2%8E%E7%A2%8E%E5%BF%B5/",{loader:()=>V(()=>import("./index.html-BF3gbJSq.js"),__vite__mapDeps([36,1])),meta:{y:"p",t:"标签: 碎碎念",I:!1}}],["/tag/%E9%83%8A%E7%8B%BC/",{loader:()=>V(()=>import("./index.html-D2MPprum.js"),__vite__mapDeps([37,1])),meta:{y:"p",t:"标签: 郊狼",I:!1}}],["/tag/clion/",{loader:()=>V(()=>import("./index.html-D0Xro9IC.js"),__vite__mapDeps([38,1])),meta:{y:"p",t:"标签: Clion",I:!1}}],["/tag/%E8%B6%85%E9%A2%91/",{loader:()=>V(()=>import("./index.html-DpshIR5i.js"),__vite__mapDeps([39,1])),meta:{y:"p",t:"标签: 超频",I:!1}}],["/tag/fmtlib/",{loader:()=>V(()=>import("./index.html-DmwkZ3IX.js"),__vite__mapDeps([40,1])),meta:{y:"p",t:"标签: fmtlib",I:!1}}],["/tag/esp8266/",{loader:()=>V(()=>import("./index.html-D4be0ngz.js"),__vite__mapDeps([41,1])),meta:{y:"p",t:"标签: ESP8266",I:!1}}],["/tag/esp32/",{loader:()=>V(()=>import("./index.html-HG2T5013.js"),__vite__mapDeps([42,1])),meta:{y:"p",t:"标签: ESP32",I:!1}}],["/tag/arduino/",{loader:()=>V(()=>import("./index.html-Ddhxs9O-.js"),__vite__mapDeps([43,1])),meta:{y:"p",t:"标签: Arduino",I:!1}}],["/tag/platformio/",{loader:()=>V(()=>import("./index.html-BsJpbz4T.js"),__vite__mapDeps([44,1])),meta:{y:"p",t:"标签: PlatformIO",I:!1}}],["/tag/esp-idf/",{loader:()=>V(()=>import("./index.html-OsYs9_ih.js"),__vite__mapDeps([45,1])),meta:{y:"p",t:"标签: ESP-IDF",I:!1}}],["/tag/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/",{loader:()=>V(()=>import("./index.html-Bltotfym.js"),__vite__mapDeps([46,1])),meta:{y:"p",t:"标签: 人工智能",I:!1}}],["/tag/novelai/",{loader:()=>V(()=>import("./index.html-Dw0_03bN.js"),__vite__mapDeps([47,1])),meta:{y:"p",t:"标签: novelAI",I:!1}}],["/tag/conda/",{loader:()=>V(()=>import("./index.html-xRA-nFgT.js"),__vite__mapDeps([48,1])),meta:{y:"p",t:"标签: conda",I:!1}}],["/tag/%E5%A2%A8%E6%B0%B4%E5%B1%8F/",{loader:()=>V(()=>import("./index.html-BkOWkGr0.js"),__vite__mapDeps([49,1])),meta:{y:"p",t:"标签: 墨水屏",I:!1}}],["/tag/uc8179/",{loader:()=>V(()=>import("./index.html-CdYPyfQS.js"),__vite__mapDeps([50,1])),meta:{y:"p",t:"标签: UC8179",I:!1}}],["/tag/depg0750rwu790f30/",{loader:()=>V(()=>import("./index.html-Dkwuk41p.js"),__vite__mapDeps([51,1])),meta:{y:"p",t:"标签: DEPG0750RWU790F30",I:!1}}],["/tag/%E9%81%87%E5%88%B0%E7%9A%84%E5%9D%91/",{loader:()=>V(()=>import("./index.html-DPtxJ82B.js"),__vite__mapDeps([52,1])),meta:{y:"p",t:"标签: 遇到的坑",I:!1}}],["/tag/air001/",{loader:()=>V(()=>import("./index.html-JdRoDqdx.js"),__vite__mapDeps([53,1])),meta:{y:"p",t:"标签: Air001",I:!1}}],["/tag/cicd/",{loader:()=>V(()=>import("./index.html-Db1qYjMb.js"),__vite__mapDeps([54,1])),meta:{y:"p",t:"标签: CI/CD",I:!1}}],["/tag/%E6%97%A5%E5%BF%97/",{loader:()=>V(()=>import("./index.html-BIAJOnnJ.js"),__vite__mapDeps([55,1])),meta:{y:"p",t:"标签: 日志",I:!1}}],["/article/",{loader:()=>V(()=>import("./index.html-B6ukxBY1.js"),__vite__mapDeps([56,1])),meta:{y:"p",t:"文章",I:!1}}],["/star/",{loader:()=>V(()=>import("./index.html-CVq_TAeH.js"),__vite__mapDeps([57,1])),meta:{y:"p",t:"星标",I:!1}}],["/timeline/",{loader:()=>V(()=>import("./index.html-DTMo7T57.js"),__vite__mapDeps([58,1])),meta:{y:"p",t:"时间轴",I:!1}}]]);/*! +

其中上面一张图为我自己做的波形,第二张为使用的OTP波形,但是无一例外,都出现了刷新的问题。抱着也许是驱动板出问题了的想法,我重新lay了一次板子,焊接好之后发现问题确实有所改善,但是并不佳。后续在更换过程中发现采用cd32封装的68uH的电感刷新效果会更好一些,但是依旧存在刷新问题,特别是在UI中有竖着的线条的时候,特别影响观感。

`,r:{minutes:6.65,words:1996},y:"a",t:"墨水屏的坑——7.5寸墨水屏刷新为何出现条纹"}}],["/posts/clarification_of_why_i_am_disappointed_with_the_third_generation_of_wolf/",{loader:()=>V(()=>import("./index.html-BttDIRc6.js"),__vite__mapDeps([13,1])),meta:{a:{name:"HalfSweet",link:"https://github.com/HalfSweet"},d:1710914609e3,c:["posts"],g:["碎碎念","郊狼"],e:`

在上文 为什么我对第三代郊狼失望 一文中,我对于第三代郊狼的硬件部分进行了一些初步分析,因为没有详细的一些资料,因此在一些地方可能存在一些错误。在昨晚(2024-03-19)郊狼作者找到我,与我群群友进行了一番友好的长时间地交流,也解答了我对设计上的一些疑问。在本文中我们会逐步分析前文中提到的问题。

+`,r:{minutes:4.96,words:1487},y:"a",t:"对《为什么我对第三代郊狼失望》一文的澄清说明"}}],["/posts/Empedded-CI-CD/",{loader:()=>V(()=>import("./index.html-BpbuqIOL.js"),__vite__mapDeps([14,1])),meta:{a:{name:"HalfSweet",link:"https://github.com/HalfSweet"},d:17046306e5,l:"2024年1月7日",c:["单片机"],g:["Air001","合宙","CI/CD"],e:`

对于传统的嵌入式开发来说,我们一般常用的IDE都是诸如Keil、IAR等。这些IDE在方便了我们的开发的同时,也存在很多问题,例如在之前Keil-MDK5是不能跨平台的,仅限在Windows平台运行,并且它的授权也是一个老大难的问题。这样我们在团队协作的时候往往就会遇到很多问题,无法像是互联网的开发那样有一套完整的CI/CD流程。但是MDK6的更新解决了这个问题,第一它是跨平台的,这样在Windows、Linux以及MacOS上都能运行;并且也支持了很多命令行的操作,避免了繁琐的GUI操作,这样也更有利于自动化脚本的编写。

+`,r:{minutes:5.17,words:1550},y:"a",t:"嵌入式中的 CI/CD"}}],["/posts/MDK6-Dev/",{loader:()=>V(()=>import("./index.html-BUExg3S4.js"),__vite__mapDeps([15,1])),meta:{a:{name:"HalfSweet",link:"https://github.com/HalfSweet"},d:16924464e5,l:"2023年8月19日",c:["单片机"],g:["Air001","Air32","合宙"],e:`

今日,在千呼万唤中,Arm 的 MDK6 桌面端终于出来了,本想作为第一批吃螃蟹的开发者,但是当时 Air32 和 Air001 的烧录均有问题,最后在 Arm 官方的支持下,终于可以正常使用了,那么现在我们就来尝试一下。

+`,r:{minutes:2.42,words:726},y:"a",t:"更现代的开发方式?使用 MDK6 进行开发"}}],["/posts/SEGGER-RTT/",{loader:()=>V(()=>import("./index.html-CjsJWDkx.js"),__vite__mapDeps([16,1])),meta:{a:{name:"HalfSweet",link:"https://github.com/HalfSweet"},d:1683384485e3,l:"2023年5月6日",c:["单片机"],g:["Air001","合宙","日志"],e:`

在日常的开发中,我们免不了使用各种各样的日志打印方式,使用调试器固然好用,但是无法直接打印局部变量以及会打断整个运行状态。并且对于众多Arduino的用户来说,直接打印日志显然是更直观的做法。但是直接使用串口打印的话需要一定的资源,并且速度会稍慢,并且可能会占用一个串口,对于资源就不多的MCU,我们有没有更方便的方法呢?

+`,r:{minutes:3.44,words:1033},y:"a",t:"更高效的日志查看方式——使用SEGGER-RTT"}}],["/kfGjHcdk36vg74_H/FAE/",{loader:()=>V(()=>import("./index.html-CeXufHKt.js"),__vite__mapDeps([17,1])),meta:{y:"p",t:"FAE 招聘广告!"}}],["/404.html",{loader:()=>V(()=>import("./404.html-DUtivPUn.js"),__vite__mapDeps([18,1])),meta:{y:"p",t:""}}],["/posts/",{loader:()=>V(()=>import("./index.html-BHkIckQz.js"),__vite__mapDeps([19,1])),meta:{y:"p",t:"Posts"}}],["/kfGjHcdk36vg74_H/",{loader:()=>V(()=>import("./index.html-CyeC7jFU.js"),__vite__mapDeps([20,1])),meta:{y:"p",t:"Kf Gj Hcdk36vg74 H"}}],["/category/",{loader:()=>V(()=>import("./index.html-CmAQ5YDA.js"),__vite__mapDeps([21,1])),meta:{y:"p",t:"分类",I:!1}}],["/category/%E5%8D%95%E7%89%87%E6%9C%BA/",{loader:()=>V(()=>import("./index.html-CwRQXK6M.js"),__vite__mapDeps([22,1])),meta:{y:"p",t:"单片机 分类",I:!1}}],["/category/%E7%BD%91%E7%AB%99/",{loader:()=>V(()=>import("./index.html-eNl3F0_i.js"),__vite__mapDeps([23,1])),meta:{y:"p",t:"网站 分类",I:!1}}],["/category/posts/",{loader:()=>V(()=>import("./index.html-D6b4yBnc.js"),__vite__mapDeps([24,1])),meta:{y:"p",t:"posts 分类",I:!1}}],["/category/ai/",{loader:()=>V(()=>import("./index.html-ujRWT25Q.js"),__vite__mapDeps([25,1])),meta:{y:"p",t:"AI 分类",I:!1}}],["/category/%E5%A2%A8%E6%B0%B4%E5%B1%8F/",{loader:()=>V(()=>import("./index.html-CC5A_Bsy.js"),__vite__mapDeps([26,1])),meta:{y:"p",t:"墨水屏 分类",I:!1}}],["/tag/",{loader:()=>V(()=>import("./index.html-Cmx6vSzQ.js"),__vite__mapDeps([27,1])),meta:{y:"p",t:"标签",I:!1}}],["/tag/air32/",{loader:()=>V(()=>import("./index.html-WhwNyEeB.js"),__vite__mapDeps([28,1])),meta:{y:"p",t:"标签: Air32",I:!1}}],["/tag/%E5%90%88%E5%AE%99/",{loader:()=>V(()=>import("./index.html-D1dk3vFS.js"),__vite__mapDeps([29,1])),meta:{y:"p",t:"标签: 合宙",I:!1}}],["/tag/mco/",{loader:()=>V(()=>import("./index.html-BL1UIGC1.js"),__vite__mapDeps([30,1])),meta:{y:"p",t:"标签: MCO",I:!1}}],["/tag/helloworld/",{loader:()=>V(()=>import("./index.html-BaWo4EHb.js"),__vite__mapDeps([31,1])),meta:{y:"p",t:"标签: HelloWorld",I:!1}}],["/tag/stc32/",{loader:()=>V(()=>import("./index.html-yDrPHhjw.js"),__vite__mapDeps([32,1])),meta:{y:"p",t:"标签: STC32",I:!1}}],["/tag/stc8/",{loader:()=>V(()=>import("./index.html-1CYlyUUM.js"),__vite__mapDeps([33,1])),meta:{y:"p",t:"标签: STC8",I:!1}}],["/tag/%E5%B5%8C%E5%85%A5%E5%BC%8F/",{loader:()=>V(()=>import("./index.html-L88jnadg.js"),__vite__mapDeps([34,1])),meta:{y:"p",t:"标签: 嵌入式",I:!1}}],["/tag/coremark/",{loader:()=>V(()=>import("./index.html-DjwQLx4T.js"),__vite__mapDeps([35,1])),meta:{y:"p",t:"标签: CoreMark",I:!1}}],["/tag/%E7%A2%8E%E7%A2%8E%E5%BF%B5/",{loader:()=>V(()=>import("./index.html-D8YyVXhU.js"),__vite__mapDeps([36,1])),meta:{y:"p",t:"标签: 碎碎念",I:!1}}],["/tag/%E9%83%8A%E7%8B%BC/",{loader:()=>V(()=>import("./index.html-DEY01Gtq.js"),__vite__mapDeps([37,1])),meta:{y:"p",t:"标签: 郊狼",I:!1}}],["/tag/clion/",{loader:()=>V(()=>import("./index.html-CEFjPZdx.js"),__vite__mapDeps([38,1])),meta:{y:"p",t:"标签: Clion",I:!1}}],["/tag/%E8%B6%85%E9%A2%91/",{loader:()=>V(()=>import("./index.html-BUt-Ypg5.js"),__vite__mapDeps([39,1])),meta:{y:"p",t:"标签: 超频",I:!1}}],["/tag/fmtlib/",{loader:()=>V(()=>import("./index.html-r-L49OAU.js"),__vite__mapDeps([40,1])),meta:{y:"p",t:"标签: fmtlib",I:!1}}],["/tag/esp8266/",{loader:()=>V(()=>import("./index.html-DOHym-Nn.js"),__vite__mapDeps([41,1])),meta:{y:"p",t:"标签: ESP8266",I:!1}}],["/tag/esp32/",{loader:()=>V(()=>import("./index.html-Cx3snu14.js"),__vite__mapDeps([42,1])),meta:{y:"p",t:"标签: ESP32",I:!1}}],["/tag/arduino/",{loader:()=>V(()=>import("./index.html-ApkFug1C.js"),__vite__mapDeps([43,1])),meta:{y:"p",t:"标签: Arduino",I:!1}}],["/tag/platformio/",{loader:()=>V(()=>import("./index.html-D069BcOf.js"),__vite__mapDeps([44,1])),meta:{y:"p",t:"标签: PlatformIO",I:!1}}],["/tag/esp-idf/",{loader:()=>V(()=>import("./index.html-DkBSQoRt.js"),__vite__mapDeps([45,1])),meta:{y:"p",t:"标签: ESP-IDF",I:!1}}],["/tag/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/",{loader:()=>V(()=>import("./index.html-ExrB7i9r.js"),__vite__mapDeps([46,1])),meta:{y:"p",t:"标签: 人工智能",I:!1}}],["/tag/novelai/",{loader:()=>V(()=>import("./index.html-DLbQjPwd.js"),__vite__mapDeps([47,1])),meta:{y:"p",t:"标签: novelAI",I:!1}}],["/tag/conda/",{loader:()=>V(()=>import("./index.html-BPUnAVOr.js"),__vite__mapDeps([48,1])),meta:{y:"p",t:"标签: conda",I:!1}}],["/tag/%E5%A2%A8%E6%B0%B4%E5%B1%8F/",{loader:()=>V(()=>import("./index.html-D0vfk5YQ.js"),__vite__mapDeps([49,1])),meta:{y:"p",t:"标签: 墨水屏",I:!1}}],["/tag/uc8179/",{loader:()=>V(()=>import("./index.html-B93F0Yt1.js"),__vite__mapDeps([50,1])),meta:{y:"p",t:"标签: UC8179",I:!1}}],["/tag/depg0750rwu790f30/",{loader:()=>V(()=>import("./index.html-Dov7UYvO.js"),__vite__mapDeps([51,1])),meta:{y:"p",t:"标签: DEPG0750RWU790F30",I:!1}}],["/tag/%E9%81%87%E5%88%B0%E7%9A%84%E5%9D%91/",{loader:()=>V(()=>import("./index.html-DbovN7oN.js"),__vite__mapDeps([52,1])),meta:{y:"p",t:"标签: 遇到的坑",I:!1}}],["/tag/air001/",{loader:()=>V(()=>import("./index.html-BNEhJvvt.js"),__vite__mapDeps([53,1])),meta:{y:"p",t:"标签: Air001",I:!1}}],["/tag/cicd/",{loader:()=>V(()=>import("./index.html-DvjdSKrX.js"),__vite__mapDeps([54,1])),meta:{y:"p",t:"标签: CI/CD",I:!1}}],["/tag/%E6%97%A5%E5%BF%97/",{loader:()=>V(()=>import("./index.html-DQhK9vZi.js"),__vite__mapDeps([55,1])),meta:{y:"p",t:"标签: 日志",I:!1}}],["/article/",{loader:()=>V(()=>import("./index.html-DcciNTNK.js"),__vite__mapDeps([56,1])),meta:{y:"p",t:"文章",I:!1}}],["/star/",{loader:()=>V(()=>import("./index.html-DnAcCEnZ.js"),__vite__mapDeps([57,1])),meta:{y:"p",t:"星标",I:!1}}],["/timeline/",{loader:()=>V(()=>import("./index.html-CW73p-23.js"),__vite__mapDeps([58,1])),meta:{y:"p",t:"时间轴",I:!1}}]]);/*! * vue-router v4.3.0 * (c) 2024 Eduardo San Martin Morote * @license MIT @@ -60,7 +60,7 @@ ${e} __echarts_config__={width,height,option}; } return __echarts_config__; -`)(n):Promise.resolve({option:JSON.parse(e)});var l3=O({name:"ECharts",props:{config:{type:String,required:!0},id:{type:String,required:!0},title:{type:String,default:""},type:{type:String,default:"json"}},setup(e){const t=e3(),n=Y(!0),r=pe();let l;return ke("resize",us(()=>l==null?void 0:l.resize(),100)),he(()=>{Promise.all([V(()=>import("./index-uOBkQLRT.js"),__vite__mapDeps([])),new Promise(o=>setTimeout(o,800))]).then(async([o])=>{var c;await((c=t.setup)==null?void 0:c.call(t)),l=o.init(r.value);const{option:s,...i}=await r3(Qt(e.config),e.type,l);l.resize(i),l.setOption({...t.option,...s}),n.value=!1})}),_n(()=>{l==null||l.dispose()}),()=>[e.title?a("div",{class:"echarts-title"},decodeURIComponent(e.title)):null,a("div",{class:"echarts-wrapper"},[a("div",{ref:r,class:"echarts-container",id:e.id}),n.value?a(nn,{class:"echarts-loading",height:360}):null])]}}),ms={x:0,y:0,"line-width":2,"line-length":40,"text-margin":8,"font-size":14,"font-color":"#8DA1AC","line-color":"#8DA1AC","element-color":"black",fill:"white","yes-text":"Yes","no-text":"No","arrow-end":"block",scale:1},o3={...ms,symbols:{start:{class:"start-element","font-color":"#fff",fill:"#595959","line-width":"0px"},end:{class:"end-element","font-color":"#fff",fill:"#595959","line-width":"0px"},operation:{class:"operation-element","font-color":"#fff",fill:"#1890ff","line-width":"0px"},inputoutput:{class:"inputoutput-element","font-color":"#fff",fill:"#1890ff","line-width":"0px"},subroutine:{class:"subroutine-element","font-color":"#fff",fill:"#FF485E","element-color":"#fff","line-color":"red"},condition:{class:"condition-element","font-color":"#fff",fill:"#FF485E","line-width":"0px"},parallel:{class:"parallel-element","font-color":"#fff",fill:"#1890ff","line-width":"0px"}}},s3={...ms,"line-width":1,symbols:{start:{class:"start-element",fill:"#ccc","line-color":"#5c6ac4","font-color":"#000"},end:{class:"end-element",fill:"#ccc","line-color":"#5c6ac4","font-color":"#000"},operation:{class:"operation-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"},inputoutput:{class:"inputoutput-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"},subroutine:{class:"subroutine-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"},condition:{class:"condition-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"},parallel:{class:"parallel-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"}}},a3={...ms,symbols:{start:{class:"start-element","font-color":"#fff",fill:"#2F495F","line-width":"0px"},end:{class:"end-element","font-color":"#fff",fill:"#2F495F","line-width":"0px"},operation:{class:"operation-element","font-color":"#fff",fill:"#00BC7D","line-width":"0px"},inputoutput:{class:"inputoutput-element","font-color":"#fff",fill:"#EB4D5D","line-width":"0px"},subroutine:{class:"subroutine-element","font-color":"#fff",fill:"#937AC4","element-color":"#fff","line-color":"red"},condition:{class:"condition-element","font-color":"#fff",fill:"#FFB500","line-width":"0px"},parallel:{class:"parallel-element","font-color":"#fff",fill:"#2F495F","line-width":"0px"}}};const Ya={ant:o3,vue:a3,pie:s3};let i3={};const bu=Symbol(""),c3=()=>me(bu),u3=e=>{e.provide(bu,i3)};let f3={};const _u=Symbol(""),d3=()=>me(_u),p3=e=>{e.provide(_u,f3)},h3={autoResize:!0,showCompileOutput:!1,clearConsole:!1,layout:"horizontal",ssr:!1};let v3=h3;const wu=Symbol(""),m3=()=>me(wu),g3=e=>{e.provide(wu,v3)};var y3=O({name:"FlowChart",props:{code:{type:String,required:!0},id:{type:String,required:!0},preset:{type:String,default:"vue"}},setup(e){let t=null;const n=pe(),r=Y(!0),l=Y(1),o=w(()=>Ya[e.preset]||(console.warn(`[md-enhance:flowchart] Unknown preset: ${e.preset}`),Ya.vue)),s=i=>i<419?.8:i>1280?1:.9;return he(()=>{Promise.all([V(()=>import("./flowchart-966sEcGG.js"),__vite__mapDeps([])),new Promise(i=>setTimeout(i,800))]).then(([{parse:i}])=>{t=i(Qt(e.code)),l.value=s(window.innerWidth),r.value=!1,t.draw(e.id,{...o.value,scale:l.value})}),ke("resize",us(()=>{if(t){const i=s(window.innerWidth);l.value!==i&&(l.value=i,t.draw(e.id,{...o.value,scale:i}))}},100))}),()=>[r.value?a(nn,{class:"flowchart-loading",height:192}):null,a("div",{ref:n,class:["flowchart-wrapper",e.preset],id:e.id,style:{display:r.value?"none":"block"}})]}});const b3=()=>{ke("beforeprint",()=>{document.querySelectorAll("details").forEach(e=>{e.open=!0})})},Sn={useMaxWidth:!1},_3=e=>({dark:e,background:e?"#1e1e1e":"#fff",primaryColor:e?"#389d70":"#4abf8a",primaryBorderColor:e?"#389d70":"#4abf8a",primaryTextColor:e?"#fff":"#000",secondaryColor:"#ffb500",secondaryBorderColor:e?"#fff":"#000",secondaryTextColor:e?"#ddd":"#333",tertiaryColor:e?"#282828":"#efeef4",tertiaryBorderColor:e?"#bbb":"#242424",tertiaryTextColor:e?"#ddd":"#333",noteBkgColor:e?"#f6d365":"#fff5ad",noteTextColor:"#242424",noteBorderColor:e?"#f6d365":"#333",lineColor:e?"#d3d3d3":"#333",textColor:e?"#fff":"#242424",mainBkg:e?"#389d70":"#4abf8a",errorBkgColor:"#eb4d5d",errorTextColor:"#fff",nodeBorder:e?"#389d70":"#4abf8a",nodeTextColor:e?"#fff":"#242424",signalTextColor:e?"#9e9e9e":"#242424",classText:"#fff",labelColor:"#fff",attributeBackgroundColorEven:e?"#0d1117":"#fff",attributeBackgroundColorOdd:e?"#161b22":"#f8f8f8",fillType0:e?"#cf1322":"#f1636e",fillType1:"#f39c12",fillType2:"#2ecc71",fillType3:"#fa541c",fillType4:"#25a55b",fillType5:"#13c2c2",fillType6:"#096dd9",fillType7:"#aa6fe9"});var w3=O({name:"Mermaid",props:{id:{type:String,required:!0},code:{type:String,required:!0},title:{type:String,default:""}},setup(e){const{themeVariables:t,...n}=c3(),r=pe(),l=w(()=>Qt(e.code)),o=Y(""),s=Y(!1);let i=!1;const c=async()=>{const[{default:d}]=await Promise.all([V(()=>import("./mermaid.core-Kz6OjGMc.js").then(p=>p.b9),__vite__mapDeps([])),i?Promise.resolve():(i=!0,new Promise(p=>setTimeout(p,800)))]);d.initialize({theme:"base",themeVariables:{..._3(s.value),...m1(t)?t(s.value):t},flowchart:Sn,sequence:Sn,journey:Sn,gantt:Sn,er:Sn,pie:Sn,...n,startOnLoad:!1}),o.value=(await d.render(e.id,l.value)).svg},u=()=>{const{body:d}=document,p=document.createElement("div");p.classList.add("mermaid-preview"),p.innerHTML=o.value,d.appendChild(p),p.addEventListener("click",()=>{d.removeChild(p)})},f=()=>{const d=`data:image/svg+xml;charset=utf8,${o.value.replace(/
/g,"
").replace(/%/g,"%25").replace(/"/g,"%22").replace(/'/g,"%27").replace(/&/g,"%26").replace(/#/g,"%23").replace(/{/g,"%7B").replace(/}/g,"%7D").replace(//g,"%3E")}`,p=document.createElement("a");p.setAttribute("href",d),p.setAttribute("download",`${e.title?Qt(e.title):e.id}.svg`),p.click()};return he(()=>{s.value=yl(),c(),jc(document.documentElement,()=>{s.value=yl()},{attributeFilter:["class","data-theme"],attributes:!0}),oe(s,()=>c())}),()=>[a("div",{class:"mermaid-actions"},[a("button",{class:"preview-button",onClick:()=>u(),title:"preview",innerHTML:''}),a("button",{class:"download-button",onClick:()=>f(),title:"download",innerHTML:''})]),a("div",{ref:r,class:"mermaid-wrapper"},o.value?a("div",{class:"mermaid-content",innerHTML:o.value}):a(nn,{class:"mermaid-loading",height:96}))]}});const Eu=({title:e="",link:t})=>a("div",{class:"vp-playground"},[a("div",{class:"vp-playground-header"},[e?a("div",{class:"vp-playground-title"},decodeURIComponent(e)):null,a("div",{class:"vp-playground-actions"},[a("a",{class:"vp-playground-action",href:decodeURIComponent(t),target:"_blank",innerHTML:Oh})])]),a("div",{class:"vp-playground-container"},a("iframe",{src:decodeURIComponent(t)}))]);Eu.displayName="Playground";const E3=()=>[V(()=>import("./reveal.esm-ssIfNQ0c.js"),__vite__mapDeps([])),V(()=>import("./markdown.esm-BG2Xu2Hd.js"),__vite__mapDeps([]))];var C3=O({name:"RevealJs",props:{id:{type:String,required:!0},code:{type:String,required:!0},theme:{type:String,default:"auto"}},setup(e){const t=d3(),n=ye(),r=Y(""),l=Y(!0),o=pe();let s=null;const i=async c=>{const u=[new Promise(h=>setTimeout(h,800)),...E3()],[,f,...d]=await Promise.all(u),p=new f.default(c,{backgroundTransition:"slide",hash:n.value.layout==="Slide",mouseWheel:n.value.layout==="Slide",transition:"slide",slideNumber:!0,...t,...n.value.revealJs||{},embedded:n.value.layout!=="Slide",markdown:{separator:`^\r?\\n---\r? +`)(n):Promise.resolve({option:JSON.parse(e)});var l3=O({name:"ECharts",props:{config:{type:String,required:!0},id:{type:String,required:!0},title:{type:String,default:""},type:{type:String,default:"json"}},setup(e){const t=e3(),n=Y(!0),r=pe();let l;return ke("resize",us(()=>l==null?void 0:l.resize(),100)),he(()=>{Promise.all([V(()=>import("./index-uOBkQLRT.js"),__vite__mapDeps([])),new Promise(o=>setTimeout(o,800))]).then(async([o])=>{var c;await((c=t.setup)==null?void 0:c.call(t)),l=o.init(r.value);const{option:s,...i}=await r3(Qt(e.config),e.type,l);l.resize(i),l.setOption({...t.option,...s}),n.value=!1})}),_n(()=>{l==null||l.dispose()}),()=>[e.title?a("div",{class:"echarts-title"},decodeURIComponent(e.title)):null,a("div",{class:"echarts-wrapper"},[a("div",{ref:r,class:"echarts-container",id:e.id}),n.value?a(nn,{class:"echarts-loading",height:360}):null])]}}),ms={x:0,y:0,"line-width":2,"line-length":40,"text-margin":8,"font-size":14,"font-color":"#8DA1AC","line-color":"#8DA1AC","element-color":"black",fill:"white","yes-text":"Yes","no-text":"No","arrow-end":"block",scale:1},o3={...ms,symbols:{start:{class:"start-element","font-color":"#fff",fill:"#595959","line-width":"0px"},end:{class:"end-element","font-color":"#fff",fill:"#595959","line-width":"0px"},operation:{class:"operation-element","font-color":"#fff",fill:"#1890ff","line-width":"0px"},inputoutput:{class:"inputoutput-element","font-color":"#fff",fill:"#1890ff","line-width":"0px"},subroutine:{class:"subroutine-element","font-color":"#fff",fill:"#FF485E","element-color":"#fff","line-color":"red"},condition:{class:"condition-element","font-color":"#fff",fill:"#FF485E","line-width":"0px"},parallel:{class:"parallel-element","font-color":"#fff",fill:"#1890ff","line-width":"0px"}}},s3={...ms,"line-width":1,symbols:{start:{class:"start-element",fill:"#ccc","line-color":"#5c6ac4","font-color":"#000"},end:{class:"end-element",fill:"#ccc","line-color":"#5c6ac4","font-color":"#000"},operation:{class:"operation-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"},inputoutput:{class:"inputoutput-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"},subroutine:{class:"subroutine-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"},condition:{class:"condition-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"},parallel:{class:"parallel-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"}}},a3={...ms,symbols:{start:{class:"start-element","font-color":"#fff",fill:"#2F495F","line-width":"0px"},end:{class:"end-element","font-color":"#fff",fill:"#2F495F","line-width":"0px"},operation:{class:"operation-element","font-color":"#fff",fill:"#00BC7D","line-width":"0px"},inputoutput:{class:"inputoutput-element","font-color":"#fff",fill:"#EB4D5D","line-width":"0px"},subroutine:{class:"subroutine-element","font-color":"#fff",fill:"#937AC4","element-color":"#fff","line-color":"red"},condition:{class:"condition-element","font-color":"#fff",fill:"#FFB500","line-width":"0px"},parallel:{class:"parallel-element","font-color":"#fff",fill:"#2F495F","line-width":"0px"}}};const Ya={ant:o3,vue:a3,pie:s3};let i3={};const bu=Symbol(""),c3=()=>me(bu),u3=e=>{e.provide(bu,i3)};let f3={};const _u=Symbol(""),d3=()=>me(_u),p3=e=>{e.provide(_u,f3)},h3={autoResize:!0,showCompileOutput:!1,clearConsole:!1,layout:"horizontal",ssr:!1};let v3=h3;const wu=Symbol(""),m3=()=>me(wu),g3=e=>{e.provide(wu,v3)};var y3=O({name:"FlowChart",props:{code:{type:String,required:!0},id:{type:String,required:!0},preset:{type:String,default:"vue"}},setup(e){let t=null;const n=pe(),r=Y(!0),l=Y(1),o=w(()=>Ya[e.preset]||(console.warn(`[md-enhance:flowchart] Unknown preset: ${e.preset}`),Ya.vue)),s=i=>i<419?.8:i>1280?1:.9;return he(()=>{Promise.all([V(()=>import("./flowchart-966sEcGG.js"),__vite__mapDeps([])),new Promise(i=>setTimeout(i,800))]).then(([{parse:i}])=>{t=i(Qt(e.code)),l.value=s(window.innerWidth),r.value=!1,t.draw(e.id,{...o.value,scale:l.value})}),ke("resize",us(()=>{if(t){const i=s(window.innerWidth);l.value!==i&&(l.value=i,t.draw(e.id,{...o.value,scale:i}))}},100))}),()=>[r.value?a(nn,{class:"flowchart-loading",height:192}):null,a("div",{ref:n,class:["flowchart-wrapper",e.preset],id:e.id,style:{display:r.value?"none":"block"}})]}});const b3=()=>{ke("beforeprint",()=>{document.querySelectorAll("details").forEach(e=>{e.open=!0})})},Sn={useMaxWidth:!1},_3=e=>({dark:e,background:e?"#1e1e1e":"#fff",primaryColor:e?"#389d70":"#4abf8a",primaryBorderColor:e?"#389d70":"#4abf8a",primaryTextColor:e?"#fff":"#000",secondaryColor:"#ffb500",secondaryBorderColor:e?"#fff":"#000",secondaryTextColor:e?"#ddd":"#333",tertiaryColor:e?"#282828":"#efeef4",tertiaryBorderColor:e?"#bbb":"#242424",tertiaryTextColor:e?"#ddd":"#333",noteBkgColor:e?"#f6d365":"#fff5ad",noteTextColor:"#242424",noteBorderColor:e?"#f6d365":"#333",lineColor:e?"#d3d3d3":"#333",textColor:e?"#fff":"#242424",mainBkg:e?"#389d70":"#4abf8a",errorBkgColor:"#eb4d5d",errorTextColor:"#fff",nodeBorder:e?"#389d70":"#4abf8a",nodeTextColor:e?"#fff":"#242424",signalTextColor:e?"#9e9e9e":"#242424",classText:"#fff",labelColor:"#fff",attributeBackgroundColorEven:e?"#0d1117":"#fff",attributeBackgroundColorOdd:e?"#161b22":"#f8f8f8",fillType0:e?"#cf1322":"#f1636e",fillType1:"#f39c12",fillType2:"#2ecc71",fillType3:"#fa541c",fillType4:"#25a55b",fillType5:"#13c2c2",fillType6:"#096dd9",fillType7:"#aa6fe9"});var w3=O({name:"Mermaid",props:{id:{type:String,required:!0},code:{type:String,required:!0},title:{type:String,default:""}},setup(e){const{themeVariables:t,...n}=c3(),r=pe(),l=w(()=>Qt(e.code)),o=Y(""),s=Y(!1);let i=!1;const c=async()=>{const[{default:d}]=await Promise.all([V(()=>import("./mermaid.core-B3CaSkdI.js").then(p=>p.b9),__vite__mapDeps([])),i?Promise.resolve():(i=!0,new Promise(p=>setTimeout(p,800)))]);d.initialize({theme:"base",themeVariables:{..._3(s.value),...m1(t)?t(s.value):t},flowchart:Sn,sequence:Sn,journey:Sn,gantt:Sn,er:Sn,pie:Sn,...n,startOnLoad:!1}),o.value=(await d.render(e.id,l.value)).svg},u=()=>{const{body:d}=document,p=document.createElement("div");p.classList.add("mermaid-preview"),p.innerHTML=o.value,d.appendChild(p),p.addEventListener("click",()=>{d.removeChild(p)})},f=()=>{const d=`data:image/svg+xml;charset=utf8,${o.value.replace(/
/g,"
").replace(/%/g,"%25").replace(/"/g,"%22").replace(/'/g,"%27").replace(/&/g,"%26").replace(/#/g,"%23").replace(/{/g,"%7B").replace(/}/g,"%7D").replace(//g,"%3E")}`,p=document.createElement("a");p.setAttribute("href",d),p.setAttribute("download",`${e.title?Qt(e.title):e.id}.svg`),p.click()};return he(()=>{s.value=yl(),c(),jc(document.documentElement,()=>{s.value=yl()},{attributeFilter:["class","data-theme"],attributes:!0}),oe(s,()=>c())}),()=>[a("div",{class:"mermaid-actions"},[a("button",{class:"preview-button",onClick:()=>u(),title:"preview",innerHTML:''}),a("button",{class:"download-button",onClick:()=>f(),title:"download",innerHTML:''})]),a("div",{ref:r,class:"mermaid-wrapper"},o.value?a("div",{class:"mermaid-content",innerHTML:o.value}):a(nn,{class:"mermaid-loading",height:96}))]}});const Eu=({title:e="",link:t})=>a("div",{class:"vp-playground"},[a("div",{class:"vp-playground-header"},[e?a("div",{class:"vp-playground-title"},decodeURIComponent(e)):null,a("div",{class:"vp-playground-actions"},[a("a",{class:"vp-playground-action",href:decodeURIComponent(t),target:"_blank",innerHTML:Oh})])]),a("div",{class:"vp-playground-container"},a("iframe",{src:decodeURIComponent(t)}))]);Eu.displayName="Playground";const E3=()=>[V(()=>import("./reveal.esm-ssIfNQ0c.js"),__vite__mapDeps([])),V(()=>import("./markdown.esm-BG2Xu2Hd.js"),__vite__mapDeps([]))];var C3=O({name:"RevealJs",props:{id:{type:String,required:!0},code:{type:String,required:!0},theme:{type:String,default:"auto"}},setup(e){const t=d3(),n=ye(),r=Y(""),l=Y(!0),o=pe();let s=null;const i=async c=>{const u=[new Promise(h=>setTimeout(h,800)),...E3()],[,f,...d]=await Promise.all(u),p=new f.default(c,{backgroundTransition:"slide",hash:n.value.layout==="Slide",mouseWheel:n.value.layout==="Slide",transition:"slide",slideNumber:!0,...t,...n.value.revealJs||{},embedded:n.value.layout!=="Slide",markdown:{separator:`^\r?\\n---\r? $`,verticalSeparator:`^\r? --\r? -$`},plugins:[...d.map(({default:h})=>h),...t.plugins??[]]});return await p.initialize(),p};return he(async()=>{const c=o.value;c&&(r.value=Qt(e.code),c.setAttribute("id",e.id),c.setAttribute("data-theme",e.theme),s=await i(c),l.value=!1)}),_n(()=>{s==null||s.destroy()}),()=>a("div",{class:"vp-reveal"},[a("div",{ref:o,class:["reveal","reveal-viewport"]},a("div",{class:"slides",innerHTML:`
AI 分类 | HalfSweet's Blog - - + + - + diff --git a/category/index.html b/category/index.html index 2897dbf..1f0dc78 100644 --- a/category/index.html +++ b/category/index.html @@ -30,11 +30,11 @@ 分类 | HalfSweet's Blog - - + + - + diff --git a/category/posts/index.html b/category/posts/index.html index 7d6647a..d0d371f 100644 --- a/category/posts/index.html +++ b/category/posts/index.html @@ -30,14 +30,14 @@ posts 分类 | HalfSweet's Blog - - + +
跳至主要內容
对《为什么我对第三代郊狼失望》一文的澄清说明

在上文 为什么我对第三代郊狼失望 一文中,我对于第三代郊狼的硬件部分进行了一些初步分析,因为没有详细的一些资料,因此在一些地方可能存在一些错误。在昨晚(2024-03-19)郊狼作者找到我,与我群群友进行了一番友好的长时间地交流,也解答了我对设计上的一些疑问。在本文中我们会逐步分析前文中提到的问题。


HalfSweet大约 5 分钟posts碎碎念郊狼
为什么我对第三代郊狼失望

最近第三代郊狼开始内测了,作为一名电子爱好者,自然不能错过这个机会。于是我以原价 368 元的主机,以及 128 元两个智能按钮的价格,购买了一套第三代郊狼。


HalfSweet大约 8 分钟posts碎碎念郊狼
在嵌入式设备上使用fmtlib

众所周知,在c++20以上的标准已经支持了std::format进行格式化输出,不过显而易见,嵌入式领域想要得到支持显然遥遥无期。但是我们已经厌倦了使用sprintf等方式来格式化字符串,c++的流特性又显得不够优雅,怎么才能用上类似于Python中format这样的方式来格式化并输出想要的字符串呢。


HalfSweet大约 5 分钟postsfmtlib嵌入式ESP8266ESP32ArduinoPlatformIOESP-IDF
- + diff --git "a/category/\345\215\225\347\211\207\346\234\272/index.html" "b/category/\345\215\225\347\211\207\346\234\272/index.html" index 2ce49c6..f6260fb 100644 --- "a/category/\345\215\225\347\211\207\346\234\272/index.html" +++ "b/category/\345\215\225\347\211\207\346\234\272/index.html" @@ -30,8 +30,8 @@ 单片机 分类 | HalfSweet's Blog - - + +
跳至主要內容
嵌入式中的 CI/CD

对于传统的嵌入式开发来说,我们一般常用的IDE都是诸如Keil、IAR等。这些IDE在方便了我们的开发的同时,也存在很多问题,例如在之前Keil-MDK5是不能跨平台的,仅限在Windows平台运行,并且它的授权也是一个老大难的问题。这样我们在团队协作的时候往往就会遇到很多问题,无法像是互联网的开发那样有一套完整的CI/CD流程。但是MDK6的更新解决了这个问题,第一它是跨平台的,这样在Windows、Linux以及MacOS上都能运行;并且也支持了很多命令行的操作,避免了繁琐的GUI操作,这样也更有利于自动化脚本的编写。

@@ -43,6 +43,6 @@

HalfSweet大约 3 分钟单片机Air001合宙日志
不服来跑个分?将 CoreMark 移植到 STC 上试试

最近维护的 Air001 准备上线了,为了衬托出其强大的性价比,因此我想来做点缺德的事,让我们来和同样以高打性价比的 STC 系列单片机来对比下 CoreMark 的跑分吧,本文将会详细介绍移植过程以及跑分结果。测试的 MCU 为降龙棍 STC32G12K128打狗棒 STC8H8K64U

通用,本文同样适用于 Arm-Cortex M 架构的 MCU。


HalfSweet大约 5 分钟单片机STC32STC8嵌入式CoreMark
- + diff --git "a/category/\345\242\250\346\260\264\345\261\217/index.html" "b/category/\345\242\250\346\260\264\345\261\217/index.html" index 1995eab..f36a064 100644 --- "a/category/\345\242\250\346\260\264\345\261\217/index.html" +++ "b/category/\345\242\250\346\260\264\345\261\217/index.html" @@ -30,8 +30,8 @@ 墨水屏 分类 | HalfSweet's Blog - - + +
跳至主要內容
墨水屏的坑——7.5寸墨水屏刷新为何出现条纹

前言

@@ -39,6 +39,6 @@

其中上面一张图为我自己做的波形,第二张为使用的OTP波形,但是无一例外,都出现了刷新的问题。抱着也许是驱动板出问题了的想法,我重新lay了一次板子,焊接好之后发现问题确实有所改善,但是并不佳。后续在更换过程中发现采用cd32封装的68uH的电感刷新效果会更好一些,但是依旧存在刷新问题,特别是在UI中有竖着的线条的时候,特别影响观感。


HalfSweet大约 7 分钟墨水屏墨水屏UC8179DEPG0750RWU790F30遇到的坑
- + diff --git "a/category/\347\275\221\347\253\231/index.html" "b/category/\347\275\221\347\253\231/index.html" index f4eccdf..329b96c 100644 --- "a/category/\347\275\221\347\253\231/index.html" +++ "b/category/\347\275\221\347\253\231/index.html" @@ -30,13 +30,13 @@ 网站 分类 | HalfSweet's Blog - - + + - + diff --git a/friends/index.html b/friends/index.html index 3ff00f4..594c629 100644 --- a/friends/index.html +++ b/friends/index.html @@ -30,8 +30,8 @@ 友情链接 | HalfSweet's Blog - - + +
跳至主要內容

友情链接

大约 1 分钟

友情链接

这是一个友链页面,欢迎大家私聊我或者评论留言添加自己的友链,留言的话需要以下内容:

  • 你的名称
  • 你的博客链接
  • 你的一段简介(可选)
  • 你的头像资源文件或者链接(可选)
title: 晨旭
@@ -85,6 +85,6 @@
 link: https://blog.lss233.com
 color: rgba(253, 230, 138, 0.15)
 
- + diff --git a/index.html b/index.html index 11b72c7..dcfbd94 100644 --- a/index.html +++ b/index.html @@ -30,8 +30,8 @@ HalfSweet's Blog | HalfSweet's Blog - - + +
跳至主要內容
HalfSweet's Blog

HalfSweet's Blog

Try to create some value.

对《为什么我对第三代郊狼失望》一文的澄清说明

在上文 为什么我对第三代郊狼失望 一文中,我对于第三代郊狼的硬件部分进行了一些初步分析,因为没有详细的一些资料,因此在一些地方可能存在一些错误。在昨晚(2024-03-19)郊狼作者找到我,与我群群友进行了一番友好的长时间地交流,也解答了我对设计上的一些疑问。在本文中我们会逐步分析前文中提到的问题。

@@ -46,6 +46,6 @@

通用,本文同样适用于 Arm-Cortex M 架构的 MCU。


HalfSweet大约 5 分钟单片机STC32STC8嵌入式CoreMark
在嵌入式设备上使用fmtlib

众所周知,在c++20以上的标准已经支持了std::format进行格式化输出,不过显而易见,嵌入式领域想要得到支持显然遥遥无期。但是我们已经厌倦了使用sprintf等方式来格式化字符串,c++的流特性又显得不够优雅,怎么才能用上类似于Python中format这样的方式来格式化并输出想要的字符串呢。


HalfSweet大约 5 分钟postsfmtlib嵌入式ESP8266ESP32ArduinoPlatformIOESP-IDF
- + diff --git a/kfGjHcdk36vg74_H/FAE/index.html b/kfGjHcdk36vg74_H/FAE/index.html index 30bf46d..cd35e45 100644 --- a/kfGjHcdk36vg74_H/FAE/index.html +++ b/kfGjHcdk36vg74_H/FAE/index.html @@ -28,13 +28,13 @@ document.documentElement.setAttribute("data-theme", "dark"); } - FAE 招聘广告! | HalfSweet's Blog + FAE 招聘广告! | HalfSweet's Blog - - + + -
跳至主要內容

FAE 招聘广告!

HalfSweet大约 2 分钟

如果你看到这段界面,恭喜你!这是一个彩蛋,目前因为业务的需求,我们急需一名 FAE,如果你对这个职位感兴趣,欢迎联系我们!

目前我们在杭州上海均有岗位需求。

我们公司的简介:

译枢科技于 2017 年成立于上海,是一家专注于国产芯片的半导体元器件分销商。2020 年成立深圳分公司,2022 年成立杭州办,2024 年成立南京办。译枢一直致力于消费电子、可穿戴、安全支付、三表等物联网领域产品解决方案的技术推广和销售,为广大企业用户提供产品和技术支持。随着公司的发展,我们的主营产品持续扩大,目前代理的品牌有:普冉、至晟微、矽典微、泰晶、华谷泽、奉加微、景略,产品涵盖存储、晶振、32 位单片机等。

目前我们急需一名 MCU 行业相关的 FAE,具体要求如下:

岗位职责

  • 快速解决客户技术问题,提供专业支持。
  • 协助销售团队,进行技术评估和选型。
  • 定制化解决方案,维护技术文档和知识分享。

职位要求

  • 本科以上,电子/计算机/自动化专业优先。
  • 良好英文阅读,熟悉模拟/数字电路和电路分析。
  • 精通一种 PCB 设计软件,掌握 C/C++和至少一种脚本语言(Python/Bash/Lua)。
  • 熟练使用 Git,了解 STM32/Cortex-M 系列,Risc-V 经验优先。
  • Linux 操作经验,无刷电机驱动和 FAE 经验优先。

薪资待遇

7-15k,有年终,五险一金,周末双休,弹性工作制不打卡

联系方式

联系方式这点不要着急哟~ 既然你已经打开这个页面了,那么联系方式可能还是需要你去自行查找一下,祝你好运!

YW1saGJtZG9ZVzl5WVc1QWVXbHpkR1ZqYUc1dmJHOW5lUzVqYjIwPQ==

密钥是一种常见的对称加密方式,密文注意一下网页中不同寻常的地方。

非此邮箱投递的简历将不予处理。

希望能够和你一起共事!

- +
跳至主要內容

FAE 招聘广告!

HalfSweet大约 2 分钟

如果你看到这段界面,恭喜你!这是一个彩蛋,目前因为业务的需求,我们急需一名 FAE,如果你对这个职位感兴趣,欢迎联系我们!

目前我们在杭州上海均有岗位需求。

我们公司的简介:

译枢科技于 2017 年成立于上海,是一家专注于国产芯片的半导体元器件分销商。2020 年成立深圳分公司,2022 年成立杭州办,2024 年成立南京办。译枢一直致力于消费电子、可穿戴、安全支付、三表等物联网领域产品解决方案的技术推广和销售,为广大企业用户提供产品和技术支持。随着公司的发展,我们的主营产品持续扩大,目前代理的品牌有:普冉、至晟微、矽典微、泰晶、华谷泽、奉加微、景略,产品涵盖存储、晶振、32 位单片机等。

目前我们急需一名 MCU 行业相关的 FAE,具体要求如下:

岗位职责

  • 快速解决客户技术问题,提供专业支持。
  • 协助销售团队,进行技术评估和选型。
  • 定制化解决方案,维护技术文档和知识分享。

职位要求

  • 本科以上,电子/计算机/自动化等相关专业优先。
  • 有 FAE 经验优先。
  • 有良好的英文阅读能力
  • 熟悉模拟/数字电路和电路分析。
  • 精通一种 PCB 设计软件,如(AD、Cadence、KiCAD等)
  • 掌握 C/C++ 语言。
  • 掌握至少一种脚本语言(Python/Bash/Lua)。
  • 能熟练使用 Git 或者其它版本控制工具。
  • 了解 STM32 或其它 Cortex-M 内核的单片机,有 Risc-V 内核使用经验优先。
  • 有 Linux 使用经验,熟悉Linux相关操作优先。
  • 有无刷电机驱动经验者优先

薪资待遇

7-15k,有年终,五险一金,周末双休,弹性工作制不打卡

联系方式

联系方式这点不要着急哟~ 既然你已经打开这个页面了,那么联系方式可能还是需要你去自行查找一下,祝你好运!

YW1saGJtZG9ZVzl5WVc1QWVXbHpkR1ZqYUc1dmJHOW5lUzVqYjIwPQ==

密钥是一种常见的对称加密方式,密文注意一下网页中不同寻常的地方。

非此邮箱投递的简历将不予处理。

希望能够和你一起共事!

+ diff --git a/kfGjHcdk36vg74_H/index.html b/kfGjHcdk36vg74_H/index.html index 7a24cdd..7175c48 100644 --- a/kfGjHcdk36vg74_H/index.html +++ b/kfGjHcdk36vg74_H/index.html @@ -30,11 +30,11 @@ Kf Gj Hcdk36vg74 H | HalfSweet's Blog - - + + - + diff --git a/posts/Air32-Clion/index.html b/posts/Air32-Clion/index.html index 18c9c48..91d9c2d 100644 --- a/posts/Air32-Clion/index.html +++ b/posts/Air32-Clion/index.html @@ -30,13 +30,13 @@ 使用 Clion 来进行 Air32 的开发 | HalfSweet's Blog - - + +
跳至主要內容

使用 Clion 来进行 Air32 的开发

HalfSweet大约 3 分钟单片机Air32合宙Clion

在上几篇文章中,我们将 HAL 库移植给了 Air32,但是我们的开发环境还是使用的 Keil,这样就会导致一些问题,比如 Keil 的代码提示不够友好,而且 Keil 的代码补全也不够完善,因此我们可以使用一个更好的开发环境,比如 Clion。

本文如没有特殊说明,均以 Clion 的新 UI 为例

前置条件

  1. 需要 Clio 你软件(废话
  2. 需要安装arm-none-eabi-gcc,windows 用户建议通过MSYS2的包管理工具安装,在此不多赘述
  3. 我们推荐使用PyOCD作为调试器
  4. 安装STM32CubeMX生成工程模板,当然这一步不是必须的,你也可以用我们文末提供的模板

提示

MinGW 和 Cmake 工具链目前最新版的 Clion 自带,我们无需在意

新建工程

打开 Clion 软件,点击左上角的☰-文件-新建-项目按钮

选择左边嵌入式列表中的STM32CubeMX,路径自定

选择在 STM32CubeMX 中打开

默认采用了STM32F030F4Px,点击顶上面包屑导航的STM32F030F4P6修改为STM32F103CBTx

点击Start Project,进入配置界面

接下来是常规配置,可以参考 [发挥全部实力!Air32 在 HAL 库环境下运行最高主频](./发挥全部实力!Air32 在 HAL 库环境下运行最高主频。md) 中的配置,这里不再赘述

生成代码

生成代码的时候,在Project Manage中的Toolchain / IDE中选择STM32CubeIDE,注意检查路径是否正确

点击右上角的Generate Code按钮,等待生成完成

生成 Cmake 工程

回到 Clion 中,打开.ioc目录下的工程,会自动生成 Cmake 工程,我们点击一下构建按钮,此时应该可以自动编译完成。

提示

记得安装arm-none-eabi-gcc环境

下载工程

我们使用pyOCD下载,首先我们需要安装pyOCD的环境,这里我们选择安装develop版本,因为目前内置 Air32 的版本还没正式发布。

在我们有 Python 环境的前提下,只需要

pip install --pre -U git+https://github.com/pyocd/pyOCD.git@develop
 

即可安装。

接下来我们需要配置运行参数,我们点击上方的运行/调试配置按钮,然后点击编辑配置

可执行文件中,修改为pyOCD的路径,如果找不到可以用which pyocd命令查看。

命令实参中,加入

flash --erase chip --target air32f103xb $CMakeCurrentBuildDir$/Air32F103_Clion.hex
 

芯片型号和具体的 hex 文件可以根据实际情况进行修改。

此时点击运行按钮,即可下载程序到 Air32 中。

配置调试器

点击运行/调试配置按钮,然后点击编辑配置,点击弹出窗口的左上角的+按钮,选择嵌入式 GDB 调试器

target remote中填入localhost:65533,或者端口自定,不冲突即可。

GDB 服务器中填入 pyOCD 的可执行文件路径

GDB 服务器实参中填入gdbserver -p 65533 -t air32f103xb -f 10M,端口号和芯片型号自定,如果连不上可适当降低频率。

最后点击确认即可

把运行配置切换到刚才设置的调试选项卡中,点击调试按钮即可进行调试

附录

此工程开源在https://github.com/Air-duino/Air32-Clion-Templateopen in new window

- + diff --git a/posts/Air32-HAL-HighFreq/index.html b/posts/Air32-HAL-HighFreq/index.html index 7c0d240..e003b3e 100644 --- a/posts/Air32-HAL-HighFreq/index.html +++ b/posts/Air32-HAL-HighFreq/index.html @@ -30,8 +30,8 @@ 发挥全部实力!Air32 在 HAL 库环境下运行最高主频 | HalfSweet's Blog - - + +
跳至主要內容

发挥全部实力!Air32 在 HAL 库环境下运行最高主频

HalfSweet大约 6 分钟单片机Air32合宙超频

最近打算把 Air32 也吃上 Arduino,发挥全部性能,就不用像是 Air001 那样束手束脚了,但是问题是 Arduino 的库是基于 HAL 的,那要用上 Arduino 就必定得先适配 HAL 库,那我们就来先尝试在 HAL 下让 Air32 跑到最高主频吧。

初始化工程

首先我们需要先初始化一个工程,就单纯点灯和和串口打印,这里我偷懒用了STM32CubeMX,我们勾上串口和外部时钟,为了方便我们顺便把 SWD 也选上。大概就是这样

CubeMX
CubeMX

然后生成代码即可。

修改时钟

因为我们要跑高主频,原先的 PLL 倍频数不满足,用到了新的一些配置,因此我们需要修改芯片头文件以及hal_rcc_ex.h中的一些宏定义,首先是芯片的头文件,我们这里以air32f103xb.h为例,我们需要修改的地方如下

#define RCC_CFGR_PLLMULL16_Pos               (19U)                             
@@ -219,6 +219,6 @@
   /* USER CODE END 3 */
 }
 

编译下载,打开串口调试助手,可以观察到:

串口输出无乱码,主频正确,我们已经成功在 HAL 中跑到了最高主频。

附录

本文的工程开源在https://github.com/Air-duino/Air32F103-HAL-RCCopen in new window,用到的 HAL 库源码在https://github.com/Air-duino/Arduino-Air32F103-Driversopen in new window

- + diff --git a/posts/Air32-HAL-MCO/index.html b/posts/Air32-HAL-MCO/index.html index e4dac1d..ad6e347 100644 --- a/posts/Air32-HAL-MCO/index.html +++ b/posts/Air32-HAL-MCO/index.html @@ -30,8 +30,8 @@ Air32 的 HAL 改造——适配 MCO | HalfSweet's Blog - - + +
跳至主要內容

Air32 的 HAL 改造——适配 MCO

HalfSweet大约 3 分钟单片机Air32合宙MCO

上篇文章 中,我们把 HAL 库移植给了 Air32,那现在让我们尝试添加一些 HAL 库特有的功能吧,比如这篇文章中描述的MCO

关于

MCO 全称为Microcontroller clock output,即微控制器时钟输出,它可以将主时钟输出到某个引脚上,这样我们就可以在不消耗任何资源的情况下得到一些特定的时钟信号。

在 STM32F103 中,MCO 对于 PLL 的输出有两种选择,分别是 PLL/2 和 PLL/3,但是这对于主频高达 256M 的 Air32 来说显然是不够的,因为其 GPIO 输出最大仅 50M。因此 Air32 有了专属的一个寄存器来控制 MCO 的输出,这个寄存器就是RCC_MCO_VAL,其相对 RCC 的偏移量为0x30

添加寄存器地址

因为这个寄存器是 Air32 独有的,因此我们需要单独添加。我们在芯片的头文件中的RCC_TypeDef结构体中进行添加,我们此处以air32f103xb.h为例,添加的代码如下:

typedef struct
@@ -130,6 +130,6 @@
 }
 

至此,我们就完成了对 MCO 的添加,接下来我们就可以在 HAL 库中使用 MCO 了。我们只需要调用HAL_RCC_MCOConfig即可使用 MCO 输出,例如:

HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_PLLCLK_DIV16, RCC_MCODIV_1);
 

即可以 16 分频输出 PLL 的时钟信号。

附录

测试的代码可以参考https://github.com/Air-duino/Air32F103-HAL-RCCopen in new window

- + diff --git a/posts/Empedded-CI-CD/index.html b/posts/Empedded-CI-CD/index.html index 1a7268c..f867a03 100644 --- a/posts/Empedded-CI-CD/index.html +++ b/posts/Empedded-CI-CD/index.html @@ -30,8 +30,8 @@ 嵌入式中的 CI/CD | HalfSweet's Blog - - + +
跳至主要內容

嵌入式中的 CI/CD

HalfSweet大约 5 分钟单片机Air001合宙CI/CD

对于传统的嵌入式开发来说,我们一般常用的IDE都是诸如Keil、IAR等。这些IDE在方便了我们的开发的同时,也存在很多问题,例如在之前Keil-MDK5是不能跨平台的,仅限在Windows平台运行,并且它的授权也是一个老大难的问题。这样我们在团队协作的时候往往就会遇到很多问题,无法像是互联网的开发那样有一套完整的CI/CD流程。但是MDK6的更新解决了这个问题,第一它是跨平台的,这样在Windows、Linux以及MacOS上都能运行;并且也支持了很多命令行的操作,避免了繁琐的GUI操作,这样也更有利于自动化脚本的编写。

CI/CD是什么

CI/CD是指持续集成(Continuous Integration)和持续交付(Continuous Delivery),是一种软件开发实践,通过使用自动化的软件工具来加快软件开发的流程,这样可以更快的交付高质量的软件。CI/CD的核心是持续集成,即在开发过程中,频繁的将代码集成到主干上,这样可以更快的发现错误,更快的修复错误。而持续交付则是在持续集成的基础上,将集成后的代码部署到生产环境中,这样可以更快的将新功能交付给用户。

简单来说,就是作为开发者的我们,只需要关注代码的编写,而不需要关注代码的编译、测试、部署等等,这些都可以通过自动化的脚本来完成。如果有多人协作的场景下,最终产物的编译和交付也可以通过自动化的脚本来完成,而不是传统的需要人工来完成。

在本文中,我们采用Github Actions来完成CI/CD的流程。我假设本文的读者已经对Github Actions有一定的了解,如果没有的话也没关系,可以参考官方文档open in new window,并且本文也会对一些关键的地方进行说明。

一些前置条件

  1. 一个基于Keil-MDK的工程,无论你之前是否配置过MDK6
  2. 你的工程需要用AC6的编译器编译通过
  3. 一个Github账号
  4. 一定的学习能力

编写Github Actions脚本

我们假定你的这个工程在Github上已经新建了一个仓库,如果没有需要先新建一个仓库。然后在仓库的根目录下新建一个.github/workflows文件夹,然后在这个文件夹下新建一个release.yml文件,这个文件就是我们的Github Actions脚本。它的名称无所谓,但是后缀必须是.yml,这是YAML文件的后缀。

我们略去一些基础的Action的操作,直接进入到关键的一些步骤。

安装 vcpkg

vcpkg是微软开发的一个C/C++的包管理工具,类似于Python的pip、Node.js的npm、Java的maven等等。在MDK6中它被用来作为很重要的包管理器,因此我们需要保证先安装好它。安装非常简单,只需要:

. <(curl https://aka.ms/vcpkg-init.sh -L)
@@ -50,6 +50,6 @@
 

这样我们就可以直接用fromelf命令来转换了

fromelf --bin --output="out/CoreMark/Project/CoreMark.bin" "out/CoreMark/Project/CoreMark.axf"
 fromelf --i32 --output="out/CoreMark/Project/CoreMark.hex" "out/CoreMark/Project/CoreMark.axf"
 

Release

这个时候我们将最终文件上传到release中就好了,这里我用的是ncipollo/release-action这个插件。具体的操作可以看演示仓库。

FAQ

有问题可以评论区留言,遇到的问题可以更新在FAQ里。

演示仓库

https://github.com/Air-duino/Air001-CoreMarkopen in new window

- + diff --git a/posts/EpdTraps1/index.html b/posts/EpdTraps1/index.html index a5266a2..633582a 100644 --- a/posts/EpdTraps1/index.html +++ b/posts/EpdTraps1/index.html @@ -30,11 +30,11 @@ 墨水屏的坑——7.5寸墨水屏刷新为何出现条纹 | HalfSweet's Blog - - + +
跳至主要內容

墨水屏的坑——7.5寸墨水屏刷新为何出现条纹

HalfSweet大约 7 分钟墨水屏墨水屏UC8179DEPG0750RWU790F30遇到的坑

前言

之前在我群里的同学应该都还记得,之前有朋友送给半糖两块7.5寸的墨水屏,其中一块是黑白双色的,标签型号是DEPG0750RWU790F30,驱动芯片则是UC8179。这块屏确实蛮好的,有着高达800*480的分辨率,并且因为是7.5寸所以可视面积非常大,但是在调试的过程中半糖发现了一个问题:这个屏幕的刷新过程中怎么会出现白色条纹,并且刷完的颜色非常怪?

其中上面一张图为我自己做的波形,第二张为使用的OTP波形,但是无一例外,都出现了刷新的问题。抱着也许是驱动板出问题了的想法,我重新lay了一次板子,焊接好之后发现问题确实有所改善,但是并不佳。后续在更换过程中发现采用cd32封装的68uH的电感刷新效果会更好一些,但是依旧存在刷新问题,特别是在UI中有竖着的线条的时候,特别影响观感。

大佬相助

时间过得飞快,到了前几天,想着我解决不了这个问题就拉帮手的想法,我将这块屏寄给了滚筒洗衣机open in new window大佬,然后在我的威逼利诱强烈要求下,我们开始了新一轮的测试。

果不其然,在他移植了我之前写的程序的时候,问题便复现了。

经过一系列的检查,排除了是取模方式等的因素,我们惊讶地发现…大连佳显的官方例程里面给的图片可以完美显示?紧接着我们又试了下全0xAA以及0x55的数据,理论上这样推上去的图像将是完整的一条条1像素的黑白条纹,结果……非常完美。既然横条没问题,那么竖条呢?出现了一点小问题。那么棋盘格呢?问题大了,屏幕甚至想要拒绝刷新。紧接着尝试了别的图像,结果出现了非常奇怪的效果,如果黑色比较少,分得比较开,那么刷出来没有任何问题,但是刷图片类似的比较复杂的形状又会炸掉。难道是内存出现了什么毛病?

紧接着检查,发现了一个我们之前忽视的点,硬件驱动电路!

可以看出,与常规的墨水屏驱动电路相比,该电路的高压部分电容均为10uF,并且boost电荷泵部分的电容为4.7uF,会是这个原因吗?于是大佬开始了他的飞线操作。

不得不说大佬技艺高超,很快就把缺失的电容补上了,那么,工作正常了吗?

事实证明还是有所效果,刷图的质量明显好了不少,像素棋盘格也能正常显示了,这下刷图片总没有问题了吧?

没有意外的话现在就要出意外了,令人惊讶的是棋盘格能显示,但是刷的图片还是依旧炸裂。这就奇了怪了,刷全白正常,刷全黑正常,刷条纹正常,甚至刷棋盘格也正常,但是刷区区一张图片竟然出现了问题?难道是芯片设计的bug吗。

初寻端倪

TCON SETTING

经过了一系列的尝试,我们将重心转移到了寄存器的配置上。首先我注意到了一个0x60的寄存器,这个寄存器的描述为“TCON SETTING”,内容为“This command defines non-overlap period of Gate and Source.”是因为内部的时序问题才导致的刷新不正常吗?但是在修改之后未果,故障依旧。同时参考了同芯片的微雪的屏幕驱动代码,该寄存器的设置的值并不一致,但是修改后故障依旧。

修改PLL

我们联想到,如果是时序导致的出错,那么降低频率是否会好一些?于是我们便尝试了修改屏幕的PLL参数,该寄存器地址为0x30。神奇的事发生了,在大佬降低PLL到5Hz之后,发现之前刷新炸掉的图片竟然能正常刷新了!除了刷的很慢之外并没有什么多余的问题。紧接着又尝试了4灰度使用内部OTP波形进行刷新,发现依然能正常刷新。

难道是因为屏幕厂商的内部布线问题,导致时钟开太高会有干扰?想想便感觉非常不合理,还是说难道屏厂在测试的时候使用的都是比较简单的图片,因此并没有发现刷新的问题?不管什么样的解释,显得都非常牵强,但是目前我们也找不到更好的解决方案,因此便告一段落,并一致认为大概率是屏厂设计导致的硬件问题。

真凶在此

在闲聊中,我们发现威锋有一款5.83寸的屏幕与这块屏幕采用了同款驱动芯片,于是大佬便决定把5.83屏幕的初始化代码搬过来试试。令人意想不到的情况出现了,竟然……好了?在这样的初始化代码下,屏幕的刷新竟然无比的丝滑顺畅,似乎本该如此,可是,为什么呢?

幸而5.83屏的初始化代码非常简洁,我们很轻易就可以发现不同点:主要便是0x06这个寄存器。

5.83屏幕的初始化代码
5.83屏幕的初始化代码

那么,这个寄存器是做什么用的呢?

虽然描述寥寥,但是我们依稀能看出是与boost升压有关,并且第三个数据默认值为0x17,而5.83屏幕的初始化代码中为0x28,是否就是这个寄存器导致的呢?我们将这段初始化代码复制了过去。

意想不到的事出现了,正常了,彻底正常了!没有讨厌的条纹,没有刷新后掉色,屏幕安安静静刷新出一帧的画面,自然又好看。

虽然我找了下相同芯片的在GxEpd2库下方的代码,发现或多或少都对这个寄存器进行了配置,有0x17,0x17,0x28的,有0xC7,0xCC,0x28的,还有0x17,0x17,0x39,0x17的,大家都没有采用默认的四个0x17的值。不知道大佬佳显是抱着怎样的想法,漏掉了这个至关重要的寄存器,也许是屏厂给的测试代码就没有。

这个寄存器没有具体的描述,在SSD芯片中也有类似的寄存器,但是同样额米有具体的文字描述,根据名字来看,或许和boost有关,并且不同的值应该与驱动能力有关,但是具体有什么用,ABC相有什么区别,我不得而知,如果有知道的同学可以告诉我,不胜感激()

总结

总而言之,经过了一晚上的忙活,查找了各种原因,结果发现是一个寄存器没有配置。虽然问题不大,但是蛮折磨人的,并且也不知道是具体原因。不过有了这次的经验,在下次遇到类似的故障的时候,想必找到问题出现的原因会更加轻松。

备注

DEPG0750RWU790F30这块屏幕请记住,一定要配置0x06的寄存器!!!相同尺寸的相同驱动芯片的屏幕应该也大致如此,希望能帮到更多遇到类似问题的同学。

- + diff --git a/posts/HelloWorld/index.html b/posts/HelloWorld/index.html index 1605657..b97cdda 100644 --- a/posts/HelloWorld/index.html +++ b/posts/HelloWorld/index.html @@ -30,11 +30,11 @@ HelloWorld | HalfSweet's Blog - - + + - + diff --git a/posts/MDK6-Dev/index.html b/posts/MDK6-Dev/index.html index 0f14706..6519d61 100644 --- a/posts/MDK6-Dev/index.html +++ b/posts/MDK6-Dev/index.html @@ -30,11 +30,11 @@ 更现代的开发方式?使用 MDK6 进行开发 | HalfSweet's Blog - - + +
跳至主要內容

更现代的开发方式?使用 MDK6 进行开发

HalfSweet大约 2 分钟单片机Air001Air32合宙

今日,在千呼万唤中,Arm 的 MDK6 桌面端终于出来了,本想作为第一批吃螃蟹的开发者,但是当时 Air32 和 Air001 的烧录均有问题,最后在 Arm 官方的支持下,终于可以正常使用了,那么现在我们就来尝试一下。

安装 MDK6

MDK6 实际上是 VSCode 的一个插件,这看起来很荒谬,实际上也确实很荒谬。所以首先我们需要安装 VSCode,这里不多赘述。

安装完成后,我们打开插件的主页https://marketplace.visualstudio.com/items?itemName=Arm.keil-studio-packopen in new window,点击install,即可跳转到 VSCode 中自动安装。这个过程中会安装一大堆依赖的奇奇怪怪的很多插件,甚至可能有 AC6 编译器,请耐心等待。

转换工程

因为目前 MDK6 的工程创建还很辣鸡,因此我们选择把原来 MDK5 的工程转换过来,这里我们以 Air001 为例。

我们随便找一个例子,我们这里以 GPIO 下的GPIO_Toggle为例,首先我们先复制粘贴一份,然后重命名为GPIO_Toggle_MDK6。打开其中的MDK-ARM文件夹,然后选择在 VSCode 中打开。

这是我们会发现出现了一个Convert μVision project Project.uvprojx to csolution?的弹窗,点击convert即可。

convert
convert

此时会自动转换,稍等即可。

目前仅支持转换 AC6 的工程,如果是 AC5 编译器的工程需要自行修改

编译工程

点击左边的CMSIS按钮,点击action列表中的build即可开始编译。

烧录程序

首先我们插入调试器,然后点击左边的Device Manage按钮,然后点击Add device,然后选择实际使用的调试器,我这里使用的是 ST-Link。然后点击左边列表中的铅笔图标,也就是Edit Device

  1. 修改名称,可以修改成自己喜欢的,此处我们保存默认,直接按Enter键即可
  2. 选择 pack 包,我们输入本地最新的 pack 包路径,我这里为D:\GitHub\luatos-soc-air001\PACK\Keil.AIR001_DFP.1.1.0.pack
    pack
  3. 选择芯片,我们这里选择AIR001Dev即可

点击左边的CMSIS按钮,点击action列表中的RUN按钮即可下载。

提示

目前 MDK6 还不能修改调试器的速度,因此默认的 10M 对于 Air001 来说太高了,建议使用别的调试器进行烧录。

如果出现ERROR: Cannot attain state requested. (RDDI-ERROR 52)这样的报错,就是说明速率太高无法下载。

默认下载完不会自动复位,我们可能需要手动按一下 RST 按钮

至此,我们就完成了一个简单的工程的编译与烧录。

- + diff --git a/posts/SEGGER-RTT/index.html b/posts/SEGGER-RTT/index.html index 372d904..599447c 100644 --- a/posts/SEGGER-RTT/index.html +++ b/posts/SEGGER-RTT/index.html @@ -30,8 +30,8 @@ 更高效的日志查看方式——使用SEGGER-RTT | HalfSweet's Blog - - + +
跳至主要內容

更高效的日志查看方式——使用SEGGER-RTT

HalfSweet大约 3 分钟单片机Air001合宙日志

在日常的开发中,我们免不了使用各种各样的日志打印方式,使用调试器固然好用,但是无法直接打印局部变量以及会打断整个运行状态。并且对于众多Arduino的用户来说,直接打印日志显然是更直观的做法。但是直接使用串口打印的话需要一定的资源,并且速度会稍慢,并且可能会占用一个串口,对于资源就不多的MCU,我们有没有更方便的方法呢?

调试方式

使用SWO

对于这个问题,众多厂商也有着相同的需求,于是Arm公司便提出了一种叫做Serial Wire Output的协议,我们将其简称为SWO。简单来说,它是一种用于调试的接口协议。SWO是在ARM Cortex-M微控制器上实现的,它允许调试器通过单个引脚输出数据,而不需要占用其他引脚。使用SWO接口,可以在运行时输出调试信息,例如程序状态、变量值、函数返回值等,从而帮助开发人员进行调试。

STM32微处理器的编程中,我们只需要在STM32CubeMX软件中打开异步跟踪模式即可使用SWO进行输出调试,相比与串口的打印,使用SWO明显效率更高,占用的引脚更少。

但是遗憾的是,采用SWO的日志输出依然会占用一个IO,并且只能和SWD/JTAG等调试口联用。那么我们有没有一种方法,可以做到只使用调试接口就可以输出日志,并且拥有相似甚至更高的效率呢?

SEGGER-RTT

在此基础上,伟大的SEGGER Microcontroller公司便推出了一种新的日志打印方式,称之为Real-Time Transfer,也就是简称的RTT。什么?你没听过这个公司?那你总用过J-Link吧,是的,它们出自于一家公司。

SEGGER-RTT 的原理是通过在目标设备上的专用软件库,将实时数据通过 JTAG/SWD 接口传输到 Host 端。这个过程中不需要额外的硬件支持,只需要使用 SEGGER 的调试器和它的支持的 IDE(如SEGGER's Embedded Studio或其他兼容IDE)。SEGGER-RTT 通过利用调试器的访问权限,从调试目标设备的内部缓冲区中读取数据,并将这些数据发送到 Host 端进行处理和显示。同时也可以在 Host 端向目标设备发送数据,以便执行一些控制操作或者更改程序的状态。由于 SEGGER-RTT 可以非常快速地传输大量数据,因此它通常被用于实时性要求较高的应用程序中。

移植SEGGER-RTT

我们来尝试在Air001单片机上移植SEGGER-RTT。移植好的工程开源链接:

https://github.com/Air-duino/Air001-SEGGER-RTT-Keilopen in new window

第一步,我们先下载一个Jlink全家桶open in new window,然后安装。
然后在如图所示的安装目录下,我们应该可以看到这样的一个压缩文件:

解压它,备用。

0x02 加入Keil工程

我们将xxx/JLink\Samples\RTT\SEGGER_RTT_V788a\下的RTTConfig文件夹复制到我们的工程目录下,并加入到Keil工程中,别忘了添加头文件。

0x03 初始化并调用

main.c文件中include头文件,并初始化。

int main(void)
@@ -51,6 +51,6 @@
   }
 }
 

因为我们使用的是DAPLink,Jlink的软件无法识别,因此我们使用了一个第三方的软件:
https://github.com/XIVN1987/RTTViewopen in new window

打印出了预期的结果。

后记

  • 思考:效率是否能进一步提高呢?
- + diff --git a/posts/STC_CoreMark/index.html b/posts/STC_CoreMark/index.html index 3a8edc6..861a23a 100644 --- a/posts/STC_CoreMark/index.html +++ b/posts/STC_CoreMark/index.html @@ -30,8 +30,8 @@ 不服来跑个分?将 CoreMark 移植到 STC 上试试 | HalfSweet's Blog - - + +
跳至主要內容

不服来跑个分?将 CoreMark 移植到 STC 上试试

HalfSweet大约 5 分钟单片机STC32STC8嵌入式CoreMark

最近维护的 Air001 准备上线了,为了衬托出其强大的性价比,因此我想来做点缺德的事,让我们来和同样以高打性价比的 STC 系列单片机来对比下 CoreMark 的跑分吧,本文将会详细介绍移植过程以及跑分结果。测试的 MCU 为降龙棍 STC32G12K128打狗棒 STC8H8K64U

通用,本文同样适用于 Arm-Cortex M 架构的 MCU。

STC32G12K128

开启 USB-CDC 打印 Log

我买到的降龙棍开发板非常的 HiFi,整个板子上外设除了 LED 和芯片就没什么了,下载程序都是用的自带的 USB-HID 的 bootloader,然后我又懒得接一个串口模块,因此我们可不可以利用原生的 USB,走 CDC 虚拟串口来打印跑分后的数据呢?

答案当然是肯定的,STC 非常的贴心,自带了一个写好的 USB 库,其中包含了 HID 和 CDC 两类主要的操作。那我们就先尝试去移植吧。

下载库文件

STC 的 USB 库文件下载链接为https://stcai.com/filedownload/656048open in new window,下载后会发现是一个压缩文件,我们将其解压备用。

创建工程

打开 Keil,新建一个工程,芯片选择STC32G12K128,然后我们复制刚才解压的文件中的stc32_stc8_usb.hstc_usb_cdc_32g.lib到我们新建的工程的目录下,并添加进自己的工程中。

编写初始化代码

我们在 main.c 中添加如下的代码:

#include "stc32g.h"
@@ -119,6 +119,6 @@
 #define SAMPLE_TIME_IMPLEMENTATION 1
 #define EE_TICKS_PER_SEC           (NSECS_PER_SEC / TIMER_RES_DIVIDER)
 

注意

请注意,这时候编译器可能会有很多报错,是因为和关键字重复了,建议查看 commit 记录查看修改了什么

烧录

使用 STC-ISP 软件烧录,其中 IRC 频率修改为最高 35M,等待烧录后打开串口查看跑分结果。

提示

STC32 的 CoreMark 跑分工程开源仓库为https://github.com/HalfSweet/STC32G-CoreMarkopen in new window

注意

目前的工程只能出现跑分的时间,CRC 校验不通过。如果有修复的方法欢迎在评论区或者仓库提出 QwQ。

- + diff --git a/posts/clarification_of_why_i_am_disappointed_with_the_third_generation_of_wolf/index.html b/posts/clarification_of_why_i_am_disappointed_with_the_third_generation_of_wolf/index.html index 526e5de..4797e77 100644 --- a/posts/clarification_of_why_i_am_disappointed_with_the_third_generation_of_wolf/index.html +++ b/posts/clarification_of_why_i_am_disappointed_with_the_third_generation_of_wolf/index.html @@ -30,11 +30,11 @@ 对《为什么我对第三代郊狼失望》一文的澄清说明 | HalfSweet's Blog - - + +
跳至主要內容

对《为什么我对第三代郊狼失望》一文的澄清说明

HalfSweet大约 5 分钟posts碎碎念郊狼

在上文 为什么我对第三代郊狼失望 一文中,我对于第三代郊狼的硬件部分进行了一些初步分析,因为没有详细的一些资料,因此在一些地方可能存在一些错误。在昨晚(2024-03-19)郊狼作者找到我,与我群群友进行了一番友好的长时间地交流,也解答了我对设计上的一些疑问。在本文中我们会逐步分析前文中提到的问题。

外观设计

在外观上,我质疑这个和二代的设计区别不大,有炒冷饭之嫌。

但是按照原作者的说法,依旧沿用这个外观上考虑到第一比较经典,很多用户已经习惯了这样的设计,因此不好变动。第二就是看起来没什么变化,实际上的话还是有一些小细节进行了变动,比如说在Type-C口处加入了橡胶垫的设计,这样有效避免了外壳与Type-C的外壳地直接接触,带来的最明显的变化就是对于某些可能漏电的充电器来说,悬浮地显然会更加安全,也不会被充电器给电到。

并且根据作者描述,在后期可能会出一个全密封防水的郊狼版本,未来可期(

电源拓扑

在前文中,我误以为第三代和第二代一样,还是比较朴素的纯开环的boost拓扑进行升压。但是作者所述这个部分恰恰是提升最大的。

首先在升压部分,电感由原来的 1mH 更换为了 330uH ,理论上来说这有助于采用更低DCR的电感,这样在变换过程中的能量耗散也就降低了。

然后3.0中也加入了一个电压环的反馈电路,据作者所述这个就是LM393比较器的其中一个功能,用来保证输出的电压保持在一定的范围内,如果超过设定的电压值的情况下将会自动反馈到输出端降低电压。

另外3.0中也存在一个电流环,虽然可能较为粗糙,但是同样也可以实现输出端电流将被限制在某个值内,这同样有助于减少无谓的功率耗散,同时也能大大增强安全性,避免出现短路导致整个电路挂掉的情况。

因此相比2.0的硬件来说,3.0的硬件上在电源拓扑方面也可以将其称之为是一套完整的闭环控制系统。相比于2.0的纯开环来说,各方面性能都会更优秀,并且相较于其他的需要MCU控制的软闭环电路来说,也会更加稳定,实时性更好。

另外其实值得注意的一点就是,3.0中的高压母线卸放电路从2.0中的被动改为了主动式,只有在需要的时候才会进行卸放,这样也有助于减少无谓的功率耗散。并且据作者所述,这一点才是真正的相较于2.0工作温度较高的问题的最有效的解决方案。

主控方案

据作者所诉,3.0的方案选择北欧的原因还是考虑到团队的熟悉程度以及性能方面的取舍。用22年的芯片确实是屯多了(逃

但是绝不存在偷工减料!并且软件方面也进行了较大层面上的重构,也不存在炒冷饭的现象。

磨标芯片

这个确实是为了防抄袭,也确实是主动进行的磨标,但是作者说这个意义似乎不大,并且也已经偷偷告诉我芯片的型号了(逃

电源电压的限制

在2.0中,因为是采用的开环boost方案,因此最大的电压采用了直接并联电阻和TVS的双重控制,因为无法控制最终输出的功率,因此能输出的电压也较高。

但是在3.0中,据作者所述,因为加入了闭环控制和主动卸放,因此不需要做,也没有必要引入那么高的电源电压。所以91V的TVS仅仅是用于最后一道防线失效的情况下的最终保护,整体的余量还非常丰富。

失效保护

在其他保护措施失效,TVS进行保护的时候,其中一个光耦也被用来作为TVS触发的检测,在这种情况下主控将会立即关闭整个电源,以保护整个电路。

“冗余”检测

在3.0中,保留了前代的LED输出指示灯,并且负载检测改成了两颗对向光耦进行检测,这样在结构上说完全对称的,避免了前代中单边检测的不均匀压降导致正负压可能会存在差异的情况。

按钮的按键选型

根据作者所述,选择鼠标微动是因为在结构方面的限制更少,这点和推测一致。至于噪音问题,作者说可以考虑后期增加更多的选项(这也是play的一部分

按钮的触发力度

这个在结构上预留了一个弹簧,因此是可以做到不同的触发力度,后期会考虑增加更多版本。

IMU的选型

作者所述三轴的陀螺仪足够满足设计需求。

外部电压检测

这是个赠品,因此凑合能用就行(

更精确的压力检测

不考虑。

- + diff --git a/posts/conda_novelai/index.html b/posts/conda_novelai/index.html index 7bf891d..3e8a172 100644 --- a/posts/conda_novelai/index.html +++ b/posts/conda_novelai/index.html @@ -30,8 +30,8 @@ 基于conda进行手动配置novelAI | HalfSweet's Blog - - + +
跳至主要內容

基于conda进行手动配置novelAI

HalfSweet大约 6 分钟AI人工智能novelAIconda

最近大家应该都玩过novelAI了,出来的图片质量都非常棒,但是b站大佬给的配置只是打包了的bat文件,但是这显然不符合我们的折腾精神,于是我们来尝试使用conda来进行纯手工配置。

前置条件

  • git
  • conda(在win上使用miniconda或者anconda均可,建议使用miniconda,体积更小)
  • nvida的cuda驱动
  • 合适的磁力链接下载软件
  • 适当的访问外网方式,您可能需要配置命令行、conda等工具,以及您可能需要对pip/conda等工具进行换源,在此不多赘述。

安装stable-diffusion-webui

stable-diffusion-webuiopen in new window是一个基于用于稳定扩散的 Gradio 库的浏览器界面,作用是将泄露出来的novelAI模型以一个可视化比较好的方式进行训练与导出。

这里我们采用git clone的方式来进行下载,同时也更方便我们后期的升级等操作。在命令行中输入

git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
@@ -122,6 +122,6 @@
 
 Stable diffusion model failed to load, exiting
 

经过b站一位大佬open in new window发的Hash对照来看,发现是使用比特彗星下载的文件的Hash不对,但是很神奇的是stable-diffusion-webui的计算的8位正确。

经过重新检查文件完整性的操作,问题修复。

- + diff --git a/posts/embedded_fmtlib/index.html b/posts/embedded_fmtlib/index.html index 20685a0..90fe4b7 100644 --- a/posts/embedded_fmtlib/index.html +++ b/posts/embedded_fmtlib/index.html @@ -30,8 +30,8 @@ 在嵌入式设备上使用fmtlib | HalfSweet's Blog - - + +
跳至主要內容

在嵌入式设备上使用fmtlib

HalfSweet大约 5 分钟postsfmtlib嵌入式ESP8266ESP32ArduinoPlatformIOESP-IDF

众所周知,在c++20以上的标准已经支持了std::format进行格式化输出,不过显而易见,嵌入式领域想要得到支持显然遥遥无期。但是我们已经厌倦了使用sprintf等方式来格式化字符串,c++的流特性又显得不够优雅,怎么才能用上类似于Python中format这样的方式来格式化并输出想要的字符串呢。

通过去fmtlib的官网open in new window查看,我们不难发现,想要使用fmtlib,仅仅需要编译器支持C++11即可,如果版本不够,甚至最低只需要C++98。那么万事俱备只欠东风,让我们来尝试移植吧。

PlatformIO平台

使用Arduino作为框架

ESP8266芯片

移植{fmt}库

首先我们下载fmtlib的包,这里我们使用了最新的版本(9.1.0),下载完成之后将其解压到工程目录下的/lib/文件夹中。不过解压好之后不能直接使用,因为在PlatformIO平台下,所以我们需要先在fmtlib库的根目录下添加一个library.json文件。这里我们可以参考下面的书写方式:

{
@@ -163,6 +163,6 @@
 Restarting in 0 seconds...
 Restarting now.
 
- + diff --git a/posts/index.html b/posts/index.html index d97a90a..9cc92be 100644 --- a/posts/index.html +++ b/posts/index.html @@ -30,11 +30,11 @@ Posts | HalfSweet's Blog - - + + - + diff --git a/posts/why_i_am_disappointed_with_the_third_generation_of_wolf/index.html b/posts/why_i_am_disappointed_with_the_third_generation_of_wolf/index.html index c85e8ba..9a0a6c2 100644 --- a/posts/why_i_am_disappointed_with_the_third_generation_of_wolf/index.html +++ b/posts/why_i_am_disappointed_with_the_third_generation_of_wolf/index.html @@ -30,11 +30,11 @@ 为什么我对第三代郊狼失望 | HalfSweet's Blog - - + +
跳至主要內容

为什么我对第三代郊狼失望

HalfSweet大约 8 分钟posts碎碎念郊狼

最近第三代郊狼开始内测了,作为一名电子爱好者,自然不能错过这个机会。于是我以原价 368 元的主机,以及 128 元两个智能按钮的价格,购买了一套第三代郊狼。

失望是从快递到手开始的,当到手之后我拆开,发现里面的竟然是飞机盒而不是之前的推拉式盒子。这个细节让我感觉有些失望,不过在打开盒子之后有了一些慰藉。因为里面给了一个收纳包,这点很好,当时我甚至很兴奋。

但是随着东西的拆解,所有的设备都被我摆在了桌上,我想,这就是它们的全部了吗?

主机和上一代几乎没有任何区别,只是改了个型号和加入了 RGB 灯,其余的结构件完全一致。此时的我稍稍有些失望,但是转念一想,玩意它的内功深厚,在内在进行了非常大的提升了呢。怀着这样的想法我把它拆了。

主机拆解

拆解过程很简单,只需要加热一下其中一面的面板一段时间,等胶水软化之后可以用吸盘去吸住拉下来,这个应该可以真无损拆解。而对于面板等另一面,稍微加热之后从内部往外部顶处即可,完全无损。

主机规格分析

电源环路

在宣传页中,厂商宣称优化了升压架构。但是经过初步分析,实质上的电源拓扑和第二代其实并无太大差异,依然是采用的开环 boost 拓扑。

但还是存在着一些差异,不难看出此次的电感和电容均换成了贴片,整体的功率相比前一代应该是有所降低。并且同时也可以看出,在输出端并联了一个 TVS 二极管用来限制最高输出电压,按照丝印分析,应该是 91V 的 TVS。这个数据相较于输出母线上的 100V 耐压的电解电容来说,还是稍微有一点极限了。

在第二代中,也有 TVS 进行限压,但是当初使用的是 150V 的 TVS,因此理论上来说第三代的最高输出电压是更低的。从后面的实测中也能看出,开到最高的挡位(200)后,输出的电压峰峰值约为 130.667V,而在第二代中峰峰值则约为 270V。

测试条件均为大约 500 欧的纯阻性负载下进行。

200 挡位下的输出波形
200 挡位下的输出波形
100 挡位下的输出波形
100 挡位下的输出波形

另外有趣的是,在上一代中输出有一个光耦与一个二极管,其中应该是采取反向并联的方式串入回路中。这样主控理论上可以检测到是否存在负载,但是遗憾是只能检测到半周的数据。而这一代中可以看出每一路的输出有 3 个光耦,并且 LED 输出指示的设计依然被保留了下来。至于这 3 个光耦是如何分配的,还需要进行进一步的分析。

另外,在官方的宣传页中,宣称加入了过流保护,最大电流不会超过 50mA,这个部分猜测应该是用的那两颗巨大的 1k 电阻进行采样,并且使用 LM393 比较器进行硬件地切断输出。这个部分相比二代的可能是纯软件的限流措施来说,确实有一定的提升。当然值得注意的是,这依然无法做到硬件级别的可调输出电流,并且也未知能否通过软件的方式作为最高电流的限制。

主控

第三代的主控芯片和上一代一样,依旧采用的是nRF52832,并且有意思的是它的生产日期依然是 2022 年,清库存实锤了(

碎碎念

猜测其实和第二代的软件部分也不会差太多,纯纯的炒冷饭。

在板子上我还发现了有一颗被磨标的 TSSOP-16 封装的芯片,但是不知道具体的作用是什么,如果有能猜测出来的同学可以偷偷在评论区里告诉我((

电池管理

和第二代一样,电池的充电芯片依然采用的是SGM4056TDFN-3×3-8封装。至于锂电池的保护应该是交给内置的保护板进行处理。

按钮拆解

按钮的拆解也很简单,只需要用一把小螺丝刀即可,记住大力出奇迹,它的本质不过就是一个带卡扣的外壳,所以只要稍微用力即可拆开。


按钮规格分析

相比于主机,配套的按钮整体的复杂度低了不少,本质上就是一个一堆开关与一个 IMU 通过一个 BLE 的主控透传出去。

主控

主控使用的是上海博通的方案,具体的型号为BK3432。支持双模蓝牙和 2.4G 的通信。但是值得注意的是它的内置 ADC 仅仅只有 10bit,对于官方宣称的可以使用 Type-C 的 CC1 进行外部电压检测功能来说,ADC 的性能可能会造成一些玩法上的限制。

IMU

根据芯片的丝印分析,IMU 使用的应该是SC7A20,这个方案的优势就是成本非常的廉价,在淘宝上大部分的售价均在一元人民币左右。当然缺点嘛……就是它至少一个普通的 3 轴加速度计,不支持角速度,也不支持陀螺仪的相关功能。使用的拓展性势必会造成一定的限制。

按键

按键采用的是微动开关,但是个人感觉因为结构的限制,只有几个弹簧支承上下壳体,因此手感会比较差,触发力度非常低,当然考虑到应用场景,可能也算是 play 的一环吧 ( ̄﹃ ̄)

另外个人感觉这个微动开关的声音有些略大了,在安静的环境中会非常明显,就像是有人不断在点击鼠标一样。对我来说如果是在比较公开的场合来说,还是希望能换成一些声音较小的微动。

按钮的定价的话目前是 128 人民币两个,就成本来说我个人感觉还是蛮贵的……

一些奇奇怪怪的问题

主机端

主机端有一个非常有意思的东西,在 PCB 上可以看到有一些二次焊接的痕迹,比如说 R80 这个电阻就被拆掉了,上面的助焊剂甚至都没有清理干净。这样的痕迹也不止一处。

执行标准

在包装盒上出现了一个所谓的“执行标准”,但是经过查阅之后发现并不存在相关的国家标准,这个应该是官方自造的一个标准。这个就有点难绷了。

总结

相比二代的主机来说,三代主机并没有得到本质的提升,软件方面应该是大差不差的,仅仅是在硬件上进行了一些不大不小的升级。对于鸽了大半年,并且距离上一代已经很多年的产品来说,我感觉很难感觉到有什么诚意。并且更令人失望的是,二代和三代的结构件是完全一致的,仅仅只是前面板修改了一下版本,而中框和后面板则完全一致。

在一些比较关键的元件上,甚至有一些缩水,比如最高的输出电压,以及升压电感和电容。在第二代上存在一个问题,长时间使用之后升压部分会变得非常热,并且甚至可能会烫伤用户,在第三代中这个问题势必会变得更严重。至于有没有添加诸如 NTC 之类的保护措施,就目前肉眼所见的情况来看,是没有的。不过目前我没有热成像,因此也暂时没法进行长时间的压力测试了,这个以后会补上。

对于外置的按键来说,想法很有心意,但是落实到具体的产品上依旧让人感受到了一种敷衍。硬件采用的基本都是最低最便宜的方案,对于这个售价来说属实不应该,非常亏。

总而言之,对于拥有老款主机的用户来说,我并不是很推荐购买新款,因为真的没什么区别。当然如果是对于在观望的新用户来说,可能可以满足你的需求,但是一定不会远远超出预期,最好先问问自己是否真的需要,如果是刚需再购买,否则一定一定会后悔。

我并不反对高价的产品,但是我非常反感一边卖高价一边采用 costdown 方案。因为这减少的不仅只有成本,还有性能。

- + diff --git a/sitemap.xml b/sitemap.xml index 4be9f56..34a28cd 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1,3 +1,3 @@ -https://halfsweet.cn/2023-08-19T04:37:32.000Zdailyhttps://halfsweet.cn/about/2024-02-15T10:37:21.000Zdailyhttps://halfsweet.cn/friends/2024-01-05T12:10:17.000Zdailyhttps://halfsweet.cn/posts/Air32-HAL-MCO/2024-03-23T06:35:02.000Zdailyhttps://halfsweet.cn/posts/HelloWorld/2023-08-19T04:15:51.000Zdailyhttps://halfsweet.cn/posts/STC_CoreMark/2024-03-23T06:35:02.000Zdailyhttps://halfsweet.cn/posts/why_i_am_disappointed_with_the_third_generation_of_wolf/2024-03-23T06:35:02.000Zdailyhttps://halfsweet.cn/posts/Air32-Clion/2023-09-01T14:34:52.000Zdailyhttps://halfsweet.cn/posts/Air32-HAL-HighFreq/2024-03-23T06:35:02.000Zdailyhttps://halfsweet.cn/posts/embedded_fmtlib/2024-03-23T06:35:02.000Zdailyhttps://halfsweet.cn/posts/conda_novelai/2024-03-23T06:35:02.000Zdailyhttps://halfsweet.cn/posts/EpdTraps1/2024-03-23T06:35:02.000Zdailyhttps://halfsweet.cn/posts/clarification_of_why_i_am_disappointed_with_the_third_generation_of_wolf/2024-03-23T06:35:02.000Zdailyhttps://halfsweet.cn/posts/Empedded-CI-CD/2024-03-23T06:39:37.000Zdailyhttps://halfsweet.cn/posts/MDK6-Dev/2024-03-23T06:35:02.000Zdailyhttps://halfsweet.cn/posts/SEGGER-RTT/2024-03-23T06:35:02.000Zdailyhttps://halfsweet.cn/kfGjHcdk36vg74_H/FAE/2024-03-23T13:39:31.000Zdaily \ No newline at end of file +https://halfsweet.cn/2023-08-19T04:37:32.000Zdailyhttps://halfsweet.cn/about/2024-02-15T10:37:21.000Zdailyhttps://halfsweet.cn/friends/2024-01-05T12:10:17.000Zdailyhttps://halfsweet.cn/posts/Air32-HAL-MCO/2024-03-23T06:35:02.000Zdailyhttps://halfsweet.cn/posts/HelloWorld/2023-08-19T04:15:51.000Zdailyhttps://halfsweet.cn/posts/STC_CoreMark/2024-03-23T06:35:02.000Zdailyhttps://halfsweet.cn/posts/why_i_am_disappointed_with_the_third_generation_of_wolf/2024-03-23T06:35:02.000Zdailyhttps://halfsweet.cn/posts/Air32-Clion/2023-09-01T14:34:52.000Zdailyhttps://halfsweet.cn/posts/Air32-HAL-HighFreq/2024-03-23T06:35:02.000Zdailyhttps://halfsweet.cn/posts/embedded_fmtlib/2024-03-23T06:35:02.000Zdailyhttps://halfsweet.cn/posts/conda_novelai/2024-03-23T06:35:02.000Zdailyhttps://halfsweet.cn/posts/EpdTraps1/2024-03-23T06:35:02.000Zdailyhttps://halfsweet.cn/posts/clarification_of_why_i_am_disappointed_with_the_third_generation_of_wolf/2024-03-23T06:35:02.000Zdailyhttps://halfsweet.cn/posts/Empedded-CI-CD/2024-03-23T06:39:37.000Zdailyhttps://halfsweet.cn/posts/MDK6-Dev/2024-03-23T06:35:02.000Zdailyhttps://halfsweet.cn/posts/SEGGER-RTT/2024-03-23T06:35:02.000Zdailyhttps://halfsweet.cn/kfGjHcdk36vg74_H/FAE/2024-03-23T14:01:08.000Zdaily \ No newline at end of file diff --git a/star/index.html b/star/index.html index 39d49ef..28115ce 100644 --- a/star/index.html +++ b/star/index.html @@ -30,11 +30,11 @@ 星标 | HalfSweet's Blog - - + + - + diff --git a/tag/air001/index.html b/tag/air001/index.html index e9137cb..e4f1b29 100644 --- a/tag/air001/index.html +++ b/tag/air001/index.html @@ -30,14 +30,14 @@ 标签: Air001 | HalfSweet's Blog - - + +
跳至主要內容
嵌入式中的 CI/CD

对于传统的嵌入式开发来说,我们一般常用的IDE都是诸如Keil、IAR等。这些IDE在方便了我们的开发的同时,也存在很多问题,例如在之前Keil-MDK5是不能跨平台的,仅限在Windows平台运行,并且它的授权也是一个老大难的问题。这样我们在团队协作的时候往往就会遇到很多问题,无法像是互联网的开发那样有一套完整的CI/CD流程。但是MDK6的更新解决了这个问题,第一它是跨平台的,这样在Windows、Linux以及MacOS上都能运行;并且也支持了很多命令行的操作,避免了繁琐的GUI操作,这样也更有利于自动化脚本的编写。


HalfSweet大约 5 分钟单片机Air001合宙CI/CD
更现代的开发方式?使用 MDK6 进行开发

今日,在千呼万唤中,Arm 的 MDK6 桌面端终于出来了,本想作为第一批吃螃蟹的开发者,但是当时 Air32 和 Air001 的烧录均有问题,最后在 Arm 官方的支持下,终于可以正常使用了,那么现在我们就来尝试一下。


HalfSweet大约 2 分钟单片机Air001Air32合宙
更高效的日志查看方式——使用SEGGER-RTT

在日常的开发中,我们免不了使用各种各样的日志打印方式,使用调试器固然好用,但是无法直接打印局部变量以及会打断整个运行状态。并且对于众多Arduino的用户来说,直接打印日志显然是更直观的做法。但是直接使用串口打印的话需要一定的资源,并且速度会稍慢,并且可能会占用一个串口,对于资源就不多的MCU,我们有没有更方便的方法呢?


HalfSweet大约 3 分钟单片机Air001合宙日志
- + diff --git a/tag/air32/index.html b/tag/air32/index.html index 4b7128a..dadc9ff 100644 --- a/tag/air32/index.html +++ b/tag/air32/index.html @@ -30,8 +30,8 @@ 标签: Air32 | HalfSweet's Blog - - + +
跳至主要內容
使用 Clion 来进行 Air32 的开发

在上几篇文章中,我们将 HAL 库移植给了 Air32,但是我们的开发环境还是使用的 Keil,这样就会导致一些问题,比如 Keil 的代码提示不够友好,而且 Keil 的代码补全也不够完善,因此我们可以使用一个更好的开发环境,比如 Clion。

@@ -39,6 +39,6 @@

HalfSweet大约 3 分钟单片机Air32合宙MCO
发挥全部实力!Air32 在 HAL 库环境下运行最高主频

最近打算把 Air32 也吃上 Arduino,发挥全部性能,就不用像是 Air001 那样束手束脚了,但是问题是 Arduino 的库是基于 HAL 的,那要用上 Arduino 就必定得先适配 HAL 库,那我们就来先尝试在 HAL 下让 Air32 跑到最高主频吧。


HalfSweet大约 6 分钟单片机Air32合宙超频
更现代的开发方式?使用 MDK6 进行开发

今日,在千呼万唤中,Arm 的 MDK6 桌面端终于出来了,本想作为第一批吃螃蟹的开发者,但是当时 Air32 和 Air001 的烧录均有问题,最后在 Arm 官方的支持下,终于可以正常使用了,那么现在我们就来尝试一下。


HalfSweet大约 2 分钟单片机Air001Air32合宙
- + diff --git a/tag/arduino/index.html b/tag/arduino/index.html index 280cc5d..886c97e 100644 --- a/tag/arduino/index.html +++ b/tag/arduino/index.html @@ -30,12 +30,12 @@ 标签: Arduino | HalfSweet's Blog - - + +
跳至主要內容
- + diff --git a/tag/cicd/index.html b/tag/cicd/index.html index 0ba93cc..bf5329e 100644 --- a/tag/cicd/index.html +++ b/tag/cicd/index.html @@ -30,12 +30,12 @@ 标签: CI/CD | HalfSweet's Blog - - + +
跳至主要內容
嵌入式中的 CI/CD

对于传统的嵌入式开发来说,我们一般常用的IDE都是诸如Keil、IAR等。这些IDE在方便了我们的开发的同时,也存在很多问题,例如在之前Keil-MDK5是不能跨平台的,仅限在Windows平台运行,并且它的授权也是一个老大难的问题。这样我们在团队协作的时候往往就会遇到很多问题,无法像是互联网的开发那样有一套完整的CI/CD流程。但是MDK6的更新解决了这个问题,第一它是跨平台的,这样在Windows、Linux以及MacOS上都能运行;并且也支持了很多命令行的操作,避免了繁琐的GUI操作,这样也更有利于自动化脚本的编写。


HalfSweet大约 5 分钟单片机Air001合宙CI/CD
- + diff --git a/tag/clion/index.html b/tag/clion/index.html index 9d61336..23590b2 100644 --- a/tag/clion/index.html +++ b/tag/clion/index.html @@ -30,12 +30,12 @@ 标签: Clion | HalfSweet's Blog - - + + - + diff --git a/tag/conda/index.html b/tag/conda/index.html index b470c45..18d3b80 100644 --- a/tag/conda/index.html +++ b/tag/conda/index.html @@ -30,12 +30,12 @@ 标签: conda | HalfSweet's Blog - - + + - + diff --git a/tag/coremark/index.html b/tag/coremark/index.html index de4fa9b..69cfdb9 100644 --- a/tag/coremark/index.html +++ b/tag/coremark/index.html @@ -30,13 +30,13 @@ 标签: CoreMark | HalfSweet's Blog - - + +
跳至主要內容
不服来跑个分?将 CoreMark 移植到 STC 上试试

最近维护的 Air001 准备上线了,为了衬托出其强大的性价比,因此我想来做点缺德的事,让我们来和同样以高打性价比的 STC 系列单片机来对比下 CoreMark 的跑分吧,本文将会详细介绍移植过程以及跑分结果。测试的 MCU 为降龙棍 STC32G12K128打狗棒 STC8H8K64U

通用,本文同样适用于 Arm-Cortex M 架构的 MCU。


HalfSweet大约 5 分钟单片机STC32STC8嵌入式CoreMark
- + diff --git a/tag/depg0750rwu790f30/index.html b/tag/depg0750rwu790f30/index.html index 26768bc..71b1042 100644 --- a/tag/depg0750rwu790f30/index.html +++ b/tag/depg0750rwu790f30/index.html @@ -30,8 +30,8 @@ 标签: DEPG0750RWU790F30 | HalfSweet's Blog - - + +
跳至主要內容
墨水屏的坑——7.5寸墨水屏刷新为何出现条纹

前言

@@ -39,6 +39,6 @@

其中上面一张图为我自己做的波形,第二张为使用的OTP波形,但是无一例外,都出现了刷新的问题。抱着也许是驱动板出问题了的想法,我重新lay了一次板子,焊接好之后发现问题确实有所改善,但是并不佳。后续在更换过程中发现采用cd32封装的68uH的电感刷新效果会更好一些,但是依旧存在刷新问题,特别是在UI中有竖着的线条的时候,特别影响观感。


HalfSweet大约 7 分钟墨水屏墨水屏UC8179DEPG0750RWU790F30遇到的坑
- + diff --git a/tag/esp-idf/index.html b/tag/esp-idf/index.html index 6ec8ee4..db4f1aa 100644 --- a/tag/esp-idf/index.html +++ b/tag/esp-idf/index.html @@ -30,12 +30,12 @@ 标签: ESP-IDF | HalfSweet's Blog - - + +
跳至主要內容
- + diff --git a/tag/esp32/index.html b/tag/esp32/index.html index 2310098..cf8f526 100644 --- a/tag/esp32/index.html +++ b/tag/esp32/index.html @@ -30,12 +30,12 @@ 标签: ESP32 | HalfSweet's Blog - - + +
跳至主要內容
- + diff --git a/tag/esp8266/index.html b/tag/esp8266/index.html index 2a61855..fca58e1 100644 --- a/tag/esp8266/index.html +++ b/tag/esp8266/index.html @@ -30,12 +30,12 @@ 标签: ESP8266 | HalfSweet's Blog - - + +
跳至主要內容
- + diff --git a/tag/fmtlib/index.html b/tag/fmtlib/index.html index b7af165..e9497aa 100644 --- a/tag/fmtlib/index.html +++ b/tag/fmtlib/index.html @@ -30,12 +30,12 @@ 标签: fmtlib | HalfSweet's Blog - - + +
跳至主要內容
- + diff --git a/tag/helloworld/index.html b/tag/helloworld/index.html index 47be759..193f55e 100644 --- a/tag/helloworld/index.html +++ b/tag/helloworld/index.html @@ -30,13 +30,13 @@ 标签: HelloWorld | HalfSweet's Blog - - + + - + diff --git a/tag/index.html b/tag/index.html index 5b9c7c6..a332bcb 100644 --- a/tag/index.html +++ b/tag/index.html @@ -30,11 +30,11 @@ 标签 | HalfSweet's Blog - - + + - + diff --git a/tag/mco/index.html b/tag/mco/index.html index edd3edc..55c7aee 100644 --- a/tag/mco/index.html +++ b/tag/mco/index.html @@ -30,12 +30,12 @@ 标签: MCO | HalfSweet's Blog - - + + - + diff --git a/tag/novelai/index.html b/tag/novelai/index.html index 8d705ae..dee29b4 100644 --- a/tag/novelai/index.html +++ b/tag/novelai/index.html @@ -30,12 +30,12 @@ 标签: novelAI | HalfSweet's Blog - - + + - + diff --git a/tag/platformio/index.html b/tag/platformio/index.html index efc1e8a..ae1ea0e 100644 --- a/tag/platformio/index.html +++ b/tag/platformio/index.html @@ -30,12 +30,12 @@ 标签: PlatformIO | HalfSweet's Blog - - + +
跳至主要內容
- + diff --git a/tag/stc32/index.html b/tag/stc32/index.html index bb50dcb..d890ed7 100644 --- a/tag/stc32/index.html +++ b/tag/stc32/index.html @@ -30,13 +30,13 @@ 标签: STC32 | HalfSweet's Blog - - + +
跳至主要內容
不服来跑个分?将 CoreMark 移植到 STC 上试试

最近维护的 Air001 准备上线了,为了衬托出其强大的性价比,因此我想来做点缺德的事,让我们来和同样以高打性价比的 STC 系列单片机来对比下 CoreMark 的跑分吧,本文将会详细介绍移植过程以及跑分结果。测试的 MCU 为降龙棍 STC32G12K128打狗棒 STC8H8K64U

通用,本文同样适用于 Arm-Cortex M 架构的 MCU。


HalfSweet大约 5 分钟单片机STC32STC8嵌入式CoreMark
- + diff --git a/tag/stc8/index.html b/tag/stc8/index.html index b21bffd..38280f2 100644 --- a/tag/stc8/index.html +++ b/tag/stc8/index.html @@ -30,13 +30,13 @@ 标签: STC8 | HalfSweet's Blog - - + +
跳至主要內容
不服来跑个分?将 CoreMark 移植到 STC 上试试

最近维护的 Air001 准备上线了,为了衬托出其强大的性价比,因此我想来做点缺德的事,让我们来和同样以高打性价比的 STC 系列单片机来对比下 CoreMark 的跑分吧,本文将会详细介绍移植过程以及跑分结果。测试的 MCU 为降龙棍 STC32G12K128打狗棒 STC8H8K64U

通用,本文同样适用于 Arm-Cortex M 架构的 MCU。


HalfSweet大约 5 分钟单片机STC32STC8嵌入式CoreMark
- + diff --git a/tag/uc8179/index.html b/tag/uc8179/index.html index 62bc716..cfdd357 100644 --- a/tag/uc8179/index.html +++ b/tag/uc8179/index.html @@ -30,8 +30,8 @@ 标签: UC8179 | HalfSweet's Blog - - + +
跳至主要內容
墨水屏的坑——7.5寸墨水屏刷新为何出现条纹

前言

@@ -39,6 +39,6 @@

其中上面一张图为我自己做的波形,第二张为使用的OTP波形,但是无一例外,都出现了刷新的问题。抱着也许是驱动板出问题了的想法,我重新lay了一次板子,焊接好之后发现问题确实有所改善,但是并不佳。后续在更换过程中发现采用cd32封装的68uH的电感刷新效果会更好一些,但是依旧存在刷新问题,特别是在UI中有竖着的线条的时候,特别影响观感。


HalfSweet大约 7 分钟墨水屏墨水屏UC8179DEPG0750RWU790F30遇到的坑
- + diff --git "a/tag/\344\272\272\345\267\245\346\231\272\350\203\275/index.html" "b/tag/\344\272\272\345\267\245\346\231\272\350\203\275/index.html" index 7b76f16..cd9d8e4 100644 --- "a/tag/\344\272\272\345\267\245\346\231\272\350\203\275/index.html" +++ "b/tag/\344\272\272\345\267\245\346\231\272\350\203\275/index.html" @@ -30,12 +30,12 @@ 标签: 人工智能 | HalfSweet's Blog - - + + - + diff --git "a/tag/\345\220\210\345\256\231/index.html" "b/tag/\345\220\210\345\256\231/index.html" index 406b674..1d6675e 100644 --- "a/tag/\345\220\210\345\256\231/index.html" +++ "b/tag/\345\220\210\345\256\231/index.html" @@ -30,8 +30,8 @@ 标签: 合宙 | HalfSweet's Blog - - + +
跳至主要內容
嵌入式中的 CI/CD

对于传统的嵌入式开发来说,我们一般常用的IDE都是诸如Keil、IAR等。这些IDE在方便了我们的开发的同时,也存在很多问题,例如在之前Keil-MDK5是不能跨平台的,仅限在Windows平台运行,并且它的授权也是一个老大难的问题。这样我们在团队协作的时候往往就会遇到很多问题,无法像是互联网的开发那样有一套完整的CI/CD流程。但是MDK6的更新解决了这个问题,第一它是跨平台的,这样在Windows、Linux以及MacOS上都能运行;并且也支持了很多命令行的操作,避免了繁琐的GUI操作,这样也更有利于自动化脚本的编写。

@@ -41,6 +41,6 @@

HalfSweet大约 6 分钟单片机Air32合宙超频
更现代的开发方式?使用 MDK6 进行开发

今日,在千呼万唤中,Arm 的 MDK6 桌面端终于出来了,本想作为第一批吃螃蟹的开发者,但是当时 Air32 和 Air001 的烧录均有问题,最后在 Arm 官方的支持下,终于可以正常使用了,那么现在我们就来尝试一下。


HalfSweet大约 2 分钟单片机Air001Air32合宙
更高效的日志查看方式——使用SEGGER-RTT

在日常的开发中,我们免不了使用各种各样的日志打印方式,使用调试器固然好用,但是无法直接打印局部变量以及会打断整个运行状态。并且对于众多Arduino的用户来说,直接打印日志显然是更直观的做法。但是直接使用串口打印的话需要一定的资源,并且速度会稍慢,并且可能会占用一个串口,对于资源就不多的MCU,我们有没有更方便的方法呢?


HalfSweet大约 3 分钟单片机Air001合宙日志
- + diff --git "a/tag/\345\242\250\346\260\264\345\261\217/index.html" "b/tag/\345\242\250\346\260\264\345\261\217/index.html" index 31857ad..b8832b6 100644 --- "a/tag/\345\242\250\346\260\264\345\261\217/index.html" +++ "b/tag/\345\242\250\346\260\264\345\261\217/index.html" @@ -30,8 +30,8 @@ 标签: 墨水屏 | HalfSweet's Blog - - + +
跳至主要內容
墨水屏的坑——7.5寸墨水屏刷新为何出现条纹

前言

@@ -39,6 +39,6 @@

其中上面一张图为我自己做的波形,第二张为使用的OTP波形,但是无一例外,都出现了刷新的问题。抱着也许是驱动板出问题了的想法,我重新lay了一次板子,焊接好之后发现问题确实有所改善,但是并不佳。后续在更换过程中发现采用cd32封装的68uH的电感刷新效果会更好一些,但是依旧存在刷新问题,特别是在UI中有竖着的线条的时候,特别影响观感。


HalfSweet大约 7 分钟墨水屏墨水屏UC8179DEPG0750RWU790F30遇到的坑
- + diff --git "a/tag/\345\265\214\345\205\245\345\274\217/index.html" "b/tag/\345\265\214\345\205\245\345\274\217/index.html" index 6b88207..910e8b0 100644 --- "a/tag/\345\265\214\345\205\245\345\274\217/index.html" +++ "b/tag/\345\265\214\345\205\245\345\274\217/index.html" @@ -30,14 +30,14 @@ 标签: 嵌入式 | HalfSweet's Blog - - + +
跳至主要內容
不服来跑个分?将 CoreMark 移植到 STC 上试试

最近维护的 Air001 准备上线了,为了衬托出其强大的性价比,因此我想来做点缺德的事,让我们来和同样以高打性价比的 STC 系列单片机来对比下 CoreMark 的跑分吧,本文将会详细介绍移植过程以及跑分结果。测试的 MCU 为降龙棍 STC32G12K128打狗棒 STC8H8K64U

通用,本文同样适用于 Arm-Cortex M 架构的 MCU。


HalfSweet大约 5 分钟单片机STC32STC8嵌入式CoreMark
在嵌入式设备上使用fmtlib

众所周知,在c++20以上的标准已经支持了std::format进行格式化输出,不过显而易见,嵌入式领域想要得到支持显然遥遥无期。但是我们已经厌倦了使用sprintf等方式来格式化字符串,c++的流特性又显得不够优雅,怎么才能用上类似于Python中format这样的方式来格式化并输出想要的字符串呢。


HalfSweet大约 5 分钟postsfmtlib嵌入式ESP8266ESP32ArduinoPlatformIOESP-IDF
- + diff --git "a/tag/\346\227\245\345\277\227/index.html" "b/tag/\346\227\245\345\277\227/index.html" index 99093bb..390776c 100644 --- "a/tag/\346\227\245\345\277\227/index.html" +++ "b/tag/\346\227\245\345\277\227/index.html" @@ -30,12 +30,12 @@ 标签: 日志 | HalfSweet's Blog - - + +
跳至主要內容
更高效的日志查看方式——使用SEGGER-RTT

在日常的开发中,我们免不了使用各种各样的日志打印方式,使用调试器固然好用,但是无法直接打印局部变量以及会打断整个运行状态。并且对于众多Arduino的用户来说,直接打印日志显然是更直观的做法。但是直接使用串口打印的话需要一定的资源,并且速度会稍慢,并且可能会占用一个串口,对于资源就不多的MCU,我们有没有更方便的方法呢?


HalfSweet大约 3 分钟单片机Air001合宙日志
- + diff --git "a/tag/\347\242\216\347\242\216\345\277\265/index.html" "b/tag/\347\242\216\347\242\216\345\277\265/index.html" index 215a338..a2d8ee6 100644 --- "a/tag/\347\242\216\347\242\216\345\277\265/index.html" +++ "b/tag/\347\242\216\347\242\216\345\277\265/index.html" @@ -30,13 +30,13 @@ 标签: 碎碎念 | HalfSweet's Blog - - + +
跳至主要內容
对《为什么我对第三代郊狼失望》一文的澄清说明

在上文 为什么我对第三代郊狼失望 一文中,我对于第三代郊狼的硬件部分进行了一些初步分析,因为没有详细的一些资料,因此在一些地方可能存在一些错误。在昨晚(2024-03-19)郊狼作者找到我,与我群群友进行了一番友好的长时间地交流,也解答了我对设计上的一些疑问。在本文中我们会逐步分析前文中提到的问题。


HalfSweet大约 5 分钟posts碎碎念郊狼
为什么我对第三代郊狼失望

最近第三代郊狼开始内测了,作为一名电子爱好者,自然不能错过这个机会。于是我以原价 368 元的主机,以及 128 元两个智能按钮的价格,购买了一套第三代郊狼。


HalfSweet大约 8 分钟posts碎碎念郊狼
- + diff --git "a/tag/\350\266\205\351\242\221/index.html" "b/tag/\350\266\205\351\242\221/index.html" index 9948418..d611ba0 100644 --- "a/tag/\350\266\205\351\242\221/index.html" +++ "b/tag/\350\266\205\351\242\221/index.html" @@ -30,12 +30,12 @@ 标签: 超频 | HalfSweet's Blog - - + + - + diff --git "a/tag/\351\201\207\345\210\260\347\232\204\345\235\221/index.html" "b/tag/\351\201\207\345\210\260\347\232\204\345\235\221/index.html" index 03cdc10..7288c04 100644 --- "a/tag/\351\201\207\345\210\260\347\232\204\345\235\221/index.html" +++ "b/tag/\351\201\207\345\210\260\347\232\204\345\235\221/index.html" @@ -30,8 +30,8 @@ 标签: 遇到的坑 | HalfSweet's Blog - - + +
跳至主要內容
墨水屏的坑——7.5寸墨水屏刷新为何出现条纹

前言

@@ -39,6 +39,6 @@

其中上面一张图为我自己做的波形,第二张为使用的OTP波形,但是无一例外,都出现了刷新的问题。抱着也许是驱动板出问题了的想法,我重新lay了一次板子,焊接好之后发现问题确实有所改善,但是并不佳。后续在更换过程中发现采用cd32封装的68uH的电感刷新效果会更好一些,但是依旧存在刷新问题,特别是在UI中有竖着的线条的时候,特别影响观感。


HalfSweet大约 7 分钟墨水屏墨水屏UC8179DEPG0750RWU790F30遇到的坑
- + diff --git "a/tag/\351\203\212\347\213\274/index.html" "b/tag/\351\203\212\347\213\274/index.html" index 5509eaa..e4879ff 100644 --- "a/tag/\351\203\212\347\213\274/index.html" +++ "b/tag/\351\203\212\347\213\274/index.html" @@ -30,13 +30,13 @@ 标签: 郊狼 | HalfSweet's Blog - - + +
跳至主要內容
对《为什么我对第三代郊狼失望》一文的澄清说明

在上文 为什么我对第三代郊狼失望 一文中,我对于第三代郊狼的硬件部分进行了一些初步分析,因为没有详细的一些资料,因此在一些地方可能存在一些错误。在昨晚(2024-03-19)郊狼作者找到我,与我群群友进行了一番友好的长时间地交流,也解答了我对设计上的一些疑问。在本文中我们会逐步分析前文中提到的问题。


HalfSweet大约 5 分钟posts碎碎念郊狼
为什么我对第三代郊狼失望

最近第三代郊狼开始内测了,作为一名电子爱好者,自然不能错过这个机会。于是我以原价 368 元的主机,以及 128 元两个智能按钮的价格,购买了一套第三代郊狼。


HalfSweet大约 8 分钟posts碎碎念郊狼
- + diff --git a/timeline/index.html b/timeline/index.html index 10d8e80..d7dea57 100644 --- a/timeline/index.html +++ b/timeline/index.html @@ -30,11 +30,11 @@ 时间轴 | HalfSweet's Blog - - + + - +