亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

ARM:LED控制編程、電路原理、CPU數據手冊、位運算、交叉編譯

2019-11-14 09:15:21
字體:
來源:轉載
供稿:網友
一、LED控制編程1、電路原理圖    【底板】env/DataSheet/x6818bv2.pdf      如果讓LED1亮(D25),找到'對應標號'為GPIOC12為低電平      反之--------------------------------------高電平    【核心板】env/DataSheet/x4418cv3_release20150713.pdf      在核心板里面'搜索標號'GPIOC12      找到GPIOC12'導線接到對應CPU的管腳'W15上,或者說接到 CPU GPIOC12管腳上。問題:    運行在ARM CORE (CPU)中的程序如何才能控制GPIOC12管教上電平的變化?答案:    在CPU的說明書里面 DataSheet 文件夾中    :SEC_S5P6818X_Users_Manual_PReliminary_Ver_0.00.pdf <第16章>2、CPU數據手冊--->P 56.   ' I/O Function Description    CPU上一共有 537 個管腳,<第16章>可用于通用GPIO的有 160 個管腳。--->P 68.        W15 - Alternate Function1[功能1] - GPIOC12 - I/O>>硬件工程師使用CPU芯片時,關注CPU上的管腳>>軟件工程師使用CPU芯片時,關注'CPU內部的特殊功能寄存器'(register)>>每隔特殊功能寄存器都是32bit' GPIO[X]00  ---> CPU手冊GPIOx 00pin--->P 757. - 16.5.1.8 GPIOxALTFN0    GPIOCALTFN0 - bit[25:24] - 01=Function1 [01=功能1,即對應I/O功能]    Address: 0xc001c020--->P 745. - 16.5.1.2 GPIOxOUTENB    GPIOCOUTENB - bit[12] - 1=Output Mode [0/1=輸入/輸出功能]    Address: 0xc001c004--->P 745. - 16.5.1.1 GPIOxOUT    GPIOCOUT - bit[12] - 1=High Level [0/1=輸出低/高電平]    Address: 0xc001c0003、C語言回顧 - register    register 關鍵字    register int i;  // int i; 默認在內存數據段中,加register關鍵字就把變量i的這所占4個字節的存儲空間放在CPU的寄存器中,可以加快變量i的訪問速度3.1 C語言指針
    int a = 100;    * (&a) = 100;    0xc001c000   // 常量    (int*)0xc001c000   // 地址    * ((int*)0xc001c000) = 0x100;   // 寫入數據,按int-4字節寫入0x100volatile 的作用,以及哪種場合需要使用該關鍵字?(課后查資料)>>表示'一個變量也許會被后臺程序意想不到的修改'。變量如果加了volatile修飾,則會從內存重新裝載內容,而不是直接從寄存器拷貝內容。volatile可以保證對特殊地址的穩定訪問。>>寄存器地址要加volatile修飾,主要是因為寄存器里面的值是隨時變化的。    我們讀取數據的時候,CPU直接到內存里面取值,而不是到cache里面。    1) 并行設備的硬件寄存器;    2) 中斷服務子程序中會訪問到的非自動變量;    3) 多線程應用中被及格任務共享的變量;

例如:

    volatile int i = 10;    int a = i;    // 其他代碼,并未告訴編譯器,對i進行過操作    int b = i;"volatile 指出i是隨時可能發生變化的,每次使用它的時候必須從i的地址中讀取,因而編譯器生成的匯編代碼會重新從i的地址讀取數據放在b中。而優化做法是,由于編譯器發現兩次從i讀數據的代碼之間的代碼沒有對i進行過操作,它會自動把上次讀的數據放在b中。而不是重新從i里面讀,這樣以來,如果i是一個寄存器變量或者表示一個端口數據就容易出錯,所以說 volatile 可以保證特殊地質的穩定訪問。"

    // 訪問特殊功能寄存器的時候需要加 volatile 關鍵字,正確的寫法:    a = * ((volatile unsigned int*)0xc001c000);    // 下面此條做法,不但將bit12清0,也導致其他的bit被清0了,錯誤??!    * ((volatile unsigned int*)0xc001c000) = 0x00;3.2 位運算    假設需要將 0xc001c020 寄存器的[25:24]bit位設置為 01 ,
    * ((volatile unsigned int*)0xc001c020) &= ~(0x03000000);  // 第一步    // 32bit :             xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx     // 0x03000000          0000 0011 0000 0000 0000 0000 0000 0000    // ~(0x03000000)       1111 1100 1111 1111 1111 1111 1111 1111    // &= ~(0x03000000)    xxxx xx00 xxxx xxxx xxxx xxxx xxxx xxxx    * ((volatile unsigned int*)0xc001c020) |= 0x01000000;  // 第二步    //  32bit : xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx     //                 01 ([25:24]bit)    //        0x0______01_0____0____0____0____0____0    "實際做法:"    * ((volatile unsigned int*)0xc001c020) &= ~(3<<24);  // 第一步    * ((volatile unsigned int*)0xc001c020) |= (1<<24);  // 第二步<tips>$:'file a.out// file 命令可以用來分析文件的一些屬性。x86-64 是x86的64位平臺運行。4. 編碼    vi led.c
/** 代碼演示 **/#define  GPIOC_OUT     *((volatile unsigned int*)0xc001c000)#define  GPIOC_OUTENB  *((volatile unsigned int*)0xc001c004)#define  GPIOC_ALTFN0  *((volatile unsigned int*)0xc001c020)void delay (unsigned int); void led_test (void) {    // 配置對應管腳為GPIO功能    GPIOC_ALTFN0 &= ~ (3 << 24); // clear bit 24,25    GPIOC_ALTFN0 |= (1 << 24); // set bit 24    // 選擇為輸出功能    GPIOC_OUTENB |= (1 << 12); // OUTPUT    while (1) {        // 亮 - 輸出低電平        GPIOC_OUT &= ~ (1 << 12); // clear bit 12        delay (0x1000000);        // 滅 - 輸出高電平        GPIOC_OUT |= (1 << 12); // set bit 12        delay (0x1000000);    }}// delay函數的實現不能放前面,只能先聲明后實現void delay (unsigned int n) {    unsigned int i = 0;    for (i = n; i != 0; i--); // CPU執行空操作來耗時}

5. arm編譯器

5.1 安裝arm交叉編譯器>>位置:/home/tarena/workdir/arm-linux-gcc/    'arm-cortex_a9-eabi-4.7-eglibc-2.18.tar.gz    權限不夠時解決方法:    1> $:' sudo ...    2> $:' sudo chmod +w /opt/ -R    3> $:' sudo chmod 777 /opt/ -R    // 將交叉編譯器tar包文件拷貝到/opt/下,在此文件夾下解壓縮    $:'cd ~/opt/    $:'sudo cp ~/workdir/arm..<table>/arm... .tar.gz .    $:'sudo tar xvf *.gz>>位置:/opt/arm-cortex_a9-eabi-4.7-eglibc-2.18/bin/    'arm-cortex_a9-linux-gnueabi-gcc    $:'vi ~/.bashrc>>添加:<shift + g> // 添加到文件尾    'PATH=$PATH:/opt/arm-cortex_a9-eabi-4.7-eglibc-2.18/bin    $:'source ~/.bashrc5.2 編譯程序希望編譯出來的程序不使用共享庫 (因為是裸板)    1)編譯    $:'arm-cortex_a9-linux-gnueabi-gcc -c -nostdlib led.c -o led.o    2)連接    $:'arm-cortex_a9-linux-gnueabi-ld -nostdlib -nostartfiles -Ttext=0x48000000 -eled_test led.o -o led        // -no stdlib 不連接標準庫文件        // -no startfiles 不連接系統標準啟動文件        // -Ttext 指定代碼段的起始地址        // -e 指定入口點函數,默認找_start    3)去掉附加信息,生成二進制文件    $:'arm-cortex_a9-linux-gnueabi-objcopy -O binary led led.bin    $:' file led.bin<tips>$:'arm-cortex_a9-linux-gnueabi-readelf -d a.out// 顯示可執行文件a.out文件中所需的共享庫.so信息$:'arm-cortex_a9-linux-gnueabi-objdump -S led// 反匯編的命令,查看文件的具體的函數及信息6. 下載運行:  X6818# 命令行    $:' cp led.bin /tftpboot/    X6818#:'tftp 48000000 led.bin   // uboot下數字都識別為十六進制    X6818#:' go led.bin<tips>執行tftp 48000000 led.bin 時 Ubuntu-server報 T..T..T...時需重啟服務器:$:'sudo /etc/init.d/tftpd-hpa restart補充:編程錯誤>>語法錯誤:    '只關注只解決第一個錯誤。邏輯錯誤:    ' printf / gdb    1. 是不是硬件問題?        env/led.bin放進去,燈亮硬件沒問題(或者換到別人電腦上試一試)    2. 如果是軟件問題,怎么查?        修改led.c的邏輯        讓對應管腳一直輸出高電平        拿萬用表量一下對應的管腳上是否是高電平。env/BCompare-3.3.4.14431.zip   // 工具,對比文件夾和文件里面不同之處<tips>vi中的命令模式下:e ../xxx.c    // 在vi中直接打開別的文件練習:    1. LED1和LED2交替閃爍。(理清楚今天的整個流程,看手冊,理流程)    2. beep蜂鳴器的控制管腳相關數據準備:'led1 - GPIOC12 - W15 - Function1    GPIOCALTFN0 - 0xc001c020 - bit[25:24] - 01=Function1 (I/O功能)    GPIOCOUTENB - 0xc001c004 - bit[12] - 1=Output Mode (輸出功能)    GPIOCOUT - 0xc001c000 - bit[12] - 1=High Level (0/1 低高電平)'led2 - GPIOC7 - AE21 - Function1    GPIOCALTFN0 - 0xc001c020 - bit[15:14] - 01    GPIOCOUTENB - 0xc001c004 - bit[7] - 1    GPIOCOUT - 0xc001c000 - bit[7] - 1'led3 - GPIOC11 - W14 - Function1    GPIOCALTFN0 - 0xc001c020 - bit[23:22] - 01    GPIOCOUTENB - 0xc001c004 - bit[11] - 1    GPIOCOUT - 0xc001c000 - bit[11] - 1'led4 - GPIOB26 - MCU_SPI_WP AC25 - Function1 (暫略)
/** 代碼演示 **/#define GPIOC_ALTFN0  *((volatile unsigned int*)0xc001c020)#define GPIOC_OUTENB  *((volatile unsigned int*)0xc001c004)#define GPIOC_OUT     *((volatile unsigned int*)0xc001c000)void delay (unsigned int);void led_run (void) {    // 配置GPIOC管腳    // led1 25:24    GPIOC_ALTFN0 &= ~ (3 << 24);    GPIOC_ALTFN0 |= (1 << 24);    // led2 15:14    GPIOC_ALTFN0 &= ~ (3 << 14);    GPIOC_ALTFN0 |= (1 << 14);    // led3 23:22    GPIOC_ALTFN0 &= ~ (3 << 22);    GPIOC_ALTFN0 |= (1 << 22);    // 設置輸出功能    GPIOC_OUTENB |= (1 << 12);    GPIOC_OUTENB |= (1 << 11);    GPIOC_OUTENB |= (1 << 7);     for (;;) {        GPIOC_OUT &= ~ (1 << 12); // led1        delay (0x800000);        GPIOC_OUT &= ~ (1 << 11); // led2         delay (0x800000);        GPIOC_OUT &= ~ (1 << 7); // led3        delay (0x800000);        GPIOC_OUT |= (1 << 12);         delay (0x800000);        GPIOC_OUT |= (1 << 11);         delay (0x800000);        GPIOC_OUT |= (1 << 7);         delay (0x800000);    }   }void delay (unsigned int n) {    unsigned int i;    for (i = n; i; --i);}

    2. beep蜂鳴器的控制' beep蜂鳴器 - PWM2[GPIOC14] - AD12 - Function2    GPIOCALTFN0 - 0xc001c020 - bit[29:28] - 10=Function2 (I/O功能)    GPIOCOUTENB - 0xc001c004 - bit[14] - 1=Output Mode (輸出功能)    GPIOCOUT - 0xc001c000 - bit[14] - 1=High Level (0/1 低高電平)

/** 代碼演示 **/#define GPIOC_ALTFN0  *((volatile unsigned int*)0xc001c020)#define GPIOC_OUTENB  *((volatile unsigned int*)0xc001c004)#define GPIOC_OUT     *((volatile unsigned int*)0xc001c000)void delay (unsigned int);void beep_run (void) {    // 配置GPIO管腳    GPIOC_ALTFN0 &= ~(3 << 28);    GPIOC_ALTFN0 |= (2 << 28);    // 設置輸出功能    GPIOC_OUTENB |= (1 << 14);    for (;;) {        GPIOC_OUT &= ~(1 << 14); // 低電平 - 鳴叫        delay (0x2000000);        GPIOC_OUT |= (1 << 14); // 高電平 - 不叫 (無延時和停止蜂鳴效果)        delay (0x2000000);    }   }void delay (unsigned int n) {    unsigned int i;    for (i = n; i; --i);}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美午夜精品久久久久久浪潮| 欧美日韩亚洲高清| 日韩中文字幕av| 欧美精品激情blacked18| 成人写真视频福利网| 成人午夜在线影院| 国产精品久久久久77777| 国产欧美一区二区三区久久| 国产91精品久久久久久久| 91在线精品播放| 欧美在线视频一二三| 中文字幕日韩欧美在线视频| 亚洲人成电影在线播放| 欧美日韩在线免费观看| 日韩欧美高清在线视频| 国产精品久久97| 在线视频中文亚洲| 国产精品入口福利| 日韩欧美国产高清91| 中文字幕不卡av| 国产日韩在线亚洲字幕中文| 欧美成人在线免费视频| 狠狠躁夜夜躁人人爽天天天天97| 国产精品第一区| 亚洲福利在线视频| 亚洲色图av在线| 亚洲精品永久免费精品| 亚洲跨种族黑人xxx| 91国产中文字幕| 欧美高清第一页| 精品国产自在精品国产浪潮| 欧美一性一乱一交一视频| 国内精品免费午夜毛片| 亚洲无亚洲人成网站77777| 8x海外华人永久免费日韩内陆视频| 国产成人涩涩涩视频在线观看| 国产成人免费av| 国产情人节一区| 久久av中文字幕| 久久亚洲私人国产精品va| 久久久亚洲网站| 亚洲精品日韩丝袜精品| 欧美精品情趣视频| 国产精品久久久久久久7电影| 欧美激情乱人伦一区| 欧美精品手机在线| 欧美性受xxxx黑人猛交| 91国产视频在线播放| 久久精品久久久久久国产 免费| 日本最新高清不卡中文字幕| 亚洲男人天堂九九视频| 欧美乱妇40p| 在线精品高清中文字幕| 亚洲国产成人精品一区二区| 青青草国产精品一区二区| 国产精品久久久久久久久久久新郎| 揄拍成人国产精品视频| 国产亚洲精品久久久优势| 午夜精品国产精品大乳美女| 中文字幕日韩在线观看| 美女久久久久久久久久久| 欧美又大又粗又长| 久久精品国产成人精品| 中文字幕久精品免费视频| 精品久久久精品| 精品色蜜蜜精品视频在线观看| 亚洲国产精品国自产拍av秋霞| 欧美成人精品h版在线观看| 亚洲天堂男人天堂女人天堂| 尤物tv国产一区| 亚洲偷熟乱区亚洲香蕉av| 另类少妇人与禽zozz0性伦| 欧美日韩一区二区免费在线观看| 欧美高清第一页| 国产精品美腿一区在线看| 欧美与黑人午夜性猛交久久久| 国产欧美久久久久久| 日韩中文在线视频| 国产精品爽爽爽| 亚洲性线免费观看视频成熟| 欧美色视频日本版| 国产成人精品一区二区三区| 欧美成人激情在线| 91精品国产91久久久久| 日韩在线不卡视频| 日韩av网站大全| 国模精品视频一区二区| 国产精品男人的天堂| 亚洲jizzjizz日本少妇| 亚洲欧洲在线免费| 国语自产精品视频在线看一大j8| 热99精品只有里视频精品| 日韩精品中文字幕久久臀| 国产精品高潮呻吟久久av野狼| 国产成人福利视频| 亚洲精品国产精品乱码不99按摩| 日韩网站免费观看高清| 福利一区视频在线观看| www.亚洲成人| 国产精品人人做人人爽| 午夜精品一区二区三区在线视频| 97成人精品视频在线观看| 亚洲精品国产精品自产a区红杏吧| 欧美在线视频在线播放完整版免费观看| 欧美在线一级va免费观看| 亚洲欧美成人一区二区在线电影| 日韩精品中文字幕在线| 在线播放国产精品| 精品国产91久久久久久| 久久久久久69| 久久夜色精品亚洲噜噜国产mv| 色av吧综合网| 亚洲欧美在线看| 国产精品成人av性教育| 日本中文字幕久久看| 91久久中文字幕| 国产精品视频自在线| 久久99精品久久久久久琪琪| 蜜臀久久99精品久久久无需会员| 日韩欧美一区视频| 红桃av永久久久| 久久综合国产精品台湾中文娱乐网| 久久成人亚洲精品| 久久久久久国产免费| 91精品国产成人| 亚洲美女黄色片| 色偷偷偷亚洲综合网另类| 日韩一中文字幕| 91精品国产自产在线观看永久| 日韩在线观看av| 亚洲精品中文字幕有码专区| 国产精品自产拍在线观看中文| 国产suv精品一区二区三区88区| 日韩欧美精品在线观看| 亚洲一区二区三区成人在线视频精品| 欧美日韩国产丝袜美女| 欧美高跟鞋交xxxxxhd| 亚洲国产精品人久久电影| 亚洲www永久成人夜色| 国产在线播放91| 亚洲国产欧美一区二区丝袜黑人| 久久久久久国产精品| 午夜精品久久久久久久99热浪潮| 中文字幕一区二区三区电影| 久久精品国产亚洲精品| 久久久免费电影| 国产视频欧美视频| 国产视频丨精品|在线观看| 成人网中文字幕| 日韩av网站在线| 亚洲人成网站色ww在线| 亚洲国产精彩中文乱码av| 成人精品在线视频| 亚洲视频电影图片偷拍一区| 欧美最猛黑人xxxx黑人猛叫黄| 日韩一区二区福利| 国语自产精品视频在线看抢先版图片| 国产第一区电影| 亚洲精品国产精品国自产观看浪潮| 国产精品国产三级国产aⅴ浪潮| 久久久999精品| 一道本无吗dⅴd在线播放一区| 亚洲一区亚洲二区亚洲三区| 国产一区二区日韩|