2018年5月10日 星期四

如何修改stm32f103的PWM LED範例

範例來源:https://github.com/avislab/STM32F103

當中有一個範例名為:Example_PWM_LED

是利用PWM控制位在PB6接腳的LED的亮度的實驗
並且利用PA0與PA1兩隻腳的輸入來控制PWM的程度

這裡我們修改成自動變化,也就是呼吸燈的形式

首先我們先在eclipse中開立一個新專案
在File->New->Project選擇C Project
在Executable選擇STM32F10x C/C++ Project並且設定專案名稱
在下一頁的「目標處理器設定」中將Content選擇Empty
並且確定Use system calls:是否為POSIX
確定Trace output:是否為ARM ITM(via SWO)

接著後面的選項都是預設值

隨後進入eclipse主頁面
檢查一下新開立的專案中資料夾是否到齊:
src,system,include,ldscripts
其中system中應包含cmsis,cortexm,diag,newlib,stm32f1-stdperiph

這一個空的專案檔已經將相關的原始碼備妥,所以我們只要填入新的程式碼就可以

先把專案中自動產生的main.c刪除
然後來到example這邊,在example->Example_PWM_LED裡面我們只需要複製main.c這個檔案過來專案就可以,複製的方法就是在main.c這個檔案所在的目錄裡面用滑鼠將檔案複製起來,然後到eclipse的專案瀏覽器視窗中,在剛剛開好的專案上點選滑鼠右鍵,將檔案接上即可。

接著打開main.c檔
這個範例程式的流程如下
設定GPIO,將A0,A1設為輸入,將B6設為輸出
接著設定Timer4主體以及Time4的輸出
接著初始化Timer4的OC1
然後啟動Timer4

隨即進入程式的主迴圈
先讀取A0,若按下則增加Timer CCR的數值
讀取A1,若按下則減少Timer CCR的數值

接下來我們進行修改
因為範例程式是將LED安排在PB6的端子輸出
但是我們的板子是把LED連接在PB8
根據 http://www.st.com/resource/en/datasheet/stm32f103c8.pdf 第33頁指出
說明了Timer4一共有四個輸出端子分別是PB6,PB7,PB8,PB9
目前範例是使用PB6,而我們要改成的PB8剛好是Timer4的第三組輸出

所以我們先回到範例程式前半段
其中有一道指令是用來設定Timer要用哪一組輸出端子


TIM_OCStructInit(&timerPWM);
timerPWM.TIM_Pulse = 10;
timerPWM.TIM_OCMode = TIM_OCMode_PWM1;
timerPWM.TIM_OutputState = TIM_OutputState_Enable;
timerPWM.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM4, &timerPWM);


這一段程式首先將結構變數timerPWM設定了相關參數,然後它送給TIM_OC1Init()做設定
這裡只需要把
TIM_OC1Init
改成
TIM_OC3Init
即可

接著看到主迴圈中負責設定CCR的程式

TIM4->CCR1 = TIM_Pulse;
將它改成

TIM4->CCR3 = TIM_Pulse;
即可

最後要將PWM LED的動作改成自動變化
因此我們需要一個變數來記錄「明」與「滅」的狀態
以便讓變數自動增加或減少
因此我們加入這樣的程式
    if(countDir == 0){
    if (TIM_Pulse < PERIOD)
    TIM_Pulse++;
    else
    countDir = 1;
    TIM4->CCR3 = TIM_Pulse;

    }else{
    if (TIM_Pulse > 0)
    TIM_Pulse--;
    else
    countDir = 0;
    TIM4->CCR3 = TIM_Pulse;

     }
如此一來,迴圈每次回頭就會把CCR3的數值更新,於是就可以看到LED燈明滅之間漸層變化。

2018年5月9日 星期三

如何使用arduino IDE開發stm32f103晶片

根據這裡指出:https://github.com/stm32duino/Arduino_Core_STM32

在arduino IDE裡面新增板子管理員,「額外的開發板管理員網址」如下
https://github.com/stm32duino/BoardManagerFiles/raw/master/STM32/package_stm_index.json

接著就可以在 IDE的工具->開發板: 看到 Generic STM32F103 serials選項
點選後就會在 工具選單內出現新板子的新選項
基本上維持預設值選項
然後將STM32F103的板子以ST-LINK工具連接好,接上電腦
這個板子管理員會將程式編譯好然後上傳並執行,跟傳統arduino的上傳過程一樣,只是編譯時間會久一點

STM32F103這邊完全不用做任何設定或預先安裝,上述的開發過程與其他也ST-LINK工具開發的過程一樣,只是改用Arudino IDE作為介面而已,然後他也相容原本Arudino的程式,他會在編譯過程中搭配一些程式庫將程式碼編譯成STM32F103的ARM code。

至於原本arduino的接腳與STM32F103的接腳如何對應,我還在研究
2019-2-13
關於接腳對應
直接寫接腳名稱就可以,例如:PB8

2018年5月8日 星期二

在mac開發stm32f103,eclipse+stlinkv2+openocd

這一篇使用openocd方法連接stlinkv2

安裝openocd: 參考來源: http://www.davidrojas.co.uk/stm32f3discovery-on-mac-os-x-using-eclipse-gcc-arm-and-openocd/
指令:brew install openocd --enable_ft2232_libftdi --enable_stlink
會安裝在 /usr/local/Cellar/open-ocd
打開 eclipse -> preference
裡面找到 Run/Debug -> String Substitution 裡面的 openoce_path


將openocd程式所在位置填進去

在Debug Configurations地方選擇GDB OpenOCD Debugging
在Debugger分頁地方,config option加入
-f /usr/local/share/openocd/scripts/interface/stlink-v2.cfg -f /usr/local/Cellar/open-ocd/0.10.0/share/openocd/scripts/target/stm32f1x.cfg
用以指定介面的參數檔以及目標晶片的參數檔

這樣就可以了

如果有發生不能連線的問題
那麼在連線前按住RESET鍵在點選Debugger啟動,就可以順利連線了

2018年5月6日 星期日

在mac建立stm32開發環境,eclipse+stm32+stlink,使用st-util+GDB Hardware Debugging下載與除錯


安裝st-link驅動
brew install stlink
這篇文章說是要另外下載,但我直接執行上述指令就成功安裝,不知道會不會動


安裝gcc-arm-none-eabi
brew tap PX4/homebrew-px4
brew update
brew install gcc-arm-none-eabi


下載安裝eclipse CDT

在eclipse-> Help -> Install New Software

Add -> http://gnuarmeclipse.sourceforge.net/updates
稍待清單出現,選擇需要的package
安裝完成會要求重新啟動eclipse

選擇新專案 File -> New -> Project -> C Project
接著就會出現 STM專案
勾選對應的硬體編號
設定專案名稱
在下一頁的Target processor settings選擇
Use system calls: -> POSIX
Trace output -> ARM ITM (via SWO)


安裝openocd: http://www.davidrojas.co.uk/stm32f3discovery-on-mac-os-x-using-eclipse-gcc-arm-and-openocd/
指令:brew install openocd --enable_ft2232_libftdi --enable_stlink
會安裝在 /usr/local/Cellar/open-ocd
打開 eclipse -> preference
裡面找到 Run/Debug -> String Substitution 裡面的 openoce_path
將openocd程式所在位置填進去

不用openocd
而是用st-util與GDB hardware debugging
在前面一開始提到的st-link驅動安裝
會在/usr/local/bin裡面安裝st-util
所以這裡在External Tool Configuration內設定執行外部程式/usr/loca/bin/st-util
st-util他會自動去抓已連接的st-link然後等待tcp/ip port的連接
port : 4242

然後小瓢蟲的地方要使用 GDB Hardware Debugging的方式連接
並且在Debugging tab的地方選擇tcp/ip 連接埠設定4242
接著在第三頁Startup的地方將RESET與Halt兩者反選,因為根據這裡指出,這一版eclipse有bug,選了這兩樣會導致debugger不能運作



每次要執行程式之前先按一下外部工具按鈕,讓st-util跑起來
然後再按小瓢蟲就可以連線下載~

參考資料:
http://macappstore.org/stlink/
https://blanboom.org/2014/stm32-with-osx/

2018年2月23日 星期五

raspberry pi SPI LCM 設定方法

樹莓派其中一種LCM介面是SPI
根據這篇文章指出
https://sudomod.com/forum/viewtopic.php?t=2312
步驟如下:
1.首先開啟樹莓派的SPI介面:使用命令列指令 sudo raspi-config



2.基本上使用  flexfb  跟 fbtft_device 這兩個核心外掛:基本指令如下:

sudo modprobe fbtft_device custom name=fb_ili9341  gpios=reset:25,dc:24,led:18 speed=16000000 bgr=1


3.在 /etc/rc.local 裡面添加三行,要加在 exit 0 這一行之前

sudo modprobe flexfb  width=480  height=320  regwidth=16 init=-1,0xb0,0x0,-1,0x11,-2,250,-1,0x3A,0x55,-1,0xC2,0x44,-1,0xC5,0x00,0x00,0x00,0x00,-1,0xE0,0x0F,0x1F,0x1C,0x0C,0x0F,0x08,0x48,0x98,0x37,0x0A,0x13,0x04,0x11,0x0D,0x00,-1,0xE1,0x0F,0x32,0x2E,0x0B,0x0D,0x05,0x47,0x75,0x37,0x06,0x10,0x03,0x24,0x20,0x00,-1,0xE2,0x0F,0x32,0x2E,0x0B,0x0D,0x05,0x47,0x75,0x37,0x06,0x10,0x03,0x24,0x20,0x00,-1,0x36,0x28,-1,0x11,-1,0x29,-3

sudo modprobe fbtft_device debug=3 rotate=0 name=flexfb speed=40000000 gpios=reset:25,dc:24

/usr/local/bin/fbcp&



第三步是用來執行開機自動執行核心模組掛載的動作
然後背景執行 fbcp 
fbcp 是一個framebuffer複製程式 用來將framebuffer內容複製起來然後透過SPI介面傳送到LCM的程式

fbcp需要下載原始碼並編譯與安裝
方法如下:

sudo apt-get install cmake
git clone https://github.com/tasanakorn/rpi-fbcp
cd rpi-fbcp/
mkdir build
cd build/
cmake ..
make
sudo install fbcp /usr/local/bin/fbcp


2018年2月20日 星期二

關於mbcWJFX的設計哲學

在2003那時候(根據原始碼中的註解)我打造了一個在palm上面運作的app
用途是在palm上面可以編輯與運行圖形化程式
是受到LabVIEW的啟發所做

當時是從一個簡單的palm範例開始
我記得那是一個塗鴉板程式範例
因為塗鴉板程式會運用palm的觸碰輸入與圖形之間的變化互動
因此用來實現這個專案十分洽當

palm os 是一種協調式多工
app主程式進來後有一個迴圈
在程式架構的設計上
不能有無窮迴圈或是等待迴圈在裡面
所有的事情必須切割成一片一片的時間

系統會回呼我們的事件處理副程式
static void AppEventLoop(void)
然後我們把要處理的所有事情安排在事件處理副程式中

這一個專案式我自發性的專案
在課餘時間做的
並且持續了一段時間
當時十分燒腦
而且呈現沉迷狀態

後來出社會工作後發現
這一次的專題訓練奠定了一個重要的基礎
因為後來開發生理監視器的時候
也是一個協調式多工
因此我在工作中引入許多當年累積的經驗與知識

特此為記

2017年12月12日 星期二

mechacar之7688DUO初次設定

32u4安裝firmata

設定密碼 XXXXXX(MAC末六碼,大寫)(是否統一小寫?TBD)
改 Device Name : mechacarXXXXXX (MAC末六碼,小寫)
設定網路為client
以上兩件事只能一次改一件

ssh root@mechacarXXXXXX.local 登入
以下#為ssh登入後的提示符號,#後的字串為需要輸入的指令
# opkg update
# opkg install unzip
# opkg install wget
# pip install pyMata

參考 https://docs.labs.mediatek.com/resource/linkit-smart-7688/en/tutorials/file-storage/mounting-the-root-fs-on-an-sd-card
轉移root到sd card
# opkg install block-mount kmod-fs-ext4 kmod-usb-storage-extras e2fsprogs fdisk

下載 mechaBYTE 軟體系統
# wget https://github.com/pondahai/MacroByte/archive/master.zip

# unzip master.zip
解開後會出現新資料夾 MacroByte-master/
將當中的 root資料複製到根目錄
# tar -C MacroByte-master/root -cvf - . | tar -C / -xf -

切換目錄到: /www/cgi-bin
# cd /www/cgi-bin

變更檔案屬性
# chmod +x /www/cgi-bin/roverLunar

回到電腦端 瀏覽器 輸入網址:mechacarXXXXXX.local/blockly
測試系統是否正確執行

指令拷貝區:
opkg update
opkg install unzip
opkg install wget
pip install pyMata
opkg install block-mount kmod-fs-ext4 kmod-usb-storage-extras e2fsprogs fdisk
wget https://github.com/pondahai/MacroByte/archive/master.zip
unzip master.zip
tar -C MacroByte-master/root -cvf - . | tar -C / -xf -
chmod +x /www/cgi-bin/roverLunar


用下列積木測試7688DUO上的D13 LED是否閃爍