Alientek I.MX6UL Linux- 第十章 C語言版LED實驗

  主要內容,弄清楚進入C語言環境需要兩部分文件,彙編文件和C語言文件,彙編文件主要作用是用來初始化C語言環境的,比如DDR和設置堆棧指針SP等等。

彙編文件(示例代碼10.3.1.2 start.s文件代碼)

彙編文件主要內容:
其一設置處理器模式爲SVC(超級管理員模式)主要操作特殊寄存器CPSR;
其二設置棧指針爲0x80200000;
其三跳轉到C語言的Main函數。

/*************************************************************** Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved. 
文件名 : start.s 
作者 : 左忠凱 
版本 : V1.0 
描述 : I.MX6U-ALPHA/I.MX6ULL開發板啓動文件,完成C環境初始化, C環境初始化完成以後跳轉到C代碼。 
其他 : 無 
日誌 : 初版 2019/1/3 左忠凱修改 **************************************************************/
.global _start   /*全局標號*/
/*
 *描述: _start函數,程序從此函數開始執行,此函數主要功能是設置C運行環境
 */
 _start:
 /*進入SVC模式*
 mrs r0,cpsr
 bic r0,r0,#0x1f    /*將r0的低5位清零,也就是cpsr的M0~M4*/
 orr r0,r0,#0x13    /*r0或上0x13,表示使用SVC*/
 msr cpsr,r0        /*將r0的數據寫入到cpsr_c中*/

ldr sp, =0x80200000/*設置棧指針*/
b main             /*跳轉到main函數*/

頭文件(示例代碼10.3.2.1 main.h文件代碼 )

#ifndef __MAIN_H 
#define __MAIN_H 
/******************************************************************
 Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved. 
 文件名 : main.h 
 作者 : 左忠凱 
 版本 : V1.0 
 描述 : 時鐘GPIO1_IO03相關寄存器地址定義。 
 其他 : 無
 日誌 : 初版V1.0 2019/1/3 左忠凱創建 
 *****************************************************************/
  /* 
   * CCM相關寄存器地址 
   */
   #define CCM_CCGR0 *((volatile unsigned int *)0X020C4068) 
   #define CCM_CCGR1 *((volatile unsigned int *)0X020C406C) 
   #define CCM_CCGR2 *((volatile unsigned int *)0X020C4070) 
   #define CCM_CCGR3 *((volatile unsigned int *)0X020C4074) 
   #define CCM_CCGR4 *((volatile unsigned int *)0X020C4078) 
   #define CCM_CCGR5 *((volatile unsigned int *)0X020C407C) 
   #define CCM_CCGR6 *((volatile unsigned int *)0X020C4080) 
   /* 
    * IOMUX相關寄存器地址
    */
    #define SW_MUX_GPIO1_IO03 *((volatile unsigned int *)0X020E0068)
    #define SW_PAD_GPIO1_IO03 *((volatile unsigned int *)0X020E02F4)
    /* 
    * GPIO1相關寄存器地址
    */ 
    #define GPIO1_DR *((volatile unsigned int *)0X0209C000) 
    #define GPIO1_GDIR *((volatile unsigned int *)0X0209C004) 
    #define GPIO1_PSR *((volatile unsigned int *)0X0209C008) 
    #define GPIO1_ICR1 *((volatile unsigned int *)0X0209C00C) 
    #define GPIO1_ICR2 *((volatile unsigned int *)0X0209C010) 
    #define GPIO1_IMR *((volatile unsigned int *)0X0209C014) 
    #define GPIO1_ISR *((volatile unsigned int *)0X0209C018) 
    #define GPIO1_EDGE_SEL *((volatile unsigned int *)0X0209C01C) 
    #endif

源文件(示例代碼10.3.2.2 main.c文件代碼)

/************************************************************** 
Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved. 
文件名 : main.c 
作者 : 左忠凱 
版本 : V1.0 
描述 : I.MX6U開發板裸機實驗2 C語言點燈
	  使用C語言來點亮開發板上的LED燈,學習和掌握如何用C語言來 
	  完成對I.MX6U處理器的GPIO初始化和控制。 
其他 : 無 
日誌 : 初版V1.0 2019/1/3 左忠凱創建 **************************************************************/
	#include "main.h" 
	/* 
	 * @description : 使能I.MX6U所有外設時鐘 
	 *  @param : 無 
	 * @return : 無
	 */ 
		void clk_enable(void)
		{ 
			CCM_CCGR0 = 0xffffffff; 
			CCM_CCGR1 = 0xffffffff;
			CCM_CCGR2 = 0xffffffff; 
			CCM_CCGR3 = 0xffffffff; 
			CCM_CCGR4 = 0xffffffff; 
			CCM_CCGR5 = 0xffffffff; 
			CCM_CCGR6 = 0xffffffff; 
		} 
		 /*
		  * @description : 初始化LED對應的GPIO
		  * @param : 無
		  * @return : 無
		  */ 
		  void led_init(void)
		  { 
			  /* 1、初始化IO複用, 複用爲GPIO1_IO03 */
			  SW_MUX_GPIO1_IO03 = 0x5; 
			  /* 2、配置GPIO1_IO03的IO屬性
			   *bit 16:0 HYS關閉 
			   *bit [15:14]: 00 默認下拉 
			   *bit [13]: 0 kepper功能 
			   *bit [12]: 1 pull/keeper使能 
			   *bit [11]: 0 關閉開路輸出
			   *bit [7:6]: 10 速度100Mhz 
			   *bit [5:3]: 110 R0/6驅動能力 
			   *bit [0]: 0 低轉換率 
			   */
			   SW_PAD_GPIO1_IO03 = 0X10B0; 
			   /* 3、初始化GPIO, GPIO1_IO03設置爲輸出 */ 
			   GPIO1_GDIR = 0X0000008;
			   /* 4、設置GPIO1_IO03輸出低電平,打開LED0 */
			   GPIO1_DR = 0X0; 
		    } 
    /* 
     * @description : 打開LED燈 
     * @param : 無
     * @return : 無
     */ 
		void led_on(void)
		{ 
			/* 
			* 將GPIO1_DR的bit3清零 
			*/ 
			GPIO1_DR &= ~(1<<3);
		 }
    /* 
     * @description :  關閉LED燈 
     * @param : 無
     * @return : 無
     */ 
		void led_off(void) 
		{ 
		  /* 
		   * 將GPIO1_DR的bit3置1 
		   * /
		  GPIO1_DR |= (1<<3);
		 } 
       /*
        * @description : 短時間延時函數 
        * @param - n : 要延時循環次數(空操作循環次數,模式延時) 
        * @return : 無 
        */ 
       void delay_short(volatile unsigned int n)
       { 
      	 while(n--){}
       } 
       /*
        *@description : 延時函數,在396Mhz的主頻下延時時間大約爲1ms86 
        *@param - n: 要延時的ms數87 
        *@return: 無88 */
        void delay(volatile unsigned int n)
        { 
	        while(n--) 
	        { 
	       	 delay_short(0x7ff);
	        } 
        } 
        /* 
         *@description : mian函數
         *@param: 無
         * @return: 無
         */
         int main(void) 
         { 
	          clk_enable();
	          /* 使能所有的時鐘*/ 
	          led_init(); /* 初始化led*/
	          while(1) /* 死循環*/
	          { 
		          led_off(); /* 關閉LED*/
		          delay(500); /* 延時大約500ms*/ 
		          led_on(); /* 打開LED*/
		          delay(500); /* 延時大約500ms*/
	          } 
	          return 0;
          }

Makefile文件(示例代碼10.4.1.1 main.c文件代碼)

將C文件和S文件編譯成目標文件,再將目標文件鏈接到地址0X87800000,生成bin文件。

objs := start.o main.o 
ledc.bin:$(objs) 
	arm-linux-gnueabihf-ld -Ttext 0X87800000 -o ledc.elf $^
	arm-linux-gnueabihf-objcopy -O binary -S ledc.elf $@ 
	arm-linux-gnueabihf-objdump -D -m arm ledc.elf > ledc.dis 
 %.o:%.s
	  arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o $@ $< 
 %.o:%.S 
	  arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o $@ $< 
 %.o:%.c 
	  arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o $@ $< 
 clean: 
	 rm -rf *.o ledc.bin ledc.elf ledc.dis

imx6ul.lds文件(示例代碼10.4.2.2 imx6ul.lds鏈接腳本代碼)

SECTIONS{
	. = 0X87800000;
	.text : 
	{ 
	start.o 
	main.o 
	*(.text) 
	} 
	.rodata ALIGN(4) : {*(.rodata*)}
	.data ALIGN(4) : { *(.data) } 
	__bss_start = .; 
	.bss ALIGN(4) : { *(.bss) *(COMMON) }
	__bss_end = .;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章