您的位置:首頁>正文

電子胸牌的另類玩法!關於LED點陣胸牌綜合改造集合,全開源

最近好多某寶的商家在做免費LED點陣胸牌的活動, 擼了好幾個。 看著只能顯示文字, 沒啥意思, 堆灰不划算, 就尋思著改造改造。

整理了下手上的胸牌的款式, 發現大概有三款。

本貼就一一整理這三款胸牌的重新程式設計並點亮改造的過程

先上成果圖

涉及這三款led胸牌

從上到下, 定義

最上面款為:雙按鍵, 黑色PCB, 單片機為GD32F150C6

中間款為:側按鍵, 綠色PCB, 單片機為未知打磨晶片

最下麵款為:單按鍵, 黑色PCB, 單片機為GD32F150C6

三款同時點亮的效果

改造成簡易時鐘

先折騰第一款。

單按鍵, 黑色PCB, 單片機為GD32F150C6 usb介面是mini口

就是這款

這個板子比較蛋疼, 因為是黑色油墨

先拆下晶片跑走線

先找出哪些腳是LED驅動腳, 那些腳是其他的功能引腳

這個比較簡單

圖中藍色點標記的就是LED驅動引腳, 其他腳都是功能腳或者空腳

同時可以標出設計者引出的測試點。

其中PA13/PA14用於下載程式,還引出了一個串口

接著找LED的順序

找LED順序的方法是通過看PCB背面的走線,可以看出有一排燈間距過孔的走線就一定是LED驅動走線。然後按照著順序一路用萬用表測量下來就能找出驅動序列的順序(這個步驟比較浪費時間)

因為設計者使用列陣法來驅動LED,所以通過這個順序就能恢復出LED點亮序列

後來看了壇友的一個帖子,說是github上也有一個類似工程,引腳和這款胸牌一樣,我吧整理好的引腳也貼下

引腳的驅動方式是,每兩列用同一個列選拉高,每一行用兩個行選拉低

吧晶片焊回去,開始測試點亮

連接SWD口調試口如下,使用JLINK連線(PS:這種細矽膠線用來飛線簡直不要太爽)

打開JLINK 命令列軟體,可以看到找到了CORTEX M3內核的設備,說明連接線沒錯

經檢測這個GD32被設計者上鎖了讀取保護。

所以需要進行解鎖

注意:這款胸牌一旦解鎖,就不能回到原裝出廠的程式,以後只能使用DIY的程式

解鎖方法:

找到jlink安裝目錄 打開jlinkstm32.exe 選擇按照stm32f1系列方式解鎖

解鎖後會提示以下成功消息。此時晶片已經被擦除乾淨,已經沒有回頭路了

使用jlink進行下載的時候,因為jlink支持列表裡面沒有GD32,所以,選擇的晶片型號應該是

STM32F103C6

如圖

程式因為太複雜,就只貼一小部分核心了

具體的看附件

複製代碼

uint32_t Led_GPIO_Port_Arrange[22] = {GPIOF, GPIOB, GPIOB, GPIOB, GPIOB,

GPIOB, GPIOB, GPIOA, GPIOA, GPIOF,

GPIOB, GPIOB, GPIOA, GPIOF, GPIOB,

GPIOB, GPIOB, GPIOB, GPIOA, GPIOB,

GPIOB, GPIOB

};

const uint16_t Led_GPIO_Pin_Arrange[22] = {GPIO_Pin_7, GPIO_Pin_15, GPIO_Pin_14, GPIO_Pin_11, GPIO_Pin_12,

GPIO_Pin_2, GPIO_Pin_1, GPIO_Pin_6, GPIO_Pin_7, GPIO_Pin_0,

GPIO_Pin_9, GPIO_Pin_8, GPIO_Pin_5, GPIO_Pin_1, GPIO_Pin_4,

GPIO_Pin_13, GPIO_Pin_10, GPIO_Pin_0, GPIO_Pin_4, GPIO_Pin_6,

GPIO_Pin_5, GPIO_Pin_7

};

/**********************************************/

/* 函數功能;清除所有led對應io為復位 */

/* 入口參數:無 */

/**********************************************/

void Clear_All_LED(void)

{

GPIO_CTL(GPIOA) &=0xffcc00ff;//清空A GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_10

GPIO_CTL(GPIOB) &=0x000000c0;//清空除了b3

GPIO_CTL(GPIOF) &=0xffff3ff0;//清空 f0,1,7

GPIO_OCTL(GPIOA) &=~(GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_10);//清空A GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_10

GPIO_OCTL(GPIOB) &=~(GPIO_Pin_ALL-GPIO_Pin_3);//清空除了b3

GPIO_OCTL(GPIOF) &=~(GPIO_Pin_1|GPIO_Pin_0|GPIO_Pin_7);//清空 f0,1,7

}

void Write_One_LED_Pin(uint32_t GPIOx, uint16_t GPIO_Pin,uint8_t pin_satae)

{

uint32_t i,pins;

for(i=0;i<16;i++)

{

if((GPIO_Pin>>i)&0x01)pins=i;

}

GPIO_CTL(GPIOx) |=(uint32_t)0x00000001<

if(pin_satae)GPIO_BOP(GPIOx)|=GPIO_Pin;

else GPIO_BC(GPIOx)|=GPIO_Pin;

}

/**********************************************/

/* 函數功能;點亮對應位置的led */

/* 入口參數:xy */

/**********************************************/

void LED_Open(uint8_t x, uint8_t y)

{

if(x > 43 || y > 10)return;

Clear_All_LED();

Write_One_LED_Pin(Led_GPIO_Port_Arrange[x / 2], Led_GPIO_Pin_Arrange[x / 2], 1);

if(y == 0)

{

if(x % 2 == 0)

{

Write_One_LED_Pin(GPIOA, GPIO_Pin_10, 0);

}

else

{

if(x > 1)Write_One_LED_Pin(GPIOF, GPIO_Pin_7, 0);

else Write_One_LED_Pin(GPIOB, GPIO_Pin_15, 0);

}

}

else

{

if(y==10&&x==42)

{

Write_One_LED_Pin(GPIOB,GPIO_Pin_5,0);

return;

}

if(y==10&&x==43)

{

Write_One_LED_Pin(GPIOB,GPIO_Pin_6,0);

return;

}

if(x % 2 == 0)

{

if(x <= 4 * y - 2) Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2], Led_GPIO_Pin_Arrange[y * 2], 0);

else Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2 - 1], Led_GPIO_Pin_Arrange[y * 2 - 1], 0);

}

else

{

if(x <= 4 * y + 2) Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2 + 1], Led_GPIO_Pin_Arrange[y * 2 + 1], 0);

else Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2], Led_GPIO_Pin_Arrange[y * 2], 0);

}

}

}

最後全屏點亮的效果

第二款:雙按鍵,黑色PCB,單片機為GD32F150C6 usb口為mini口

就是他

注意 這款胸牌焊接品質不怎麼樣,建議加固usb口和開關,不然很容易壞

同樣的,國際慣例,先拆晶片跑走線

跑走線的過程,發現一個真心蛋疼的問題。

這個胸牌的開發設計者應該被祖宗8輩子全部罵一遍過來。居然膽大包天敢吧SWD調試介面給使用掉了,吧調試介面給使用掉了,給使用掉了,用掉了。

你這不就是給大家找麻煩嗎?

沒辦法,只能一邊罵一邊跑走線了唄~

晶片下的走線細節

圖中綠色點表示的是LED驅動引腳。我只想問你用PF6和PF7去驅動LED,檢測按鍵會死啊。居然敢喪心病狂的吧PA13和PA14都佔用

還很奇葩的吧PF6和PF7接了vcc和gnd,這是幾個意思啊????簡直是醉了醉了

繪出板載的測試點位置

其中串口的位置在正面,又是一個奇葩。在正面,只要接了線就沒法轉進殼子了啊。。。。

這裡注意到這個設計者,在左邊的按鍵設計了上拉結構。這個按鍵接了PA15作為按鍵檢測,同時又用一個電阻上拉到boot0.

也就是說,只要在給晶片上電前按住按鍵,就會加入程式下載的ISP模式,然後使用串口下載程式

下載程式的軟體使用GD32官方提供的ISP工具,就是這貨。

這款胸牌不能使用JLINK進行調試

不過唯一值得欣慰的是,這款胸牌的程式沒有上鎖,所以可以讀取出原裝的固件。也就是說,玩累了還能吧原裝固件恢復回去

樓下附件會給出拷貝讀取出來的固件。

跑出LED的線序

這款胸牌的驅動列陣比樓上那款要稍微簡單一些 但同樣是使用23個引腳來掃描點亮11*44的LED列陣

下圖中

藍色為行編號(此處的0,1,2為物理行LED號)

橙色為列編號(此處的0,1,2為物理列LED號)

綠色為驅動對應的列需要拉高的引腳(此處的0,1,2為驅動管腳順序號,也是就上圖)

黃色為驅動對應的行需要拉低的引腳(此處的0,1,2為驅動管腳順序號,也是就上圖)

規律性更強

複製代碼

void LED_Open(uint8_t x, uint8_t y)

{

if(x > 43 || y > 10)return;

Clear_All_LED();

Write_One_LED_Pin(Led_GPIO_Port_Arrange[x / 2], Led_GPIO_Pin_Arrange[x / 2], 1);

if(y == 0)

{

if(x % 2 == 0)

{

if(x > 0)Write_One_LED_Pin(Led_GPIO_Port_Arrange[0], Led_GPIO_Pin_Arrange[0], 0);

else Write_One_LED_Pin(Led_GPIO_Port_Arrange[2], Led_GPIO_Pin_Arrange[2], 0);

}

else

{

if(x == 3)Write_One_LED_Pin(Led_GPIO_Port_Arrange[2], Led_GPIO_Pin_Arrange[2], 0);

else Write_One_LED_Pin(Led_GPIO_Port_Arrange[1], Led_GPIO_Pin_Arrange[1], 0);

}

}

else

{

if(x % 2 == 0)

{

if(x <= 4 * y) Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2 + 1], Led_GPIO_Pin_Arrange[y * 2 + 1], 0);

else Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2], Led_GPIO_Pin_Arrange[y * 2], 0);

}

else

{

if(x <= 4 * y + 4) Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2 + 2], Led_GPIO_Pin_Arrange[y * 2 + 2], 0);

else Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2 + 1], Led_GPIO_Pin_Arrange[y * 2 + 1], 0);

}

}

}

完整點亮的效果

肉眼看是均勻的,只是因為相機的問題,才會有個斜的亮條,實際是不影響的

第三款 比較複雜地一款

側按鍵,綠色PCB,單片機為未知打磨晶片

就是這款 側按鍵 沒有磁鐵,只有別針

那麼要想先玩起來,就得先分析這款打磨晶片是啥

我們注意到有一下三個個特徵

1、引腳相容stm32f0xxc系列晶片

2、晶片的供電直接是用4.2V鋰電池供電

先分析這兩個特徵。鋰電池4.2V直接供電。可以直接排除stm32全系列和gd32全系列。因為這兩款晶片的供電電壓極限都是3.6V,那麼鋰電池4.2V直接接上去肯定是不行的

3、我手上有一個牌上面的晶片沒怎麼打磨乾淨,那麼就可以看到一些蛛絲馬跡

首先用鉛筆給晶片表面塗一下

可以看到兩個圖示 一個應該是晶片廠商的商標,另外一個是ARM

那麼,想像+聯想,再天馬行空一下,再來點靈感

duang!!!

像不像?就問你們像不像?哈哈~

本來綠油是不想要拆晶片跑走線的。但是因為測試條件不方便施展開來,為了方便分析晶片,還是拆下來了

上stm32系列48腳通用轉接板測試

使用jlink的命令列工具連線

可以看到CORTEX M0內核

你們上晶片廠商官網找一圈 發現只有mm32l0xx系列符合條件(cm0內核,帶usb)

範圍縮小到mm32l062/072/073其中的一款

想辦法確定下晶片具體型號。結果發現個蛋疼的問題。官方提供的手冊居然有錯(果然是國內小廠尿性)

翻開mm32l0系列的參考手冊,DBG部分

可以看到swd id和dev id

結果發現,根本對於不上

手冊上寫swd id是0x2BA01477

實際讀取值是0x0bb11477

再對照下讀取dev id

發現也是根本對不上

手冊上寫dev id是0xCC88xxx3

實際讀取值是0xcc568091

一開始我還以為是我打開方式有問題

換了好幾種方法讀取都是這樣的。

無奈之下去下載了mm32f103系列的手冊,哈哈,真相大白

手冊之間互抄也不記得改改內容啊。

cm3內核和cm0內核id居然一樣,貽笑大方啊

這次翻開正宗大廠 意法家的stm32f0系列的手冊看看

寫的明明白白,CORTEX M0 內核的swd id規定就是0x0BB01477

根本不是0x2BA01477

本來通過dev id是能確定具體的晶片型號的

比如stm32f0系列就可以這樣區別出來

但是奈何國內小廠,手冊瞎寫,所以晶片型號根本沒法確定。

anyway,反正都是mm32l0xx系列,都是相容的,只是容量大小有點區別,不影響使用啦。

繼續分析是否鎖定讀保護。

查看參考手冊

用jlink直接讀這幾個位置

很遺憾,符合讀保護特徵,晶片被鎖讀保護了

測試讀取 0x800000位置的資料,不能讀取

那就只能擦除了唄~

注意:這款胸牌一旦解鎖,就不能回到原裝出廠的程式,以後只能使用DIY的程式

擦除教程:(此處就偷懶借用官方圖片了)

(該檔附件提供下載)

2、打開unlock工程(附件提供下載)

添加Flash選項:

擦除完成,沒回頭路啦

開始跑走線。這裡也比較蛋疼。雖然這個板子是綠油,走線很容易看清楚。但是這個板子過孔蓋油蓋的太嚴實了,只能刮開走線才能方便測量了

測試出引腳佔用圖

圖中綠色為LED驅動腳

板子上設計者所留的測試點,蠻多的,良心

測繪出LED列陣順序

這款胸牌除了引腳不同外,驅動方法和上面的雙按鍵款一模一樣(講道理這三款胸牌居然LED引腳完全不一樣)

焊接回去晶片

焊接swd調試下載介面

成功點亮

顯示測試

改造時鐘

大家比較喜聞樂見的項目哈

因為時間精力有限,不可能三款胸牌都改時鐘。那選其中一款來弄。另外兩款需要各位簡單移植,很簡單的。

選擇單按鍵款 就是這貨

時鐘晶片用ds3231。

因為是實驗,就先用模組測試了,實際上是可以直接晶片飛線的。只需要飛iic的sda和scl,電源線和備用電壓就行(電源線和單片機接一起,備用電源直接接在鋰電池上)

這款胸牌上,設定

IIC_SDA_PIN 是 PA2

IIC_SCL_PIN 是 PA3

如圖接線

效果如圖

(程式見附件)

講一下程式構架

整個程式

LED驅動部分分為三個部分

led_drv是led的底層驅動,負責驅動io(這部分每個胸牌各不相同)

led_scan負責led的掃描 (led_scan和led_drv部分一般寫好了就不需要動了)

led_display負責顯示內容的呈現

這裡有個重要的東西 顯示緩存

也就是說,所有要顯示的內容,都是寫到顯示緩存內的。然後刷屏程式會自動讀取並刷屏,具體刷屏部分不用操心。

這個顯示緩存,每個uint16_t數負責一列,只取前11位

開原始程式碼需至原帖獲取,地址:http://bbs.mydigit.cn/read.php?tid=2324306

謝謝觀看!

流覽更多精彩內容請登錄數碼之家網站

技術交流請聯繫原作者

作者:2545889167

同時可以標出設計者引出的測試點。

其中PA13/PA14用於下載程式,還引出了一個串口

接著找LED的順序

找LED順序的方法是通過看PCB背面的走線,可以看出有一排燈間距過孔的走線就一定是LED驅動走線。然後按照著順序一路用萬用表測量下來就能找出驅動序列的順序(這個步驟比較浪費時間)

因為設計者使用列陣法來驅動LED,所以通過這個順序就能恢復出LED點亮序列

後來看了壇友的一個帖子,說是github上也有一個類似工程,引腳和這款胸牌一樣,我吧整理好的引腳也貼下

引腳的驅動方式是,每兩列用同一個列選拉高,每一行用兩個行選拉低

吧晶片焊回去,開始測試點亮

連接SWD口調試口如下,使用JLINK連線(PS:這種細矽膠線用來飛線簡直不要太爽)

打開JLINK 命令列軟體,可以看到找到了CORTEX M3內核的設備,說明連接線沒錯

經檢測這個GD32被設計者上鎖了讀取保護。

所以需要進行解鎖

注意:這款胸牌一旦解鎖,就不能回到原裝出廠的程式,以後只能使用DIY的程式

解鎖方法:

找到jlink安裝目錄 打開jlinkstm32.exe 選擇按照stm32f1系列方式解鎖

解鎖後會提示以下成功消息。此時晶片已經被擦除乾淨,已經沒有回頭路了

使用jlink進行下載的時候,因為jlink支持列表裡面沒有GD32,所以,選擇的晶片型號應該是

STM32F103C6

如圖

程式因為太複雜,就只貼一小部分核心了

具體的看附件

複製代碼

uint32_t Led_GPIO_Port_Arrange[22] = {GPIOF, GPIOB, GPIOB, GPIOB, GPIOB,

GPIOB, GPIOB, GPIOA, GPIOA, GPIOF,

GPIOB, GPIOB, GPIOA, GPIOF, GPIOB,

GPIOB, GPIOB, GPIOB, GPIOA, GPIOB,

GPIOB, GPIOB

};

const uint16_t Led_GPIO_Pin_Arrange[22] = {GPIO_Pin_7, GPIO_Pin_15, GPIO_Pin_14, GPIO_Pin_11, GPIO_Pin_12,

GPIO_Pin_2, GPIO_Pin_1, GPIO_Pin_6, GPIO_Pin_7, GPIO_Pin_0,

GPIO_Pin_9, GPIO_Pin_8, GPIO_Pin_5, GPIO_Pin_1, GPIO_Pin_4,

GPIO_Pin_13, GPIO_Pin_10, GPIO_Pin_0, GPIO_Pin_4, GPIO_Pin_6,

GPIO_Pin_5, GPIO_Pin_7

};

/**********************************************/

/* 函數功能;清除所有led對應io為復位 */

/* 入口參數:無 */

/**********************************************/

void Clear_All_LED(void)

{

GPIO_CTL(GPIOA) &=0xffcc00ff;//清空A GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_10

GPIO_CTL(GPIOB) &=0x000000c0;//清空除了b3

GPIO_CTL(GPIOF) &=0xffff3ff0;//清空 f0,1,7

GPIO_OCTL(GPIOA) &=~(GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_10);//清空A GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_10

GPIO_OCTL(GPIOB) &=~(GPIO_Pin_ALL-GPIO_Pin_3);//清空除了b3

GPIO_OCTL(GPIOF) &=~(GPIO_Pin_1|GPIO_Pin_0|GPIO_Pin_7);//清空 f0,1,7

}

void Write_One_LED_Pin(uint32_t GPIOx, uint16_t GPIO_Pin,uint8_t pin_satae)

{

uint32_t i,pins;

for(i=0;i<16;i++)

{

if((GPIO_Pin>>i)&0x01)pins=i;

}

GPIO_CTL(GPIOx) |=(uint32_t)0x00000001<

if(pin_satae)GPIO_BOP(GPIOx)|=GPIO_Pin;

else GPIO_BC(GPIOx)|=GPIO_Pin;

}

/**********************************************/

/* 函數功能;點亮對應位置的led */

/* 入口參數:xy */

/**********************************************/

void LED_Open(uint8_t x, uint8_t y)

{

if(x > 43 || y > 10)return;

Clear_All_LED();

Write_One_LED_Pin(Led_GPIO_Port_Arrange[x / 2], Led_GPIO_Pin_Arrange[x / 2], 1);

if(y == 0)

{

if(x % 2 == 0)

{

Write_One_LED_Pin(GPIOA, GPIO_Pin_10, 0);

}

else

{

if(x > 1)Write_One_LED_Pin(GPIOF, GPIO_Pin_7, 0);

else Write_One_LED_Pin(GPIOB, GPIO_Pin_15, 0);

}

}

else

{

if(y==10&&x==42)

{

Write_One_LED_Pin(GPIOB,GPIO_Pin_5,0);

return;

}

if(y==10&&x==43)

{

Write_One_LED_Pin(GPIOB,GPIO_Pin_6,0);

return;

}

if(x % 2 == 0)

{

if(x <= 4 * y - 2) Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2], Led_GPIO_Pin_Arrange[y * 2], 0);

else Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2 - 1], Led_GPIO_Pin_Arrange[y * 2 - 1], 0);

}

else

{

if(x <= 4 * y + 2) Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2 + 1], Led_GPIO_Pin_Arrange[y * 2 + 1], 0);

else Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2], Led_GPIO_Pin_Arrange[y * 2], 0);

}

}

}

最後全屏點亮的效果

第二款:雙按鍵,黑色PCB,單片機為GD32F150C6 usb口為mini口

就是他

注意 這款胸牌焊接品質不怎麼樣,建議加固usb口和開關,不然很容易壞

同樣的,國際慣例,先拆晶片跑走線

跑走線的過程,發現一個真心蛋疼的問題。

這個胸牌的開發設計者應該被祖宗8輩子全部罵一遍過來。居然膽大包天敢吧SWD調試介面給使用掉了,吧調試介面給使用掉了,給使用掉了,用掉了。

你這不就是給大家找麻煩嗎?

沒辦法,只能一邊罵一邊跑走線了唄~

晶片下的走線細節

圖中綠色點表示的是LED驅動引腳。我只想問你用PF6和PF7去驅動LED,檢測按鍵會死啊。居然敢喪心病狂的吧PA13和PA14都佔用

還很奇葩的吧PF6和PF7接了vcc和gnd,這是幾個意思啊????簡直是醉了醉了

繪出板載的測試點位置

其中串口的位置在正面,又是一個奇葩。在正面,只要接了線就沒法轉進殼子了啊。。。。

這裡注意到這個設計者,在左邊的按鍵設計了上拉結構。這個按鍵接了PA15作為按鍵檢測,同時又用一個電阻上拉到boot0.

也就是說,只要在給晶片上電前按住按鍵,就會加入程式下載的ISP模式,然後使用串口下載程式

下載程式的軟體使用GD32官方提供的ISP工具,就是這貨。

這款胸牌不能使用JLINK進行調試

不過唯一值得欣慰的是,這款胸牌的程式沒有上鎖,所以可以讀取出原裝的固件。也就是說,玩累了還能吧原裝固件恢復回去

樓下附件會給出拷貝讀取出來的固件。

跑出LED的線序

這款胸牌的驅動列陣比樓上那款要稍微簡單一些 但同樣是使用23個引腳來掃描點亮11*44的LED列陣

下圖中

藍色為行編號(此處的0,1,2為物理行LED號)

橙色為列編號(此處的0,1,2為物理列LED號)

綠色為驅動對應的列需要拉高的引腳(此處的0,1,2為驅動管腳順序號,也是就上圖)

黃色為驅動對應的行需要拉低的引腳(此處的0,1,2為驅動管腳順序號,也是就上圖)

規律性更強

複製代碼

void LED_Open(uint8_t x, uint8_t y)

{

if(x > 43 || y > 10)return;

Clear_All_LED();

Write_One_LED_Pin(Led_GPIO_Port_Arrange[x / 2], Led_GPIO_Pin_Arrange[x / 2], 1);

if(y == 0)

{

if(x % 2 == 0)

{

if(x > 0)Write_One_LED_Pin(Led_GPIO_Port_Arrange[0], Led_GPIO_Pin_Arrange[0], 0);

else Write_One_LED_Pin(Led_GPIO_Port_Arrange[2], Led_GPIO_Pin_Arrange[2], 0);

}

else

{

if(x == 3)Write_One_LED_Pin(Led_GPIO_Port_Arrange[2], Led_GPIO_Pin_Arrange[2], 0);

else Write_One_LED_Pin(Led_GPIO_Port_Arrange[1], Led_GPIO_Pin_Arrange[1], 0);

}

}

else

{

if(x % 2 == 0)

{

if(x <= 4 * y) Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2 + 1], Led_GPIO_Pin_Arrange[y * 2 + 1], 0);

else Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2], Led_GPIO_Pin_Arrange[y * 2], 0);

}

else

{

if(x <= 4 * y + 4) Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2 + 2], Led_GPIO_Pin_Arrange[y * 2 + 2], 0);

else Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2 + 1], Led_GPIO_Pin_Arrange[y * 2 + 1], 0);

}

}

}

完整點亮的效果

肉眼看是均勻的,只是因為相機的問題,才會有個斜的亮條,實際是不影響的

第三款 比較複雜地一款

側按鍵,綠色PCB,單片機為未知打磨晶片

就是這款 側按鍵 沒有磁鐵,只有別針

那麼要想先玩起來,就得先分析這款打磨晶片是啥

我們注意到有一下三個個特徵

1、引腳相容stm32f0xxc系列晶片

2、晶片的供電直接是用4.2V鋰電池供電

先分析這兩個特徵。鋰電池4.2V直接供電。可以直接排除stm32全系列和gd32全系列。因為這兩款晶片的供電電壓極限都是3.6V,那麼鋰電池4.2V直接接上去肯定是不行的

3、我手上有一個牌上面的晶片沒怎麼打磨乾淨,那麼就可以看到一些蛛絲馬跡

首先用鉛筆給晶片表面塗一下

可以看到兩個圖示 一個應該是晶片廠商的商標,另外一個是ARM

那麼,想像+聯想,再天馬行空一下,再來點靈感

duang!!!

像不像?就問你們像不像?哈哈~

本來綠油是不想要拆晶片跑走線的。但是因為測試條件不方便施展開來,為了方便分析晶片,還是拆下來了

上stm32系列48腳通用轉接板測試

使用jlink的命令列工具連線

可以看到CORTEX M0內核

你們上晶片廠商官網找一圈 發現只有mm32l0xx系列符合條件(cm0內核,帶usb)

範圍縮小到mm32l062/072/073其中的一款

想辦法確定下晶片具體型號。結果發現個蛋疼的問題。官方提供的手冊居然有錯(果然是國內小廠尿性)

翻開mm32l0系列的參考手冊,DBG部分

可以看到swd id和dev id

結果發現,根本對於不上

手冊上寫swd id是0x2BA01477

實際讀取值是0x0bb11477

再對照下讀取dev id

發現也是根本對不上

手冊上寫dev id是0xCC88xxx3

實際讀取值是0xcc568091

一開始我還以為是我打開方式有問題

換了好幾種方法讀取都是這樣的。

無奈之下去下載了mm32f103系列的手冊,哈哈,真相大白

手冊之間互抄也不記得改改內容啊。

cm3內核和cm0內核id居然一樣,貽笑大方啊

這次翻開正宗大廠 意法家的stm32f0系列的手冊看看

寫的明明白白,CORTEX M0 內核的swd id規定就是0x0BB01477

根本不是0x2BA01477

本來通過dev id是能確定具體的晶片型號的

比如stm32f0系列就可以這樣區別出來

但是奈何國內小廠,手冊瞎寫,所以晶片型號根本沒法確定。

anyway,反正都是mm32l0xx系列,都是相容的,只是容量大小有點區別,不影響使用啦。

繼續分析是否鎖定讀保護。

查看參考手冊

用jlink直接讀這幾個位置

很遺憾,符合讀保護特徵,晶片被鎖讀保護了

測試讀取 0x800000位置的資料,不能讀取

那就只能擦除了唄~

注意:這款胸牌一旦解鎖,就不能回到原裝出廠的程式,以後只能使用DIY的程式

擦除教程:(此處就偷懶借用官方圖片了)

(該檔附件提供下載)

2、打開unlock工程(附件提供下載)

添加Flash選項:

擦除完成,沒回頭路啦

開始跑走線。這裡也比較蛋疼。雖然這個板子是綠油,走線很容易看清楚。但是這個板子過孔蓋油蓋的太嚴實了,只能刮開走線才能方便測量了

測試出引腳佔用圖

圖中綠色為LED驅動腳

板子上設計者所留的測試點,蠻多的,良心

測繪出LED列陣順序

這款胸牌除了引腳不同外,驅動方法和上面的雙按鍵款一模一樣(講道理這三款胸牌居然LED引腳完全不一樣)

焊接回去晶片

焊接swd調試下載介面

成功點亮

顯示測試

改造時鐘

大家比較喜聞樂見的項目哈

因為時間精力有限,不可能三款胸牌都改時鐘。那選其中一款來弄。另外兩款需要各位簡單移植,很簡單的。

選擇單按鍵款 就是這貨

時鐘晶片用ds3231。

因為是實驗,就先用模組測試了,實際上是可以直接晶片飛線的。只需要飛iic的sda和scl,電源線和備用電壓就行(電源線和單片機接一起,備用電源直接接在鋰電池上)

這款胸牌上,設定

IIC_SDA_PIN 是 PA2

IIC_SCL_PIN 是 PA3

如圖接線

效果如圖

(程式見附件)

講一下程式構架

整個程式

LED驅動部分分為三個部分

led_drv是led的底層驅動,負責驅動io(這部分每個胸牌各不相同)

led_scan負責led的掃描 (led_scan和led_drv部分一般寫好了就不需要動了)

led_display負責顯示內容的呈現

這裡有個重要的東西 顯示緩存

也就是說,所有要顯示的內容,都是寫到顯示緩存內的。然後刷屏程式會自動讀取並刷屏,具體刷屏部分不用操心。

這個顯示緩存,每個uint16_t數負責一列,只取前11位

開原始程式碼需至原帖獲取,地址:http://bbs.mydigit.cn/read.php?tid=2324306

謝謝觀看!

流覽更多精彩內容請登錄數碼之家網站

技術交流請聯繫原作者

作者:2545889167

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示