打印

关于点亮LED的小问题

[复制链接]
2803|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Mars.CN|  楼主 | 2012-10-11 17:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
刚学ARM,裸奔中读《ARM处理器裸机开发实战》,书中错误超多
测试LED的时候遇到问题,按照书上写的去做,却点不亮,自己查找原因,未能发现,各位能否帮忙看看

led.c
/**************************************
led.c
控制LED灯的亮灭
**************************************/

#include "led.h"
#include "2440addr.h"

/**************************************
初始化LED灯,使LED1(GPB5)为可用状态,并阻断LED灯的显示
**************************************/
void Led_Init(void)
{
        rGPBCON &= ~(3<<10);                //清除GPB5的控制模式
        rGPBCON |= (1<<10);                        //设置GPB5的控制模式为输出模式
        rGPBUP &= ~(1<<5);                        //设置GPB5的上拉电阻为使能状态
        rGPBDAT |= (1<<5);                        //设置GPB5为高定平状态
}

/**************************************
打开LED1
**************************************/
void Led1_On(void)
{
        rGPBDAT &= ~(1<<5);                        //设置GPB5为低电平,其他位不变
}

/**************************************
关闭LED1
**************************************/
void Led1_Off(void)
{
        rGPBDAT |= (1<<5);                        //设置GPB5为高电平,其他位不变
}



led.h
/**************************************
led.h
控制LED灯的亮灭的头文件
**************************************/

#ifndef _LED_H_
#define _LED_H_

extern void Led_Init(void);                //初始化LED
extern void Led1_On(void);                //打开第一个LED
extern void Led1_Off(void);                //关闭第一个LED

#endif




Main.c
/**************************************
Main.c
启动文件
**************************************/
#include "led.h"

int Main()
{
        Led_Init();
        while(1)
        {
                Led1_On();
        }
        return 0;
}




Debug单步的时候虽然进入了方法里,但是好像方法里的内容没有执行

相关帖子

沙发
Mars.CN|  楼主 | 2012-10-11 17:31 | 只看该作者
顺便说一句,我用的是TQ2440开发板,LED的接法没有问题,实在GPB5上

使用特权

评论回复
板凳
NE5532| | 2012-10-11 20:36 | 只看该作者
数扔一边,把数据手册端口章节重新读一遍。

使用特权

评论回复
地板
Mars.CN|  楼主 | 2012-10-12 08:54 | 只看该作者
确实重读了一遍,木有问题,怀疑前面的启动函数是不是有什么问题?

使用特权

评论回复
5
阿南| | 2012-10-12 09:32 | 只看该作者
Debug单步?楼主你是在用仿真器调试吗?用的是ADS的AXD?
你在单步调试时,把它设置成混合模式后帖图上来,我看一下代码地址和汇编的结果

使用特权

评论回复
6
Mars.CN|  楼主 | 2012-10-16 09:53 | 只看该作者
5# 阿南


相当奇怪,如果我用数组,只要改变了时钟频率,亮的灯就不一样,没改变一次就变化一次,至今无解
但是AXD一切正常

使用特权

评论回复
7
sedatefire| | 2012-10-16 10:52 | 只看该作者
5# 阿南  


相当奇怪,如果我用数组,只要改变了时钟频率,亮的灯就不一样,没改变一次就变化一次,至今无解
但是AXD一切正常
Mars.CN 发表于 2012-10-16 09:53

灯悬空,示波器抓波看看
你肯定哪里搞错了

使用特权

评论回复
8
sedatefire| | 2012-10-16 10:52 | 只看该作者
只要改变了时钟频率,亮的灯就不一样
这个闻所未闻

使用特权

评论回复
9
qQ191727779| | 2012-10-16 11:17 | 只看该作者
本帖最后由 qQ191727779 于 2012-10-24 09:14 编辑

自己重新写个,我之前写的裸机好似20行左右的代码

使用特权

评论回复
10
Mars.CN|  楼主 | 2012-10-16 11:57 | 只看该作者
8# sedatefire
我也很纳闷,为啥这个跟时钟还有关
如果我把位移直接写在方法里面,不用变量的话,一点问题没有,一旦用到变量就SB了
可能和启动函数有关,以下是我的启动函数

 
GET option.inc
GET 2440addr.inc
GET memcfg.inc

IMPORT Main
    CODE32
    AREA Init,CODE,READONLY
    ENTRY     
     ;初始化LOCKTIME寄存器
     LDR R0 , =LOCKTIME
     LDR R1 , =0xFFFFFF
     STR R1 , [R0];
     
     ;设置CLKDIV的比值为1:2:4
     LDR R0 , =CLKDIVN
     LDR R1 , =CLKDIV_VAL
     STR R1 , [R0]  
     
     ;设置时钟频率,否则时钟显示混乱
     ;Fin=12.0MHz Fout=200MHz
     LDR R0 , =MPLLCON
     LDR R1 , =((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV)
     STR R1 , [R0]
     
     LDR R0, =0x53000000
     MOV R1, #0x0
     STR R1, [R0]
     LDR SP, =1024 * 4
     BL Main
main_loop
     B main_loop
    END

使用特权

评论回复
11
hyminzhu| | 2012-12-3 15:36 | 只看该作者
看看

使用特权

评论回复
12
duhemayi| | 2012-12-4 14:29 | 只看该作者
代码呀,看得头痛

使用特权

评论回复
13
zf_015820| | 2012-12-5 12:48 | 只看该作者
应该是软件没有写好,重新按照自己的逻辑写一个,先控制一个灯,再加。。。。。。;慢慢你能力强了,也知道了原因;程序 这个东西,是要自己搞的

使用特权

评论回复
14
江枫渔火| | 2012-12-6 18:33 | 只看该作者
板子卖么?便宜点,给我也玩玩~没学单片机,能玩么

使用特权

评论回复
15
21IC之星| | 2012-12-6 18:45 | 只看该作者

使用特权

评论回复
16
kulas| | 2012-12-6 22:32 | 只看该作者
看了程序真的服了,自己还是把自己的程序好好屡屡吧
像孩子一样先从匍匐前进的爬行开始,别怕简单,就怕
你好高骛远,别急躁慢慢,把程序的思路好好缕下,自己
就能看出来问题的,并且能记住,多思考

使用特权

评论回复
17
shirenyuled| | 2013-3-13 23:21 | 只看该作者
你们讲的都是控制方面的,有没有销售方面的朋友呀加下QQ412081085,特别是食人鱼LED方面的求指教

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

43

帖子

0

粉丝