昨天將整理好的第一個STM32程式放上部落格後,有很多對於STM32想做的實作,例如如何顯示字元在LCD1602、如何控制伺服馬達、如何連接藍芽裝置HC-05等,本篇開始將陸續推出相關的練習,一來是學習如何利用STM32控制周邊的裝置,也紀錄如何連接多種裝置。這一篇要來看一下如何連接LCD1602顯示器。
上一篇提到有關 STM32F103C8T6 上有兩個 Jump,在燒錄時,要將 BOOT0 的 JUMP 跳到 1 那邊,才能進行燒錄,這種模式就是所謂的 ISP(In System Programing)模式,是指目標晶片使用 USB 或 UART 等連線方式去更新晶片内部的APROM、DataFlash和用户配置(Config)的方法[維基百科]。
有關於這兩個 BOOT0 跟 BOOT1 排列組合有 4 種狀況,但只用到 3 種,分別說明如下(X表示接不接都可以):
我實際遇到的狀況是在燒錄時,要將 BOOT0 的 JUMP 跳到 1,開始進行燒錄。完成後,將 CP2102 從 USB槽拔出後,再插回去電腦,竟然 STM32 沒有如預期的像 Arduino 一樣執行程式。如果將 JUMP0,從 1 跳回 0 ,再將 CP2102 插入電腦,原來燒錄的程式就啟動執行。也就是 BOOT0 用來控制 STM32 寫入程式的狀態,可寫入的狀態(JUMP:1),執行程式的狀態(JUMP:0)。
參考其他的範例程式時,使用到 LiquidCrystal_I2C 這個函數庫,原以為可以使用原先已經安裝在 Arduino 中的程式庫(Library),直接進行編譯。但在編譯過程中會出現錯誤,應該是為了 STM32 有稍稍修改程式庫,記得要換成這個 LiquidCrystal_I2C 程式庫。安裝的方法如下一章節。
上一篇提到有關 STM32F103C8T6 上有兩個 Jump,在燒錄時,要將 BOOT0 的 JUMP 跳到 1 那邊,才能進行燒錄,這種模式就是所謂的 ISP(In System Programing)模式,是指目標晶片使用 USB 或 UART 等連線方式去更新晶片内部的APROM、DataFlash和用户配置(Config)的方法[維基百科]。
有關於這兩個 BOOT0 跟 BOOT1 排列組合有 4 種狀況,但只用到 3 種,分別說明如下(X表示接不接都可以):
BOOT0 | BOOT1 | 模式 | 說明 |
---|---|---|---|
0 | X | FLASH | 從快閃記憶體啟動,這是正常的工作模式。 |
1 | 1 | SRAM | 從內置的SRAM啟動,這種模式可以用於調整測試。 |
1 | 0 | ISP | 從系統記憶體啟動,即所說的ISP燒錄方式。燒錄程式到系統需用這種模式。 |
我實際遇到的狀況是在燒錄時,要將 BOOT0 的 JUMP 跳到 1,開始進行燒錄。完成後,將 CP2102 從 USB槽拔出後,再插回去電腦,竟然 STM32 沒有如預期的像 Arduino 一樣執行程式。如果將 JUMP0,從 1 跳回 0 ,再將 CP2102 插入電腦,原來燒錄的程式就啟動執行。也就是 BOOT0 用來控制 STM32 寫入程式的狀態,可寫入的狀態(JUMP:1),執行程式的狀態(JUMP:0)。
參考其他的範例程式時,使用到 LiquidCrystal_I2C 這個函數庫,原以為可以使用原先已經安裝在 Arduino 中的程式庫(Library),直接進行編譯。但在編譯過程中會出現錯誤,應該是為了 STM32 有稍稍修改程式庫,記得要換成這個 LiquidCrystal_I2C 程式庫。安裝的方法如下一章節。
[安裝程式庫Library]
本實作需要安裝以下程式庫:程式庫(Library)安裝方法請參考另一篇文章: Arduino筆記:安裝 Arduino IDE 程式庫(Library)。
[材料]
- STM32F103C8T6開發板
- USB轉TTL序列傳輸線 CP2102
- LCD1602液晶顯示器
- PCF8574 LCD連接模組
- 排線 n 條
[接線圖]
CP2102 | STM32F103C8T6 | PCF8574 LCD連接模組 |
---|---|---|
GND | GND | GND |
3V3 | 3.3V | - |
RX | PA9 | - |
TX | PA10 | - |
- | B6 | SCL |
- | B7 | SDA |
5V | - | VCC |
[程式]
#include <Wire.h> #include <LiquidCrystal_I2C.h> // 設定 LCD 16x2 位址: 0x27 LiquidCrystal_I2C lcd(0x27, 16, 2); void setup() { lcd.begin(); lcd.backlight(); lcd.clear(); lcd.setCursor(0,0); lcd.print("Hello Ceiling!"); } void loop() { int i=0; lcd.setCursor(0, 1); lcd.print(" "); //清除百位以下的字元 for (i=0;i<=100;i++){ lcd.setCursor(0, 1); lcd.print(i); delay(1000); } }
張貼留言