發表文章

目前顯示的是 2016的文章

How to burn mbed BIN image to NXP LPC1114FN28 using Flash Magic

NXP LPC1114FN28 , Cortex-M0 48MHz, DIP-28, 很合適用麵包板來做實驗, 而且只要美金2塊錢, 當然在台灣買還要運費等等, 不過加一加也可以找到賣家願意用台幣100多塊的價錢賣的。Switch Science有賣一個開發板mbed LPC1114FN28, 這個板子主要是讓這顆晶片可以透過USB接頭連到電腦上, 然後就可以當做隨身碟一樣, 在電腦上直接把編譯好的程式, 施拉進去, 直接做燒錄動作。可是這個板子, 要美金20塊錢, 台灣可以找到賣家賣台幣1000多塊錢。我覺得很貴! 不如把這些錢, 拿來多買幾顆LPC1114FN28。 不過, 只單買晶片, 就要自己用麵包板稍微接一下線, 才會動哦! 不過, 也不會很難, 其實也容易的很, 請參考ARM網站的這一篇: getting-started-with-mbed-lpc1114/ 文章中提到用UART ISP的方法, 只要買一個USB-UART的模組, 再配合NXP自己的Flash Magic工具程式就可以燒錄編譯好的HEX檔。這很好, 大部份開發工具鏈都可以輸出HEX格式。只有mbed線上編譯器只輸出BIN檔! 文章中也提到解決方法, 就是用一支BIN2HEX的轉檔程式, 把BIN檔先轉成HEX, 再丟給Flash Magic去燒就好了。太好了! 可惜,這個下載點進不去了!哦!哦! 只好另外找了! http://srecord.sourceforge.net/ 我試了一下: c:\> srec_cat.exe mbed_blinky_LPC1114.bin -binary -o blinky.hex -intel --line-length=44 可以! 成功的把mbed online compiler產生的檔案丟過去了。

ARM Cortex-M0 UartGets()筆記

圖片
The Definitive Guide to the ARM Cortex-M0 中文版, 目前讀到p.15-19 談到如何讓UART在NXP LPC1114動起來,而且在重定向之後, 自己修改程式,來解決scanf()的問題,最重要的就是UartGets() 試了一下程式執行的結果,和預期不一樣,按倒退鍵,不會倒退,按del鍵,結果出現的是 [3~。想說作者很好心,很次都會故意出一些小錯誤,讓我們讀者可以玩玩找問題的遊戲。這樣不但多了一些樂趣,也可以有更深刻的體驗。後來發現不是,其實是使用的Terminal軟體不同,或者其設定不同,就會造成這些問題。 我使用Putty,預設的設定: 開除錯去看: 按倒退鍵,出現127,預期是8 按ESC,出現[3~(三個鍵),預期是27 按del,出現27,預期是沒有動作或反應 修改Putty的設定後,行為就符合預期了: int UartGets(char dest[], int length) { unsigned int textlen=0; // Current text length char ch; // current character do { ch = UartGetc(); // Get a character from UART switch (ch) { case 8: // Back space if (textlen>0) { textlen--; UartPutc(ch); // Back space UartPutc(' '); // Replace last character with space on console UartPutc(ch); // Back space again to adjust cursor position } break; case 13: // Enter is pressed dest[textlen] = 0; // null terminate UartPutc(ch); // echo typed character break; case

安裝 GNU ARM Eclipse Plug-ins

圖片
前不久買了一本Kindle電子書: Getting Started With STM32 Nucleo Development 跟著書上第二章安裝 GNU ARM Eclipse Plug-ins時, 碰到了問題: 無法安裝 GNU ARM C/C++ J-Link Debugging 元件 書上說只要下一步, 下一步, 就會成功! 看來, 此一時, 彼一時, 軟體的版本又有了一些變化, 只好自己想想辦法了! 1. 在2.2.2節提到可以到 https://sourceforge.net/projects/gnuarmeclipse/ 安裝, 接著教我們按Help, Install New Software, Add 並在出現的對話框裡填入名稱及網址 我發現, 如果已經將這個Plug-in download下來了, 就可以直接在這個對話框中: 按Archive..., 然後選 download 下來的 zip 檔: ilg.gnuarmeclipse.repository-3.1.1-201606210758.zip 按Local..., (如果你將download下來的zip檔解開的話, 選其目錄) 2. 我現在使用的Eclipse for C/C++是Neon這個版本, 之所以會發生無法安裝 GNU ARM Eclipse Plug-ins的 GNU ARM C/C++ J-Link Debugging 元件, Google 了一下, 有人在 element14 community  提到: As per SOP for me, I failed to completely read the instructions.  Here's what I did to fix the problem: 1) Download the CDT package Eclipse downloads - Select a mirror   which is apparently different from the Eclipse CDT download. 2) Open up Eclipse      2.1) Go to Help-> Install New Software      2.2) Cl

安裝Intel NUC 6代i5 Windows 7

圖片
入手了一台Intel NUC 6i5, 開始安裝OS 1. 做一支隨身碟來安裝Windows 7   a. 之前有購買, 所以有Windows 7 ISO檔   b. 先去微軟網站找工具將ISO拷到USB  製做開機USB碟 2. 沒想到開機後, 出現語言選項後, 鍵盤和滑鼠沒有反應   a. 找到Intel的工具  win7 usb3.0 creator v3  Windows-7-USB-3-0-Creator-Utility   b. 利用這個工具把usb 3.0的驅動加入之前做的開機USB碟 3. 再用這支改過的隨身碟開機, 希望可以... 後記:   在上面step 2. windows7 usb3.0 creator utility執行完成後, 出現錯誤訊息, 之後使用這支USB去安裝時, 出現同樣的鍵盤和滑鼠沒有反應問題。試 著手動加入驅動的方式, 沒有成功後, 就放棄了。   改成安裝Win10, 由微軟網站取得Win10 ISO檔後, 這次不用微軟的工具, 改用Intel網站介紹的工具:  Rufus 2.8 Portable    Intel NUC 作業系統安裝    How To Burn an ISO File in a USB drive   在很多地方看到都推薦使用這支程式來做USB開機碟, 所以這支應該不會 是木馬吧! 微軟的scan 工具, 並沒有警示這支程式有問題, 只是叫我傳給他們 去做分析。那現在Intel自己也叫我們用這支來做安裝USB碟。那先試試了...   Rufus很直接, 打開就可以用, 選了磁碟代號, 檔案格式NTFS後, 選取ISO檔案, 按執行, 就開始跑了。做完, 拿去插在Intel NUC, 開機, 按F10, 選USB碟, 按Enter 嘿, 進入安裝畫面了, 而且鍵盤和滑鼠都可以用了! 很快就裝好了。

Arduino Tiny RTC I2C Module

圖片
最近在學習Arduino和RTC的使用,看了葉難先生寫的「輕鬆入門Arduino範例分析與實作設計」一書,其中提到DS1307即時時鐘晶片的使用。就很有興趣的想買一顆來試試,到ICSHOP網站一看,哇!一顆要79塊台幣。這這也不算便宜,而且還要買石英晶體和其他小零件,特別是要一個CR2032電池座,還要把這些東西焊在一起。想想自己手藝不精,眼力也不行了,只怕這些零件到時玩過就散在一邊,浪費了。 沒想到,看到他們也賣另一個[DS1307時鐘模組],而且只要60塊台幣,內含DS1307晶片、石英晶體、CR2032電池座等,還都焊的好好的。 那就先來試試了。 貨到了,看了一下電路圖和文件。哈,除了DS1307外,還有一顆24C32 32K I2C EEPROM,還留了3個接點給DS18B20溫度感測器。太多東西可以玩了,當下不知由那裡玩起啊。 先Google一下好了,果然有一大堆的資料。首先由Matthew的 Arduino RTC: TinyRTC v1 with Arduino Mega 2560 開始看。 他說只要接Vcc, GND, SCL, SDA這四條線就好了。然後他不知由那裡找到的三支草稿碼:SetRTC,GetRTC,I2CScanner。首先用I2CScanner來找DS1307的位址,嗯,是0x68。 然後再用SetRTC這支來設定日期時間,嘔,要直接改程式才能設定哦!再來就是可以用GetRTC這支來讀取日期時間了。試了一下,沒問題,都可以正常運作的。而且,這三支都只用到內建的Wire程式庫。 可是第一個問題,就是要設定日期時間,還要改草稿碼,然後再上傳,實在有點不方便啊! 此時回頭看看葉難的書,發現他用的是另外的方法,是別的程式庫。不過葉先生寫的設定日期時間的程式很好用的,我就先直接把Matthew的草稿碼GetRTC改成可以設定日期時間。 /* Downloaded from http://projectsfromtech.blogspot.com/ *Connect SCL, SDA, Vcc, and GND *Open Serial Monitor and enjoy! */ //Arduino 1.0+ Only #include "Wire.h" #define DS1307_ADDRE

取得Windows電腦上可用序列埠的名稱

最近要在Windows 10上寫一支程式, 其中有一個需求, 要取得目前可用的所有序列埠. 花了一些時間, 發現網路上大家都說, .Net Framework的SerialPort.GetPortNames 方法會傳回 許多重覆的序列埠名稱。例如: COM1 COM12 COM12 COM5 COM5 COM5 除了會重覆外, 還有排序不對的問題。排序問題參考 [C#] 取得目前電腦所有可使用的序列埠(Serial Port)名稱  可以寫一段delegate的排序比較方法來解決。 同樣的, 重覆問題也可以用群組的方式, 寫一小段程式來解決。合在一起, 如下: string[] ports = SerialPort.GetPortNames(); List<string> listPorts = new List<string>(ports); Comparison<string> comparer = delegate (string name1, string name2) { int port1 = Convert.ToInt32(name1.Remove(0,3)); int port2 = Convert.ToInt32(name2.Remove(0,3)); return (port1 - port2); }; listPorts.Sort(comparer); string[] ComPorts = listPorts.ToArray(); var result = ComPorts.GroupBy(a => a); ArrayList GroupPorts = new ArrayList(); foreach (var group in result) { GroupPorts.Add(group.Key); } cboPorts.Items.Clear(); cboPorts.Items.AddRange(GroupPorts.ToArray()); 這樣,下拉選單的內容就會變成: COM1 COM5 COM12

討厭的郵件密碼猜測攻擊

時至今日, 還是存在很多寄垃圾郵件的事件. 寄垃圾信的人, 現在不再用自己的電腦來寄, 因為很容易被找到. 他們都把腦筋動到別人的郵件主機, 以往很多郵件主機管理不善, 不管誰要求它寄信, 一律來者不拒! (open relay) 寄垃圾信的人最喜歡這種主機了. 可是被偷過, 誰不會加個鎖, 裝個門的. 要求寄信, 好的, 請問帳號密碼是什麼? (SMTP AUTH) 畢竟郵件主機就是用來寄信的, 不可能關掉不寄的. 也只能加強安全性! 就好像大門就是用來出入的, 被小偷偷過, 也不可能把大門封掉吧! 所以寄垃圾信的, 很簡單, 就是想法子取得你的帳號密碼了! 總是有人把帳號密碼設得很簡單, 很容易被猜到的. 你知道有多少人每天都在試你的帳號密碼嗎? 在FreeBSD + Sendmail的環境下, 可以把Sendmail的Log Level 開到10以上: 在/etc/mail/sendmail.cf 中 # log level O LogLevel=10 然後, 在/var/log/maillog裡就可以看到類似以下的訊息: Mar 11 11:09:32 mail sm-mta[62505]: u2B39QJH062505: AUTH failure (LOGIN): authentication failure (-13) SASL(-13): authentication failure: checkpass failed, relay=[194.186.181.206] 不用太懷疑, 這就是有人在敲你的門了. 一筆一筆的看太累了! 我寫了一個小程式: mail# more whichip.rb #!/usr/local/bin/ruby -w ARGF.each{ |line|         if line.include? "["                 relay = line[/relay=(.)*/]                 relay = relay[/\[(.)*\]/]                 puts relay         end } 這樣我就可以用以下的指