一次點(diǎn)了半天沒亮的LED燈
????????萬萬沒想到居然有一天一個(gè)LED燈讓我點(diǎn)了半天才亮,事情要從用CH32F103C8T6說起,短短幾天設(shè)計(jì)完了PCB,物料和鋼網(wǎng)也都到了,焊完板子測(cè)試了下基本上不短路,通電測(cè)電壓也是正常的,于是打開了SDK開發(fā)包里的demo project,找了個(gè)最簡(jiǎn)單的IO Toggle例程,不過我手里的例程基本上都被各種臨時(shí)測(cè)試程序覆蓋了,就包括那個(gè)IO反轉(zhuǎn)的例程,現(xiàn)在就是用的最終程序。所以找了一個(gè)沒怎么動(dòng)過的ADC例程來實(shí)驗(yàn)。
????????很快啊,我啪的一聲打開MDK,然后上來就是一個(gè)敲代碼,一個(gè)下程序,全部沒有問題,沒有問題啊,沒有問題以后,自然是傳統(tǒng)點(diǎn)燈,以點(diǎn)到為止,如果繼續(xù)開發(fā)下去,頭發(fā)就沒了,我笑了一下,沒有繼續(xù)開發(fā),這時(shí)間,我看到LED并沒有亮,兩分,兩分鐘多鐘以后,我又看了一下原理圖,確定LED接的是PC13,并且不存在方向反了的情況,有人說我是亂焊的,我可不是亂焊的啊,錫膏、鋼網(wǎng)、刮刀,訓(xùn)練有素,有備而來,畢竟是練習(xí)了兩年半的焊接技術(shù),我看著GPIOC和GPIO_Pin_13半天,甚至goto了過去,時(shí)鐘也是開的GPIOC,怎么可能存在問題呢,單片機(jī)不服氣,它說我這代碼沒用,我說我這代碼有用,它說沒用,我說有用,這是延時(shí),傳統(tǒng)點(diǎn)燈講究的是延時(shí),點(diǎn)燈加delay,I7和AMD都跑不過我這一個(gè)delay,三分多鐘以后,當(dāng)時(shí)捂著眼,我說婷婷,肯定是哪里出問題了,它也承認(rèn)我先打開了它時(shí)鐘啊,因?yàn)檫@時(shí)間,如果按傳統(tǒng)點(diǎn)燈的點(diǎn)到為止它就亮了,我在想發(fā)生甚么事了,LED竟然點(diǎn)不亮,但沒關(guān)系啊,我又啪的一下解壓了一份開發(fā)包,很快啊,上來就是一個(gè)打開點(diǎn)燈例程,一個(gè)復(fù)制粘貼改IO,他們又說我是亂改的,我可不是亂改的,開時(shí)鐘,改端口,復(fù)制粘貼我也是練習(xí)了兩年半的,單片機(jī)說它要試試,我說可以,我啪的一聲就開始編譯,然后上來就是一個(gè)插仿真器,一個(gè)下代碼,這全部沒問題啊,沒問題以后自然是LED就亮了,后來一對(duì)比代碼,發(fā)現(xiàn)一模一樣,就少了一句設(shè)置IO口速度。這個(gè)固件庫,不講武德,來騙,來偷襲我六十九歲的點(diǎn)燈工程師,我勸它要耗子尾汁,好好反思,不要玩這樣的聰明,小聰明啊,庫要以完善為貴,不要搞誤導(dǎo),謝謝朋友們。
????????那么少了一句設(shè)置IO口速度會(huì)發(fā)生什么呢?來看一下GPIO的寄存器說明。

????????同樣的,固件庫也是這么定義的IO速度。
????????而如果不設(shè)置IO速度,那么MODE將會(huì)寫進(jìn)一個(gè)0到相應(yīng)IO占用的2個(gè)位,也就說只能寫1,2,3才是設(shè)置IO輸出,不設(shè)置結(jié)構(gòu)體的速度參數(shù)也就是寫0,IO將會(huì)被設(shè)置為輸入,所以怎么都不會(huì)點(diǎn)亮LED。我甚至還用示波器懟了半天的焊盤。
????????而熟悉ST標(biāo)準(zhǔn)庫或HAL庫就不會(huì)有這個(gè)問題。即便是不寫速度也可以設(shè)置為慢速IO從而能正常點(diǎn)亮燈。