在開發 ARM 嵌入式系統時,常會覺得 GPIO 不太夠用。經我仔細了解 S 3C 6410 規格(SPEC) 後,經過一些改良設計,成功的擴充了 IO。我將這些擴充的GPIO,用來連接 16X2 LCD、SEG7 x 3、LEDx8、KEY x 8。同時間撰寫其驅動程式:16X 2 L CD驅動程式、、SEG7 x 3驅動程式、LEDx8驅動程式、KEY x 8驅動程式。總共 先擴充出 39 個IO,但這一技巧,不是僅能擴充少少的IO,而是經過 這一個設計後,是可擴充出多達上千上萬個 IO 出來。這一技巧最多僅用到一個 ARM-S3C6410 GPIO接腳,而這些被擴充出來的IO,其速度可以與CPU的BUS速度同步的喔^^
當 撰寫好 驅動程式與對應之應用程式,分別將其下載到 ARM-S3C6410 教學開發板後。首先在 超級終端機 上下達如下指令:
[root@S3C6410 /]# mknod /dev/LCD c 99 0
[root@S3C6410 /]# insmod /lib/modules/2.6.28.6-ARMS3C6410/lcd.ko
Hello, world
CYH's age=1
[root@S3C6410 /]# cd /tmp
[root@S3C6410 /tmp]# chmod 777 *
[root@S3C6410 /tmp]# ./lcdap.exe
您可以看到,在LCD 16x2 Device 上 第一行 show出 " Hello CYH^^ ",第二行 show 出 "Hello TCFST", 同時間 擴充出來的 8 個 LED作同時 "閃爍"/OnOff動作。另外,擴充出來接在 SEG7 x 3的裝置,分別 秀出 8。
以下圖示為在ARM - S3C6410 教學開發板上的執行結果:
我這裡同時分享此應用程式之程式碼:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
struct LCDStr
{
unsigned char STR[16];
int line;
};
int main( int a, char* b[] )
{
struct LCDStr STRL1,STRL2;
int fd = open ( "/dev/LCD", O_RDWR );
if( fd <=0 )
{
printf( "Open fail!!\r\n" );
return -1;
}
strcpy( STRL1.STR , "Hello CYH^^" );
STRL1.line = 1;
strcpy( STRL2.STR , "Hello TCFST" );
STRL2.line = 2;
write( fd , (void*)(&STRL1), sizeof(struct LCDStr) );
write( fd , (void*)(&STRL2), sizeof(struct LCDStr) );
close( fd );
return 0;
}
前輩你好....
回覆刪除小弟最近在S3C6410的晶片使用上剛好需要擴充 GPIO
所以想請教一些細節
請問你是用GPIO的哪一個PORT?
需要外加編解碼電路嗎?
擴充 GPIO可規劃成Input/Output,還是電路一開始就決定了呢?
您可以 透過 0918197988 與我聯繫
回覆刪除您可以 透過 0918197988 與我聯繫
回覆刪除Hi, 前輩您好
回覆刪除請問一隻腳擴充成多隻腳是如何擴充的呢?
以及中斷腳EINT一樣可以這樣擴充嗎?
謝謝.
江先生你好,本人使用ARM-M3 Texas Instrument -LM3S6969請問如何增加GPIO,是從記憶體位址嗎?
回覆刪除還請教如何擴充memory,謝謝!!
不好意思,本人e-mail沒附上bluekw810388@gmail.com
回覆刪除