天嵌 ARM开发社区

 找回密码
 注册
楼主: cumtwys

五句启动代码跑流水灯,汇编和C综合

[复制链接]
aaxixi 发表于 2010-12-18 10:04:46 | 显示全部楼层
您好!我这几天也在准备从汇编开始自己写程序,但是我想提一点疑问好吗?
1:C语言室需要堆栈的,你这里首先没有设置SP
2:你这里是应用的NADNFLASH的前4K自动映射为SDRAM
3:我自己也打算这样简化,我设置好SP能到Main中执行点亮一个LED,但是我完成流水灯就不行了。
     你可以吧你的代码这样弄弄试试,最好是下载到NANDFlash中,看看能不能正常跑起来。

-----------------------------------------------------------------------------------------------------------------
以下是我的代码:
汇编文件:
WTCON                 EQU  0x53000000            ;Watch-dog timer mode
INTSUBMSK        EQU  0x4a00001c             ;Interrupt sub mask
INTMSK                   EQU  0x4a000008             ;Interrupt mask control

         CODE32
        IMPORT  Main                ; The main entry of mon program       
       
        AREA        Init,CODE,READONLY
       
        ENTRY
        ldr        r0,=WTCON       ;watch dog disable
        ldr        r1,=0x0
        str        r1,[r0]

        ldr        r0,=INTMSK
        ldr        r1,=0xffffffff  ;all interrupt disable
        str        r1,[r0]

        ldr        r0,=INTSUBMSK
        ldr        r1,=0x7fff                ;all sub interrupt disable
        str        r1,[r0]       
       
        ldr        sp,=0x1000
        bl        Main
        END

c文件:
这种情况能跑起来:
#define GPBCON      (*(volatile unsigned long *)0x56000010)
#define GPBDAT      (*(volatile unsigned long *)0x56000014)

int Main()
{
    GPBCON = 0x00000400;    // 设置GPB5为输出口, 位[11:10]=0b01
    GPBDAT = 0x00000000;    // GPB5输出0,LED1点亮

    return 0;
}
这种情况中间会跑步起来,但是后面会跑到

#define IO_CON_BASE 0x56000000
#define IO_DAT_BASE 0x56000004

#define        GPBCON                (*(volatile unsigned long *)0x56000010)
#define        GPBDAT                (*(volatile unsigned long *)0x56000014)

#define        GPB5_out        (1<<(5*2))
#define        GPB6_out        (1<<(6*2))
#define        GPB7_out        (1<<(7*2))
#define        GPB8_out        (1<<(8*2))

#define GPIO_CFG_SET(group,index,type) do{\
                                                (*(volatile unsigned int*)(IO_CON_BASE+group*0x10))&=~(0x3<<(index<<1));\
                                                (*(volatile unsigned int*)(IO_CON_BASE+group*0x10))|=(type<<(index<<1));\
                                                }while(0)
#define GPIO_DAT_SET(group,index,val) do{\
                                                (*(volatile unsigned int*)(IO_DAT_BASE+group*0x10))&=~(0x1<<index);\
                                                (*(volatile unsigned int*)(IO_DAT_BASE+group*0x10))|=(val<<index);\
                                                }while(0)

void GPIO_CONF_SET(unsigned int group,unsigned int index,unsigned int type)
{
        unsigned int *p_add=NULL;
        unsigned int addr = IO_CON_BASE + (group*0x10);
        unsigned int io_reg = type<<(index<<1);
        p_add=(unsigned int *)(addr);
        *p_add=*p_add&~(0x3<<(index<<1));
        *p_add=*p_add|io_reg;
}
void GPIO_OUT_PUT(unsigned int group,unsigned int index,unsigned int outval)
{
        unsigned int *p_add=NULL;
        unsigned int addr = IO_DAT_BASE + (group*0x10);
        unsigned int io_reg = outval<<index;
        p_add=(unsigned int *)(addr);
        *p_add=*p_add&~(0x1<<index);
        *p_add=*p_add|io_reg;
}
void  wait(unsigned long dly)
{
        for(; dly > 0; dly--);
}
void LED_Test(void)
{        GPIO_CFG_SET(1,5,1);
        GPIO_CFG_SET(1,6,1);
        GPIO_CFG_SET(1,7,1);
        GPIO_CFG_SET(1,8,1);

                GPIO_DAT_SET(1,5,1);
                wait(100000);
                GPIO_DAT_SET(1,6,1);
                wait(100000);
                GPIO_DAT_SET(1,7,1);
                wait(100000);
                GPIO_DAT_SET(1,8,1);
                wait(100000);
                GPIO_DAT_SET(1,5,0);
                wait(100000);
                GPIO_DAT_SET(1,6,0);
                wait(100000);
                GPIO_DAT_SET(1,7,0);
                wait(100000);
                GPIO_DAT_SET(1,8,0);
                wait(100000);
}

int Main(void)
{
     GPBCON = 0x00000400;   
    GPBDAT = 0x00000000;    // 这里能跑到
     LED_Test();                      //这里灯不亮  -------这个函数是能运行的,我在用TQ2440自带的Init.s  能跑起来
     GPBDAT = 0xaaaaaa;    //这里也能亮
}
往高手帮忙解开一下疑惑
回复

使用道具 举报

nuckzjt 发表于 2010-12-18 10:21:29 | 显示全部楼层
我的是 TQ2440 的板子 不知道可以实现不?
回复

使用道具 举报

aaxixi 发表于 2010-12-18 10:52:53 | 显示全部楼层
32# nuckzjt


只要是TQ2440的板子都能跑!
回复

使用道具 举报

nuckzjt 发表于 2010-12-18 13:37:13 | 显示全部楼层
33# aaxixi


恩 那我也试一试!
回复

使用道具 举报

nuckzjt 发表于 2010-12-20 23:10:06 | 显示全部楼层
我的测试过了 可以 代码也基本上看明白了  谢谢楼主
回复

使用道具 举报

para 发表于 2010-12-22 19:58:25 | 显示全部楼层
不错 谢谢分享  l
回复

使用道具 举报

yearbyby 发表于 2011-3-4 15:23:26 | 显示全部楼层
嘿嘿,我的调好咯~~
回复

使用道具 举报

erteron 发表于 2011-3-8 22:24:07 | 显示全部楼层
试一试 呵呵呵 受教了~~~·
回复

使用道具 举报

whm0204 发表于 2011-3-28 17:40:40 | 显示全部楼层
支持一下,看能否在我板跑
回复

使用道具 举报

找打的乖乖猫 发表于 2011-5-1 21:20:18 | 显示全部楼层
怎么老是要钱的啊
回复

使用道具 举报

zoujian 发表于 2011-9-7 14:49:32 | 显示全部楼层
下来看看~ 试试我的能跑不
回复

使用道具 举报

化蝶 发表于 2011-9-12 11:35:45 | 显示全部楼层
下载试试我的能用不;
回复

使用道具 举报

cdyywz 发表于 2011-9-16 11:30:09 | 显示全部楼层
不能下载啊。
回复

使用道具 举报

落叶归根 发表于 2011-9-17 07:46:18 | 显示全部楼层
看看   可是为什么不能下载啊
回复

使用道具 举报

lvku 发表于 2011-10-20 08:24:30 | 显示全部楼层
怎么说不存在,现在不能下了吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2025-8-3 10:39 , Processed in 2.034713 second(s), 18 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表