2010年3月31日 星期三

快完成了

終於收到合約內容了


但還沒收到offer


至少有點進展了


明天把合約資料用掛號寄給公司應該就完成1半了


今天重新改第5代電腦鼠


因為要大改版,所以進展有點慢


但是用指標和結構真的可以把副程式獨立開來


很棒


在休息的時候,看了一篇文章


其實未來的事真的很難說


但就真的如我的標題說的「機會不等人」


如果不準備好,難保下一次還會有機會!


我在找工作的時候


真的有這一番體會


第一次面試的公司


還沒去之前不是很喜歡


但面試完後超想進去的


但最後接獲「備選沒上」


心情真的還滿低落的


後悔自己沒有準備好


雖然主管最後要了一個名額給我


讓我可以進入那家公司


很感謝那位主管


所以


隨時準備好


以免想後悔都來不急


共勉之~


2010年3月30日 星期二

下一關

今天


1、差不多把STM32玩得差不多了


2、老大說我的論文差不多了,開心!


明天


不知道可不可以把研發替代役的事情搞定


不知道為什麼


這家公司的人資很忙


忙到都忘了回我電話


會不會太誇張


被放點了好幾次了


好希望明天就可以搞定


最近想重寫第五代電腦鼠的程式


除了寫論文發現的bug外,還想換新想法進去


為了程式上的練功


這次要用指標與結構來磨練自己程式上的功力


ccccc


期待我的好消息~


 


2010年3月29日 星期一

合併timer

原來stm32的功能真的很多 = =


它的timer都是16bit的


不過可以利用程式的技巧,將timer合併在一起


也就是2個16bit的timer可以合併成32bit的timer


(不知道可不可以合併三個timer)


這樣在做Output Compare 或是Input Capture 都還滿實用的


但我想合併encoder 介面卻一直失敗= =


算了,先做別的實驗好了


功能多的背後代表的是需要花的時間也比較多


明天規劃:


1、把ADC再搞熟一點:a、多通道各別取樣與轉換。b、多通道利用掃描方式的取樣與轉換


2、學習STM32一些有用的Application Note


3、學習如何利用USART 燒錄程式,而不需要經過JTAG


4、練習SPI與I2C


5、規劃stm32版本的電腦鼠


6、規劃stm32版本的SSC(控伺服馬達的小版子)


嗯~


差不多快可以駕御stm32了


2010年3月27日 星期六

stm32 入門篇-I/O設定

這顆stm32的i/o設定上,功能就很多了


輸入可以分成


1、input pull-up  上拉(提升)電阻輸入


2、input pull-down 下拉電阻輸入


3、input floating 空接輸入


4、analog input 類比輸入


5、alternate function input 選擇式輸入


輸出可以分成


1、output open-drain 開汲極輸出


2、output push-pull  推挽式輸出


3、alternate function open-drain 選擇式開汲極輸出


4、alternate function push-pull 選擇式推挽式輸出


alternate function一開始我還搞不太懂,原來其實就只是,初始化的時後stm32原本的腳位設定都是I/O,如果需要選用到TIMER、USART這類的周邊輸出輸入,就需要選擇alternate function,這樣的話,I/O就會被選擇到相對應的功能。


另外腳位的預設還可以REMAP(重新設定),這時後也是需要選擇alternate function,這滿需要注意的



I/O的速度大概可以分成三種:2Mhz、10Mhz、50Mhz,本來一直以為I/O要跑到50Mhz要做什麼,後來發現,USB需要48Mhz,而MCO(main clock output)都可能跑到這個速度,所以就慢慢的能體會了。


因為I/O是由APB在控制的,所以選擇速度主要是和AMBA bus有關系。


 


假設我要做PRC0與PRC1做閃爍燈


程式主要的設定


I/O的設定


  GPIO_InitTypeDef GPIO_InitStructure;


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; //pin0 與pin1
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽式輸出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //選擇50Mhz的輸出
  GPIO_Init(GPIOC, &GPIO_InitStructure); //將設定選擇到GPIOC上


用這指令前要先宣告結構變數,還好有玩過typedef,賺到了


RCC(reset and clock controller )的設定


 RCC_APB2PeriphClockCmd(RCC_APB2Periph_C, ENABLE); //置能GPIOC


主程式就利用一個死迴圈和1個delay達成閃爍燈的功能


main{


  while(1){


         GPIOC->ODR &= 0xfffffffc    ;
         Delay( ) ;
         GPIOC->ODR |= 0x00000003    ;
         Delay( ) ;
  }


}


-> 這個指標結構又跑出來了,還好之前有玩過,不然又要錯怪它是c++了


這只是最簡單的設定而已,但其實有了dsPIC的底子,其實學stm32並不會太難


但因為我使用的介面是keil C,所以對環境到是不太習慣


stm32 入門篇-匯流排介紹

要操作stm32之前,最好先了解ARM的匯流排架構,以免在使用或設定上產生太多的疑問


可以參考工研院系統晶片技術中心的AMBA Bus介紹


AMBA Bus大概可以分成三種:


1、ASB-Advanced System Bus


2、AHB-Advanced High-performace Bus


3、APB-Advanced Peripheral Bus


因為我們要寫微控制器,所以比較會用到AHB和APB


我用的是STM32F103RET6,其內部已經將周邊都分好了,對應到APB1與APB2


其內部的功能真的還滿強大的,光TIMER可以做的事應該就打死一票的MCU了


內建的ROM與SRAM都還滿可觀的,最奇怪的是還內含一顆溫度感測器,愈來愈不懂要做什麼用



至於為什麼要分成APB1與APB2,主要的原因是AHB最高可以達到72Mhz,而APB1最高只能達到36Mhz,APB2最高可以達到72Mhz,這樣就知道為什麼要分成2組APB了,另外還提供一個Full speed的USB,所以可以選擇USB 48Mhz。


有趣的是,有個接腳名稱叫MCO(Main Clock Output),可以選擇不同的頻率做輸出


但更有趣的是,I/O雖然是在APB2下,但最高速只能跑到50Mhz,所以,當要輸出72Mhz的主頻率時,輸出是會失真的(原本應該要方波,但會看到正弦波)。



有了以上的了解後,大至上就對這顆stm32有初步的了解了,可以開始上工了。


又中招了

前幾天因為在接文字型的LCD,結果接pin腳接到crystal上。導致crystal沒辦法啟振


昨天又把文字型LCD接上,結果又不知道共接到那支腳了,導致DATA腳沒有訊號輸出


@@


差點沒有暈倒


同樣的東西出錯同樣的BUG


真的很想喊救命


唯一值得開心的是


文字型的LCD已經可以上工了


多了一個可以顯示資料的工具了@@


如果可以的話,再玩一個USB好了


後來想想,這顆STM32有6組TIMER


2組TIMER可以產生六步方波


2組TIMER可以做Hall sensor 換相用


2組TIMER可以做encoder 輸入計數


cccccccccccc


拿這顆來控2顆直流無刷馬達好像很贊喔


自走車用2顆直流無刷馬達,只需一顆MCU就可以搞定,這很屌喔


開始愈來愈有趣了的感覺了


好久沒有這麼興奮過了


2010年3月26日 星期五

差不多了

差不多快把stm32這顆MCU的週邊玩過一遍了


實在很強


它沒有內建EEPROM,但可是用flash模擬EEPROM的功能,除了讀寫的次數比EEPROM差,但是速度卻比EEPROM快上許多。


它內建2組DMA通道,說實在的,這還滿好用的,原本要core執行的動作,丟給DMA就搞定了,不需要浪費core的資源。


內建一個temperature sensor,搞不懂MCU內建這東西要做什麼@@,這顆MCU本身不太消耗能量,還滿省電的,MCU不會發熱,所以量室溫應該可以滿準的,但是我還是不懂,要這sensor要幹啥。


內建多組TIMER,它們的TIMER功能很強,除了可以產生PWM外,量測、計算、中斷,都可靠TIMER來實現,最主要的1組TIMER可以當作1個encoder 的解碼器使用,超棒。


12bit的ADC,取樣速度可以達到1Mbps,但在72Mbps(全速)好像就沒有那麼快,但只差一點,真的是還滿快的。


內建12bit的DAC,可以固定輸出三角波的功能,我也不知道這功能要做什麼- -,特別。 



好像真的除了好用,還是好用


我還有一些功能還沒玩到,但算了,先做個小題目練習看看


cccccccccccccccccccccccccccccc


有空再寫如何使用stm32唄


2010年3月23日 星期二

新玩具stm32

差不多把比較複雜的事情搞定了


工作有著落了(感謝大家的幫忙,小弟未來三年會在一家小公司上班)


最近又要玩之前玩的玩具


這次會有比較多的時間


所以我幾乎時間都耗在這上面


話說台灣的資源還真是少,資源幾乎都是對岸的@@


因為是ARM based的架構,所以其實還是要對ARM有點了解,不然還真的很痛苦


ARM的匯流排還是要大概了解一點,不然會不知道程式在設定什麼


比較特別的是腳位是有定義初始化、替換(Alternate Function,AF)腳位和重新定義(Remap)腳位。


另外I/O腳位的功能很強,也很複雜


除了要設定Input和Output型態外(上拉電阻、下拉電阻、開及極、開源極、類比輸入)還要設定腳位時脈(我還搞不懂這要幹嘛),設定中斷控制器(Nested Vetored Interrupt Controller,NVIC)


現在我只能說stm32這顆微控制器功能很強,但現階段對我來說很不友善。


學習上還滿辛苦的@@


而且sample code 和compiler 又有很多的關係,用起來都不太習慣


再讓我熟悉一陣子吧,或許會更有心得


 


其實會選擇一個從來不熟悉的晶片,是因為有很多考量


1、這樣就需要看很多英文資料


2、打算學習邏輯分析儀


3、學習外部記憶體


4、做計劃是一定要的!


那麼,就再痛苦一陣子吧。


2010年3月13日 星期六

繪圖的技巧

最近在寫論文的關係


由於要把論文印出來


因為老闆說只要印黑白就好,所以才發現這個有趣的問題


本來我習慣就畫線就好,在電腦端看其實沒有什麼異狀,還滿清楚的



但一變成黑白,就不能分辨到低那條線是那條了



將線條換個形式,這樣也滿漂亮的



在黑白的時候,也是可以分辨出那條是那條


如果點數不是很密的話,可以加上符號


會更清楚



變成黑白一樣清楚


為了改這些圖


我花了好一陣子在研究怎麼畫線比較清楚好看


oh~~


好累~


不過我的論文也整理得差不多了


173頁@@


上一版才104頁


寫這麼多頁真的就只有一個累字


但是我學到很多以前不會的東西


寫論文真的可以修心養性


因為坐在電腦前


除了安靜,還是安靜


matlab 畫圖

最近在寫論文,因為常需要用到matlab來畫圖


比較常用的畫圖指令是plotplotyy



w=0:2*pi/1000:2*pi
t1=sin(w);
t2=cos(w);
a=[t1' t2'];
t = 1:size(a,1);
plot(t,a(:,1),'kS',t,a(:,2),'rD--','linewidth',2);grid;
set(gca,'xlim',[0 1000]);
set(gca,'ylim',[-1 1]);
set(gca,'xtick',[0 200 400 600 800 1000]);
set(gca,'ytick',[-1 -0.5 0 0.5 1]);
title('這是抬頭')
xlabel('這是x座標')
ylabel('這是y座標')
legend('ideal','backward','forward','trapezoid','location','best');


 



 


w=0:2*pi/1000:2*pi
t1=sin(w);
t2=cos(w);
t3=w/2*pi
a=[t1' t2' t3' ]
h5 = figure(6);
set(h5,'color','white');
t = 1:size(a,1);
[ax,h1,h2] = plotyy(t,a(:,1:2),t,a(:,3));grid;
set(h1(1),'LineWidth',1,'LineStyle','-','Marker','o','color','b');
set(h1(2),'LineWidth',1,'LineStyle','--','Marker','*','color','k');
set(h2,'LineWidth',1,'LineStyle',':','Marker','s','color','r');
%set(h1,'LineWidth',2);
%set(h2,'LineWidth',2);
set(ax,'LineWidth',2)    %
xlabel('xlabel','FontSize', 12);
set(get(ax(1),'Ylabel'),'String','Left ylabel','FontSize', 12);
set(get(ax(2),'Ylabel'),'String','Right ylabel','FontSize', 12);
title('title' ,'FontSize', 12);
set(ax(1),'YLim',[-1 1])    %y座標
set(ax(1),'YTick',[-1 -0.5 0 0.5 1])  %grid
set(ax(1),'XLim',[0 1000])    %y座標
set(ax(1),'XTick',[0 200 400 600 800 1000])  %grid
legend(h1,'sine wave','cosine wave','Location','NorthWest');
legend(h2,'linear','Location','SouthEast');
set(ax(2),'YLim',[0 10])    %y座標
%set(ax(2),'YTick',[-1 -0.5 0 0.5 1])  %grid
set(ax(2),'XLim',[0 1000])    %y座標
%set(ax(2),'XTick',[0 200 400 600 800 1000])  %grid

 


 


這樣我就比較容易找指令了


ccccccccc


給有需要的人做參考


 


2010年3月8日 星期一

心態

很久沒有算那麼多數學了


我記得研一的時候有算過


後來就沒有了
可是什麼內容這麼重要?


其實,我在那部分下了一個結論:
「最後,我們不使用這樣的系統。」

看到這樣的結論,還會有動力想寫嗎?


這問題其實問了自己很多次


也問了老闆


這系統對於我來說,並不是很重要,有需要寫嗎?


老闆說:「那你的老鼠走進了死巷,要繼續跑嗎?」


呵~


或許我欠自己很多個交待


該做的總是要做


所以很久沒有因為公事這麼晚睡了


只為了這個「不重要」的篇幅



看來愈「不重要」的東西,愈是「重要」


因為在這個過程中,我最重要的收獲是,心態決定一切!