單片機
返回首頁

s3c2440學習之路-002 C語言點亮led

2021-09-09 來源:eefocus

硬件平臺:jz2440

軟件平臺:Ubuntu16.04 arm-linux-gcc-3.4.5

源碼位置: https://github.com/lian494362816/C/tree/master/2440/003_led_c


1 主要流程

承接上一篇博客 https://blog.csdn.net/lian494362816/article/details/84309342, 原理分析就略過,流程也很簡單:

1)設置棧

2)跳到C語言

3)將GPF4配置成輸出模式

4)將GPF4輸出低電平,即可點亮LED1


2 源碼

start.s


.global _start

_start:


    ldr sp, =4096 /* for nand */

    /*ldr sp, =0x40000000 + 4096  /* for nor */

    bl main


loop:

    b loop


匯編代碼很簡單,設置完了棧之后就直接跳到了C源的main函數


led_on.c


int  main()

{

    unsigned int *pGPF4CON = (unsigned int *)0x56000050;

    unsigned int *pGPFDAT = (unsigned int *)0x56000054;


    *pGPF4CON = 0x100;

    *pGPFDAT = 0x0;


    return 0;

}


C代碼也很簡單,將地址強制轉換成了指針,再對指針進行賦值


3 SP(stack pointer)的設置

這里要引出2個問題:


為什么要設置SP

SP的值如何設置


3.1 為什么要設置SP

當程序跳到C語言執行時,第一件事情就是保存現場,而保存現場就需要將數據壓入到棧中。因此查看反匯編代碼時,跳到main之后,開頭就執行了 “stmdb sp!, {fp, ip, lr, pc}”指令,這里就用到了SP 。


led_on.dis

在這里插入圖片描述

3.2 SP的值如何設置

SP的設置根據nand flash, nor flash這2種不同啟動方式可以配置成2個值,nand flash 是4096, nor flash 是0x40000000 + 4096。

主要原因:

1)nand flash的數據無法直接讀取,需要預先發送指令,所以當使用nand啟動時,2440會把nand 前4K的數據拷貝到內部的SRAM里面,這樣程序是從在內部的SRAM里面讀取指令。因為程序是從0地址開始拷貝,SP設置成4906(4K),SP的數值又是往下減的,所以保證SP不會踩到程序。


2)nor flash是跟CPU統一編址, CPU可以直接從nor flash讀取數據(寫數據需要預先發送命令)。當使用nor flash啟動時,程序是直接從nor flash讀取指令,根據2440的手冊,此時SRAM的起始地址為0x40000000, 所以把SP的值設置為0x40000000 + 4096。


如果寫了一個簡單的流水燈程序會發現一個問題,程序燒到nand flash上運行的速度比nor flash要快,原因就是一個是在內部的SRAM讀取指令, 另一個是在外部的nor flash讀取指令。

在這里插入圖片描述

進入單片機查看更多內容>>
相關視頻
  • TI 新一代 C2000? 微控制器:全方位助力伺服及馬達驅動應用

  • MSP430電容觸摸技術 - 防水Demo演示

  • 直播回放: Microchip Timberwolf? 音頻處理器在線研討會

  • 新唐 8051單片機教程

  • 基于靈動MM32W0系列MCU的指夾血氧儀控制及OTA升級應用方案分享

  • 基于靈動MM32SPIN系列MCU的無感FOC便攜冰箱應用方案分享

    相關電子頭條文章
萝卜大香蕉