顯示具有 A. IT技術分享 標籤的文章。 顯示所有文章
顯示具有 A. IT技術分享 標籤的文章。 顯示所有文章

2017年7月6日 星期四

添加新的Cortex Mx SoC[ STM32F系列]到mbed-OS IOT物聯網產品之mbed SDK Porting 移植技術課程

業界常常在做有關物聯網新產品開發時,採用ARM mbed OS物聯網開發平台,然目前 mbed online Compiler官網所提供的各廠家有支援 mbed 之SoC CPU,都是特定的型號。舉例: 意法半導體STMicroelectronics在其 STM32F10x 系列,僅提供STM32F103RB,且其周邊零件也僅是公板(型號: NUCLEO-F103RB)有支援的才有釋出對應的 mbed SDK。但產品開發在眾多因素下,均會有指定特定CPU型號與周邊IC零件。上述狀況需要mbed SDK Porting 移植技術,我在規劃一些技術課程時,是以自己在業界的研發經驗為基礎,輔以閱讀大量技術性文件與消化實作後,所產生的一系列課程。【ARM嵌入式物聯網系列:模組B】
IoT物聯網 mbed SDK Porting 移植技術與開發實戰精修班


即將開課,有興趣的人請參考。此課程內容是能直接在Keil裡面建立 mbed 的離線工程,匯入完整 mbed SDK原始碼,讓工程師完全掌握 mbed 底層技術,避開離線編譯 mbed SDK無法看到完整 mbed SDK原始碼的窘境,能夠隨意設置CPU型號,並有能力加入產品所需的周邊IC的SDK API,來加速物聯網產品的開發。


 

































【課程名稱】【ARM嵌入式物聯網系列:模組B】
IoT物聯網 mbed SDK Porting 移植技術與開發實戰精修班
 
 
★全台首開 結合專題實作 實務導向為主 ★贈送ARM-Cortex M3板子(價值5,000)
【課程代碼】06C004
【上課時間】7/16~8/13,每週日,9:00~18:00,共30小時[前二週上到17:00,後二週上到18:00] 
【課程主旨】RM 跟他的Partners目前已共同釋出具顛覆性的物聯網統一的開發平臺 mbed。該 mbed 物聯網統一的開發平臺是建立基於ARM的微控制器產品的,它可以讓以後物聯網開發者,無需「重複打造輪子」;物聯網產品開發者使用 ARM 架構的晶片、免費使用 mbed OS,然後最終直接基於 mbed SDK 開發應用層就可以,以此來加速開發和縮短產品的開發時程。但是就像 Embedded Linux、Android 一樣,目前 mbed 官網所提供的各廠家的支援 mbed 之CPU,都是特定的型號。舉例: 意法半導體STMicroelectronics在其 STM32F10x 系列,僅提供STM32F103RB,且其周邊零件也僅是公板(型號: NUCLEO-F103RB)有支援的才有釋出對應的 mbed SDK。但產品開發在眾多因素下,均會有指定特定CPU型號與周邊IC零件。本課程講授mbed SDK Porting 移植技術與開發實戰,讓學員能直接在Keil裡面建立 mbed 的離線工程,能夠隨意設置CPU型號,並有能力加入產品所需的周邊IC的SDK API,加速物聯網產品的開發。
【課程特色】1. 採用 ARM Keil工具,匯入完整 mbed SDK原始碼,讓學員完全掌握 mbed 底層技術,避開離線編譯 mbed SDK無法看到完整 mbed SDK原始碼的窘境。
2. 增加多項物聯網進階LAB實戰,以符合業界需求
3. 增加 mbed SDK程式連結網路功能,讓物聯網設備連接上乙太網路
【修課條件】1. 熟悉 C & C++ 語言與數位邏輯
2.建議上過【ARM嵌入式物聯網系列:模組A】嵌入式ARM-Cortex Mx系統開發韌體 實作實戰班
【課程大綱】1. ARM mbed 開發平臺與 mbed SDK 開發應用層
2. mbed SDK porting 移植技術
3. ARM Cortex Mx CMSIS Module
4. mbed HAL and API
5. mbed的 GPIO 數位輸入輸出與GPIO HAL module driver: ★【LAB】LED顯示與按鍵的使用 
6. mbed的 ADC/DAC與ADC/DAC HAL module driver:★【LAB】 ADC和DAC的使用
7. mbed的PWM輸出與PWM OUT API:★【LAB】PWM調光的運用
8. mbed GPIO中斷應用與HAL module driver:★【LAB】mbed中斷 控制運用
9. mbed 時鐘系統與Time HAL module driver:★【LAB】Time時鐘 系統的運用
10. mbed中的RTC與RTC HAL module driver:★【LAB】使用RTC作按 鍵防彈跳的運用
11. mbed UART通訊與UART/USART HAL module driver:★【LAB】 串列通訊綜合應用
12. mbed SPI通訊與SPI HAL module driver:★【LAB】SPI的運用 
13. mbed I2C通訊與I2C HAL module driver:★【LAB】I2C的運用 
14. mbed 電腦網路應用基礎、mbed TCP/UDP應用程式與mbed HTTP應用 程式設計
★【LAB】mbed 網路介面實驗(TCP/IP + Web Server+控制板上硬體 )



 


 






































【上課時數】30 小時
【上課地點】台北分部(台北市博愛路80號3樓)
【主辦單位】財團法人自強工業科學基金會
【課程費用】15500元 (超值優惠價格需送出報名表後,系統發出報名成功回函確認金額。)
【超值優惠】

  • VIP企業會員價:VIP企業會員可享優惠價格 (按我)

  • 會員優惠價: 會員於開課前七天完成報名繳費者可享會員優惠價 14500 元

  • 會員紅利折抵:本課程歡迎使用紅利折抵,最高可使用 200 點


【諮詢專線】02-23113316分機2287 林小姐 HCLin@tcfst.org.tw
【學員須知】報名與繳退費方法| 常見問題與解決會員紅利積點活動辦法
【注意事項】若已報名C003已有板子,可享有不含板子價錢12000(不可再折紅利點數),若不要板子 請務必來電告知02-23113316

  1. 若遇不可預測之突發因素,基金會保有相關課程調整、取消及講師之變動權。

  2. 無紙化環境,輕鬆達到減碳救地球,即日起16小時以上課程結業證書改以電子方式提供。

  3. 使用VIP廠商優惠之學員,上課當日報到時須查核該公司識別證(相關證明資料)。

  4. 會員紅利折抵限以原價或會員優惠價再折抵,其他方案不適用。

  5. 課前請詳閱簡章之課程內容或利用課程諮詢電話。

  6. 課程嚴禁旁聽,亦不可攜眷參與。




 


2013年5月29日 星期三

商業版要收費的FreeRTOS( FreeRTOS+ ),library 也要收費@@

看起來,只有除了FreeRTOS内核外,其他的都是收費的了


 他的商業License 部分宣告文,摘錄如下:


FreeRTOS+XXX  SL (C) 2013 HCC Embedded


The FreeRTOS+XXX  SL license terms are different to the FreeRTOS license terms.


FreeRTOS+XXX  SL uses a dual license model that allows the software to be used
under a standard GPL open source license, or a commercial license.  The standard
GPL license (unlike the modified GPL license under which FreeRTOS itself is
distributed) requires that all software statically linked with FreeRTOS+XXX  SL
is also distributed under the same GPL V2 license terms.  Details of both
license options follow:


- Open source licensing -
FreeRTOS+XXX SL is a free download and may be used, modified, evaluated and
distributed without charge provided the user adheres to version two of the GNU
General Public License (GPL) and does not remove the copyright notice or this
text.  The GPL V2 text is available on the gnu.org web site, and on the
following URL: http://www.FreeRTOS.org/gpl-2.0.txt.


- Commercial licensing -
Businesses and individuals that for commercial or other reasons cannot comply
with the terms of the GPL V2 license must obtain a commercial license before
incorporating FreeRTOS+XXX SL into proprietary software for distribution in any
form.  Commercial licenses can be purchased from http://shop.freertos.org/xxx_sl
and do not require any source files to be changed.


上文的 XXX,會是 FAT、TCP、UDP、IO... 等等,也就是 每一種應用,看來都要收費了。


2012年9月30日 星期日

How to Reset CentOS root Password and change the run level

There was the easy way to reset the root password for CentOS. Please follow this steps and you will be able to access your CentOS.
 
1. Reboot the CentOS machine
 2. When booting up, press any key to go into the select menu.
 3. The press ‘e’ to navigate to second grub.conf line (kernel)
 4. Once again press ‘e’ to edit the line and you can select one step from these option :
 ■ option 1 : 1 (’1′) at the end of the line. OR
 ■ option 2: S (‘S’) a the end of the line OR
 ■ option 3: add ‘single’ to “ro root=LABEL=/ single”
 
5. After edit, hit “ENTER”
 6. Press ‘b’ to reboot
 7. After reboot it will stop at ‘#’ command line.
 8. At ‘#’ command line, type ‘passwd’ to create new password.
 9. Reboot machine as usual
 10 Finish


As always if you need any help you can reach us on twitter @ehowstuff or drop us a comment below.


1) Login as root user
2) Open /etc/inittab file using vi text editor or gedit GUI text editor
3) Look for the default runlevel called initdefault which look like as follows:
id:3:initdefault:
Please note that an initdefault entry specifies the runlevel which, should be entered after system boot. If none exists, init will ask for a runlevel on the console. The process field is ignored. Note number 3 in above line defines default runlevel.
4) Replace runlevel 3 to 5:
5) Save the changes
6) Reboot linux to take effect.


2012年9月26日 星期三

tslib移植出現的小問題



. 編譯:

$export CC=/work/ebook/arm-linux-4.1.1/bin/arm-linux-gcc //toolchain
路徑

$./autogen.sh //
生成config

$export PATH=$PATH:/work/ebook/arm-linux-4.1.1/bin/

$echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache

$./configure --cache-file=arm-linux.cache --enable-inputapi=no
--prefix=/work/ts_lib_bin --host=arm-linux

$make




2.設備上運行

一些路徑設置:

#export QWS_MOUSE_PROTO=TPanel:/dev/input/event0

#export T_ROOT=/mnt/ts_lib_bin

#export LD_LIBRARY_PATH=$T_ROOT/lib

#export TSLIB_CONSOLEDEVICE=none

#export TSLIB_FBDEVICE=/dev/fb0

#export TSLIB_TSDEVICE=/dev/input/event0

#export TSLIB_CALIBFILE=$T_ROOT/etc/pointercal

#export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf

#export TSLIB_PLUGINDIR=$T_ROOT/lib/ts

#./ts_calibrate




問題1:

./ts_calibrate: error while loading shared libraries: libts-0.0.so.0: cannot
open shared object file: Error 40

./ts_calibrate: error while loading shared libraries: libts-0.0.so.0: cannot
ope

n shared object file: No such file or directory

解決辦法:

#echo $LD_LIBRARY_PATH //
查看lib路徑,

#export LD_LIBRARY_PATH=$T_ROOT/lib




問題2

ts_open: No such file or directory

解決辦法:

#export TSLIB_TSDEVICE=/dev/input/event0 //
觸控式螢幕設備路徑




問題3

Couldnt open tslib config file: No such file or directory ts_config: Illegal
seek

解決辦法:

#export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf




問題4

Couldnt load module pthres

No raw modules loaded.

ts_config: Success

解決辦法:

#export TSLIB_PLUGINDIR=$T_ROOT/lib/ts

問題5

No raw modules loaded.

Ts_config: No such file or directory

解決辦法:

修改$T_ROOT/etc/ts.conf,
至少放開一個module_raw,
並去掉前面空格




問題6:




通過autogen生成過設定檔:configure,移到另一台機器,重新運行./configure出錯,解決辦法:




重新設置gcc路徑,如:




$export
CC=/work/ebook/arm-linux-4.1.1/bin/arm-linux-gcc //toolchain
路徑




$rm
arm-linux.cache




$export
PATH=$PATH:/work/ebook/arm-linux-4.1.1/bin/

$echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache

$./configure --cache-file=arm-linux.cache --enable-inputapi=no
--prefix=/work/ts_lib_bin --host=arm-linux

$make




$make
install




 





2012年9月12日 星期三

電平信號在PCB上的傳播速度



下面內容節錄自 Internet: 




電信號在真空中的傳播速度是光速,3 *
10^8 m/s or 11.8 inch/ns
,在其他的介質中,如果相對介電係數是Er ,則傳播速度為 11.8 * Er^0.5。例如,在水中,水的相對介電係數是80,所以,傳播速度是真空中的1/9 ,即11.8 / 80^0.5




PCB中,FR4的相對介電係數約為4,所以,傳播速度是真空中的一半,即11.8 / 4 ^0.5 = 5.9 inch/ns,對於兩個200Msin wave號,如果trace的長度相差200mil,則信號從driver到達receiver的時間相差:200 / 5900 = 0.034ns;200M的信號每個週期的時間為5ns




所以,判斷200mil的線長誤差的依據在於這個0.034ns的時間差能否引起時序問題。




---------------------------------------------------------------------




時間的單位換算 1=1000毫秒(ms) 1毫秒=11,000(s) 1=1,000,000
微秒(μs) 1微秒=11,000,000(s) 1=1,000,000,000 納秒(ns) 1納秒=11,000,000,000(s)
1
=1,000,000,000,000 皮秒(ps) 1皮秒=11,000,000,000,000(s)




---------------------------------------------------------------------




信號在pcb走線上傳輸需要一定的時間,普通FR4板材上傳輸時間約為每納秒6英寸,當然表層走線和內層走線速度稍有差別。




試驗中發現的經驗資料為,當信號在pcb走線上的時延高於信號上升沿的20%時,信號會產生明顯的振鈴。對於上升時間為1ns的方波信號來說,pcb走線長度為0.2*6=1.2inch以上時,信號就會有嚴重的振鈴。所以臨界長度就是1.2inch,大約3cm




---------------------------------------------------------------------




FR4板材信號速度為6in/ns:這樣計算出來的




Vp= V/sqrt(Er)




ErFR4的介電常數




V是光速




VpFR4的介電常數。





2012年8月8日 星期三

在Keil C51函數中加入ASM代碼

在Keil C51函數中加入ASM代碼

方法如下:


預處理指令 #pragma asm 開始ASM代碼
預處理指令 #pragma endasm 結束ASM代碼


如果就這樣直接編譯的話,會出現以下錯誤:
error Cxxx : 'asm/endasm' requires src-control to be active


解決方法:在 Files Toolbar 中選中當前C51文件,點右鍵查看文件選項,將
Generate Assembler SRC File Assemble SRC File 的勾選由灰色變為黑色,即使這兩項有效!




這時進行編譯沒有問題,但是Link時產生了兩個警告:
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL


解決方法是需要在 Source Group 中添加一個 LIB 文件,根據專案的內容不同有所區別:
C51S.LIB - 沒有浮點運算的 Small model
C51C.LIB - 沒有浮點運算的 Compact model
C51L.LIB - 沒有浮點運算的 Large model
C51FPS.LIB - 帶浮點運算的 Small model
C51FPC.LIB - 帶浮點運算的 Compact model
C51FPL.LIB - 帶浮點運算的 Large model


LIB 方件在 Keil 安裝目錄下的 \C51\LIB\ 目錄中。


只是加入組合語言碼後, 需要特別注意到 堆疊、 指標、 跟暫存器的值, 儘量能保持一致。
而且不要用絕對位址去改變參數等資料、避免 C 的參照改變。


2012年7月21日 星期六

inf創建與修改須知



inf添加新類硬體需要修改項(充分非必要條件)




1。類別項(Class




2。硬體廠商(Manufacturer




3。硬體設備號




4。各字串項(ProviderNameMfgNameDeviceDescDeviceClassNameSvcDesc




5。在[YouMark_DDI.Services]項中改為現有檔案名




6。硬體廠商節中後續各項均不要有NT




;--------- Version Section
---------------------------------------------------




[Version]




 




Signature="$CHICAGO$";




 




Provider=zenghui41




 




DriverVer=12/31/2010,3.0.0.3




 




 




 




; If device fits one of the standard
classes, use the name and GUID here,




 




; otherwise create your own device class
and GUID as this example shows.




 




 




 




Class=zenghui41_01




 




ClassGUID={B526F264-9C58-445a-9358-4529C1579B8E}




 




 




 




 




 




;--------- SourceDiskNames and
SourceDiskFiles Section -----------------------




 




 




 




; These sections identify source disks and
files for installation. They are




 




; shown here as an example, but commented
out.




 




 




 




[SourceDisksNames]




 




0 = "SCUT"




 




 




 




[SourceDisksFiles]




 




HelloWDM.sys = 0,\Windows驅動開發技術詳解[1]\Windows驅動開發技術詳解\chapter15\Test5\NT_Driver\MyDriver_Check,




 




 




 




;--------- ClassInstall/ClassInstall32
Section -------------------------------




 




 




 




; Not necessary if using a standard class




 




 




 




; NT Style




 




[ClassInstall32]




 




Addreg=Class_AddReg




 




 




 




[Class_AddReg]




 




HKR,,,,%DeviceClassName%




 




HKR,,Icon,,"-5"




 




 




 




;--------- DestinationDirs Section
-------------------------------------------




 




 




 




[DestinationDirs]




 




YouMark_Files_Driver = 12




 




 




 




;--------- Manufacturer and Models Sections
----------------------------------




 




 




 




[Manufacturer]




 




%MfgName%=Mfg4110




 




 




 




[Mfg4110]




 




 




 




; PCI hardware Ids use the form




 




;
PCI\VEN_aaaa&DEV_bbbb&SUBSYS_cccccccc&REV_dd




 




;改成你自己的ID




 




%DeviceDesc%=YouMark_DDI,
PCI\VEN_4444&DEV_4444




 




 




 




;---------- DDInstall Sections
-----------------------------------------------




 




 




 




[YouMark_DDI]




 




CopyFiles=YouMark_Files_Driver




 




; --------- Windows NT -----------------




 




 




 




 




 




 




 




[YouMark_DDI.Services]




 




Addservice = HelloDDK, 0x00000002,
YouMark_AddService




 




 




 




[YouMark_AddService]




 




DisplayName = %SvcDesc%




 




ServiceType = 1 ; SERVICE_KERNEL_DRIVER




 




StartType = 3 ; SERVICE_DEMAND_START




 




ErrorControl = 1 ; SERVICE_ERROR_NORMAL




 




ServiceBinary =
%10%\System32\Drivers\HelloDDK.sys




 




 




 




 




 




 




 




; --------- Files (common) -------------




 




 




 




[YouMark_Files_Driver]




 




HelloDDK.sys




 




 




 




;--------- Strings Section
---------------------------------------------------




 




 




 




[Strings]




 




ProviderName="zenghui_01"




 




MfgName="zenghui_01"




 




DeviceDesc="Hello World DDK_01!"




 




DeviceClassName="zenghui_Device_01"




 




SvcDesc="zenghui_01"





2012年7月14日 星期六

Keil於Cortex M Project LINK時出現 Undefined symbol __BASEPRICONFIG (referred from stm32f10x_nvic.o),解決方法

linking... 時出現如下ERROR時,
..\out\ObjFlash\BHS-STM32-FLASH.axf: Error: L6218E: Undefined symbol __BASEPRICONFIG (referred from stm32f10x_nvic.o).
..\out\ObjFlash\BHS-STM32-FLASH.axf: Error: L6218E: Undefined symbol __GetBASEPRI (referred from stm32f10x_nvic.o).
..\out\ObjFlash\BHS-STM32-FLASH.axf: Error: L6218E: Undefined symbol __RESETFAULTMASK (referred from stm32f10x_nvic.o).
..\out\ObjFlash\BHS-STM32-FLASH.axf: Error: L6218E: Undefined symbol __RESETPRIMASK (referred from stm32f10x_nvic.o).
..\out\ObjFlash\BHS-STM32-FLASH.axf: Error: L6218E: Undefined symbol __SETFAULTMASK (referred from stm32f10x_nvic.o).
..\out\ObjFlash\BHS-STM32-FLASH.axf: Error: L6218E: Undefined symbol __SETPRIMASK (referred from stm32f10x_nvic.o).
..\out\ObjFlash\BHS-STM32-FLASH.axf: Error: L6218E: Undefined symbol __WFE (referred from stm32f10x_pwr.o).
..\out\ObjFlash\BHS-STM32-FLASH.axf: Error: L6218E: Undefined symbol __WFI (referred from stm32f10x_pwr.o).


 


請將 cortexm3_macro.s 也要 加入,即可解決


2012年6月28日 星期四

ucos-II訊息佇列處理多按鍵



上一次採用信號量的方式處理一個按鍵,採用發送和等待信號量的方式來實現該按鍵的掃描。但是如果系統有多個按鍵需要處理呢?是否還可以用信號量呢?當然其實也可以的,多個按鍵就創建對個信號量唄!這樣處理可是可以,不過很繁瑣。本文介紹另外一種處理方案:採用訊息佇列的方式。將每一個按鍵對應一條消息,當某個按鍵按下時,就發送該按鍵的消息到訊息佇列:OSQPost(KeyQEvent, Qmsg_KA);然後在按鍵處理任務重一直調用q_keymsg
= (INT8U*)OSQPend(KeyQEvent,10,&err);
讀取訊息佇列,也就是判斷該函數的返回值是否是按鍵消息Qmsg_KA,如果是則相應,如果不是則延時任務。




/*訊息佇列相關變數定義初始化-------------------------------------------------*/

OS_EVENT *KeyQEvent; /*
定義訊息佇列的事件控制塊,用於接收訊息佇列返回值,如果訊息佇列


創建成功,則返回一個指標,這個指標用於以後對訊息佇列的操作

因此,該指標可以看做是相應訊息佇列的控制碼。

QEvent = OSQCreate(&Qstart[0],10); */

INT8U err; /*
定義訊息佇列的錯誤變數 OSQPend(QEvent,2000,&err);接收消息等待錯誤*/

void *Qstart[10]; /*
定義訊息佇列的指標陣列,可容納10則消息
*/

INT8U *Qmsg_KA = "KeyA"; /*
定義一則消息,
*/

INT8U *Qmsg_KB = "KeyB"; /*
定義一則消息,*/




KeyQEvent = OSQCreate(&Qstart[0],10); /* 創建一個訊息佇列,可容納10則消息*/




void TaskKeyScan(void * pdata)/*按鍵掃描任務*/

{

INT8U KeyAState;

INT8U KeyBState;




INT8U keyA_release = 0;

INT8U keyB_release = 0;




pdata = pdata;

for(;;)

{

OSTimeDlyHMSM(0,0,0,50);




KeyAState = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13); /* 按鍵按下返回 0 */

KeyBState = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2); /*
按鍵按下返回
1 */

/*
按鍵KEYA有效
--------------------*/

if (KeyAState == 0)

{

OSTimeDlyHMSM(0,0,0,20);/*20ms
去抖動
*/

KeyAState = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13);

if (KeyAState == 0)

{

keyA_release = 1;

}

}

if (KeyAState == 1 && keyA_release == 1) /*
本次按鍵有效
*/

{

OSQPost(KeyQEvent, Qmsg_KA); /*
發送按鍵KEYA被按下消息
*/

keyA_release = 0; /*
按鍵釋放標識清除
*/

printf( "Post\n" );

}




/*按鍵KEYB有效---------------------*/

if (KeyBState == 1)

{

OSTimeDlyHMSM(0,0,0,20);

KeyBState = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2);

if (KeyBState == 1)

{

keyB_release = 1;

}

}

if (KeyBState == 0 && keyB_release == 1) /*
本次按鍵有效
*/

{

OSQPost(KeyQEvent, Qmsg_KB);/*
發送按鍵KEYB被按下消息
*/

keyB_release = 0; /*
按鍵釋放標識清除
*/

printf( "Post\n" );

}



}

}




void TaskLed(void * pdata)/* 按鍵相應任務*/

{

INT8U *q_keymsg;

pdata = pdata;



for(;;)

{

q_keymsg = (INT8U*)OSQPend(KeyQEvent,10,&err);/*
掃描訊息佇列
*/

if(err == OS_NO_ERR)

{

if(q_keymsg == Qmsg_KB)/*
如果按鍵B被按鍵,則相應相關處理函數
*/

{

LED4_TOGGLE();

Num ++;

}

else if(q_keymsg == Qmsg_KA) /*
如果按鍵A被按鍵
*/



{

LED4_TOGGLE();

Num --;

}

}

}

}




 





uC/OS信號量用於簡單的按鍵掃描



首先,當然要給按鍵掃描創建一個任務: OSTaskCreate(TaskKeyScan, (void * )0,
(OS_STK *)&TASK_KEY_STK[KEY_STK_SIZE-1], 23);

其次,創建一個信號量,賦值為0表示一個或者多個事件的發生,在這裡表示按鍵按下這個事件:SemEvent = OSSemCreate(0);




然後,就是按鍵任務的代碼,如下:




void TaskKeyScan(void * pdata)

{

INT8U KeyAState; /*
讀取按鍵值
*/

INT8U key_press = 0;

pdata = pdata;

for(;;)

{

OSTimeDlyHMSM(0,0,0,20); /*
每隔20ms掃描一次按鍵 */




KeyAState = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2); /* 按鍵按下返回 1 */

if (KeyAState == 1)

{

OSTimeDlyHMSM(0,0,0,20); /* 20ms
去抖動
*/

KeyAState = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2);

if (KeyAState == 1)

{

key_press = 1; /*
按鍵確認標識置位元
*/

}

}

if (KeyAState == 0 && key_release == 1) /*
本次按鍵有效
*/

{

OSSemPost(SemEvent); /*
發送信號量
*/

key_press = 0; /*
清除按鍵確認標識
*/

printf( "Post\n" );

}




}




}




最後,在另外的任務中回應按鍵,執行按鍵操作(使LED燈翻轉):




void TaskLed(void * pdata)

{

pdata = pdata;

for(;;)

{




OSSemPend(SemEvent,10,&err); /* 掛起任務,等待信號量到來。設置100ms超時 ,如果超時則執行任務其他代碼 */

if(err == OS_NO_ERR)

{

LED_TOGGLE();

}




/*----other code----*/




}




}




以上是在作業系統中對單純的一次按鍵操作的處理代碼。類似於裸機上的查詢處理,但相比於裸機上的查詢又更有優勢之處,在等待按鍵釋放動作處理上顯示其節省CPU資源的獨特之處。另外,在嵌入式系統中,按鍵的處理不單純的限制於這種一次按鍵操作,另外還有三類:1、按鍵的短擊與連擊(音樂播放的下一曲與快進);2、按鍵的短擊與長擊(手機應用程式的退出與手機的關機);3、按鍵的按一下與按兩下。這三類按鍵動作在嵌入式設備中尤為常見,實現了少按鍵多功能,節省了有限資源。對於程式設計來說,嵌入式系統給我們的多工程式設計思想,又使得對於這類的按鍵處理也顯得較為容易,多數採用狀態機(SM)的思想,至於如何在程式中實際實現,這裡就不再討論,本文主要核心是說明如何使用信號量來簡單處理按鍵的動作以及回應。





使用 SPI BUS 控制 74HC595 來驅動 8xLED 燈-範例轉貼



使用 SPI BUS 控制 74HC595 來驅動 8xLED 燈。程式碼如下:


#include "config.h"
#define SPI_CS (1 << 16) // P0.16 為CS腳
#define CE_Low() (IO0CLR |= SPI_CS) // 選中從器件
#define CE_High() (IO0SET |= SPI_CS)
/* 流水燈花樣,0亮,注意調用時候用 ! 操作 */
const uint32 LED_TBL[] =
{
 0x00, 0xFF, // 全部熄滅後,再全部點亮
 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, // 依次逐個點亮
 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, // 依次逐個疊加
 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, // 依次逐個遞減
 0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81, // 兩個靠攏後分開
 0x81, 0xC3, 0xE7, 0xFF, 0xFF, 0xE7, 0xC3, 0x81 // 從兩邊疊加後遞減
};
/***********************************************************
** 函數名稱: Delay
** 函數功能: 長軟體延時
** 入口參數: dly 延時參數,值越大,延時越久
** 出口參數: 無
************************************************************/
void Delay(uint32 dly)
{
 uint32 i = 0;
 for (; dly > 0; dly--)
  for (i = 0; i < 50000; i++);
}
/**********************************************************
** 函數名稱: SPIInit
** 功能說明: 初始化LPC2300系列ARM的SPI引腳及寄存器
** 入口參數: 無
** 出口參數: 無
************************************************************/
void SPIInit(void)
{
 /* 初始化SPI引腳 */
 PINSEL0 = 0;
 IO0DIR |= SPI_CS; // 設置SPI的片選引腳
 PINSEL0 |= 0xc0000000; // 設置P0.15腳為SCK腳
 PINSEL1 = (0x03 << 2) | (0x03 << 4); // 設置P0.17、P0.18引腳為SPI引腳


 /* 初始化SPI寄存器 */
 S0SPCCR = 0x48; // 設置SPI時鐘分頻
 S0SPCR = (0 << 2) | // SPI控制器每次傳輸發送和接收8位元資料。
 (0 << 3) | // CPHA = 0, 資料在SCK 的第一個時鐘沿採樣
 (0 << 4) | // CPOL = 0, SCK 為高有效
 (1 << 5) | // MSTR = 1, SPI 處於主模式
 (1 << 6) | // LSBF = 0, SPI 資料傳輸MSB (位7)在先
 (0 << 7); // SPIE = 0, SPI 中斷被禁止
}
/********************************************************************
** 函數名稱: SPISndByte
** 函數功能: 通過硬體SPI介面發送一個位元組
** 入口參數: data
** 出口參數: 無
********************************************************************/
void SPISndByte(uint8 data)
{
 uint32 temp = 0;
 CE_Low();
 S0SPDR = data;
 while (0 == (S0SPSR & 0x80)); // 等待SPIF置位元,即等待資料發送完畢
 temp = S0SPSR; // 通過讀S0SPSR,清除SPIF標誌
 CE_High();
}
/**************************************************************
** 函數名稱: main
** 函數功能: 用SPI驅動流水燈顯示
** 入口參數: 無
** 出口參數: 返回0則表明程式出錯
** 調試說明: 需用杜邦線將P0.15~P0.18分別與SCLK、/CS、MISO、MOSI短接。
***************************************************************/
int main(void)
{
 uint32 i = 0;


 SPIInit();


 while (1)
 {
  for (i = 0; i < 42; i++)
  {
   Delay(20);
   SPISndByte(LED_TBL[i]);
  }
 }
 return (0);
}


2012年6月11日 星期一

教你如何把書上的字弄到電腦上面來



把書上的字快速弄到電腦上,我也會,哇哇。。。 在工作中,我常常在想,要是能把紙上有用的文字快速輸入到電腦中,不用打字錄入便可以大大提高工作效率該有多好呀!隨著科技的發展, 這個問題在不斷的解決,例如,現在市場上的掃描器就帶有OCR軟體,可以把掃描的文字轉換到電腦中進行編輯。但是,對於我們平常人來說,大多數人都是即不想多花錢購買不常用的設備,又不想費力氣打字錄入,那我就給大家提供一個我剛剛發現的方法吧!現在數碼相機很普遍,也很常用,我們就從這裡下手吧。

工具準備:

硬體: 電腦一台 數碼相機

軟體: word2003(其它的版本我沒有實驗)

doPDF
(百度可以搜索下載,是一款免費的PDF製作軟體)

AJViewer
軟體(在百度可以搜索下載,是一款免費的閱讀器)

步驟:

1
、在電腦中安裝 doPDFAJViewer

2
、用數碼相機把需要的文字拍下來(相機和照像水準就不多談了。照片效果越好,可以大大縮小轉換文字的誤差率)

例如:































3
、在word中插入你用數碼相機照的書上的文字(打開word——插入功能表——圖片——來自檔——選擇照片——插入)

4
、在word中選擇檔功能表——列印——在印表機選項中選擇doPDF——確定——點擊流覽選項——選擇檔保存的位置和填寫檔案名稱——保存——確定

5
、按照上面的步驟,電腦會自動打開AJViewer軟體,若沒有自動打開該軟體,可以自己打開AJViewer軟體,然後在AJViewer中打開剛剛轉換的PDF檔。

6
、選擇AJViewer中的









,然後在需要的文字部分拖動滑鼠畫出虛線。

7
、點擊發送到word按鈕,就可以轉換成word檔了。可以編輯了。

67步驟圖片如下:









 













要點提示:

1、照片一定要平整,最好對比強烈。(

最最關鍵的部分)

2、用doPDF生成PDF檔不只一種用法,你也可以選擇其它更好、更便捷的方法,這裡只提供我本此的實驗軟體。

3、如果熟練的使用我的方法,用不了一分鐘就可以轉出若干的文字,大大提高了工作效率。

4、切記:輸出的文字一定要校對呀!





FPGA Verilog 的學習經驗,提供給要入門的新手

今天簡單說說 FPGA Verilog 的學習經驗,提供給要入門的新手: 1.對自己寫的FPGA Verilog程式,所生成的數位電路要心中有數。 這一點個人認為很重要,就正如寫 C語言,心中要能生成對應的組合語言一樣,我是這樣要求自己的。 雖然 FPGA Verilog語言...