搜索
bottom↓
回复: 21

AT91SAM7S256学习经历,以前只玩过51

[复制链接]

出75入8汤圆

发表于 2013-2-22 14:56:27 | 显示全部楼层 |阅读模式
第一篇:找LED程序.环境用KEIL.


/**********************************************
File Name: led flash
Revision: 01.00
Corporation:
Microcontroller Corporation:Atmel
Microcontroller name:AT91SAM7S64
Compiler: C51 for Keil3(V8.05        armV3.01)
Author: chen1986sl                                                   
E-mail: chen1986sl@126.com
Date : 2009.15.03                                          
*********************************************/

//实验板:MP0006B
//连线:
//PA0-PA3:输出

#include "AT91SAM7S256.h"            // AT91SAM7S64处理器的寄存器头文件

#define Led0Port         (1<<0)  // PA0  定义LED0 和端口PA0相连
#define Led1Port         (1<<1)  // PA1  定义LED1 和端口PA1相连
#define Led2Port         (1<<2)  // PA2  定义LED2 和端口PA2相连
#define Led3Port         (1<<3)  // PA3  定义LED3 和端口PA3相连



void Delay(void)                        //延时函数
        {
        unsigned int i;
        for(i=0;i<1000*1000;i++)
                {
                ;
                }
        }





int main(void)
        {
        *AT91C_PIOA_PER=Led0Port|Led1Port|Led2Port|Led3Port;        //使能LED对应的管脚的IO功能
        *AT91C_PIOA_OER=Led0Port|Led1Port|Led2Port|Led3Port;        //使能LED对应的管脚的输出功能

          


        while(1)
                {
                *AT91C_PIOA_CODR=Led0Port|Led1Port|Led2Port|Led3Port;   //         Led0123 口全为0  LED全亮
                Delay();
       
                 
                *AT91C_PIOA_SODR=Led0Port;                                  //LED0=1  灭掉

                Delay();
                 

        *AT91C_PIOA_SODR=Led1Port;   
                  Delay();
               
        *AT91C_PIOA_SODR=Led2Port;   
                Delay();
       
        *AT91C_PIOA_SODR=Led3Port;   
                Delay();

                 

                }
        }
网上搜到的程序,说是直接编译就能运行,可是发现JTAG下载到里面以后灯不闪,查百度,晶体不起振才知,AT91开机晶体不起振,需要设定,现在先不设定,内部为32768HZ,把延时改一下,变成如下程序:


/**********************************************
File Name: led flash
Revision: 01.00
Corporation:
Microcontroller Corporation:Atmel
Microcontroller name:AT91SAM7S64
Compiler: C51 for Keil3(V8.05        armV3.01)
Author: chen1986sl                                                   
E-mail: chen1986sl@126.com
Date : 2009.15.03                                          
*********************************************/

//实验板:MP0006B
//连线:
//PA0-PA3:输出

#include "AT91SAM7S256.h"            // AT91SAM7S64处理器的寄存器头文件

#define Led0Port         (1<<0)  // PA0  定义LED0 和端口PA0相连
#define Led1Port         (1<<1)  // PA1  定义LED1 和端口PA1相连
#define Led2Port         (1<<2)  // PA2  定义LED2 和端口PA2相连
#define Led3Port         (1<<3)  // PA3  定义LED3 和端口PA3相连



void Delay(void)                        //延时函数
        {
        unsigned int i;
        for(i=0;i<1000*1;i++)
                {
                ;
                }
        }





int main(void)
        {
        *AT91C_PIOA_PER=Led0Port|Led1Port|Led2Port|Led3Port;        //使能LED对应的管脚的IO功能
        *AT91C_PIOA_OER=Led0Port|Led1Port|Led2Port|Led3Port;        //使能LED对应的管脚的输出功能

          


        while(1)
                {
                *AT91C_PIOA_CODR=Led0Port|Led1Port|Led2Port|Led3Port;   //         Led0123 口全为0  LED全亮
                Delay();
       
                 
                *AT91C_PIOA_SODR=Led0Port;                                  //LED0=1  灭掉

                Delay();
                 

        *AT91C_PIOA_SODR=Led1Port;   
                  Delay();
               
        *AT91C_PIOA_SODR=Led2Port;   
                Delay();
       
        *AT91C_PIOA_SODR=Led3Port;   
                Delay();

                 

                }
        }

好,PA0灯闪了.

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出75入8汤圆

 楼主| 发表于 2013-2-22 14:57:53 | 显示全部楼层
现在关键是要设定为外部晶体,希望有经验的朋友提供一下例程.

出75入8汤圆

 楼主| 发表于 2013-2-26 12:05:25 | 显示全部楼层
开了外部时钟不稳定:


/**********************************************
File Name: led flash
Revision: 01.00
Corporation:
Microcontroller Corporation:Atmel
Microcontroller name:AT91SAM7S64
Compiler: C51 for Keil3(V8.05        armV3.01)
Author: chen1986sl                                                   
E-mail: chen1986sl@126.com
Date : 2009.15.03                                          
*********************************************/

//实验板:MP0006B
//连线:
//PA0-PA3:输出

#include "AT91SAM7S256.h"            // AT91SAM7S64处理器的寄存器头文件

#define Led0Port         (1<<0)  // PA0  定义LED0 和端口PA0相连
#define Led1Port         (1<<1)  // PA1  定义LED1 和端口PA1相连
#define Led2Port         (1<<2)  // PA2  定义LED2 和端口PA2相连
#define Led3Port         (1<<3)  // PA3  定义LED3 和端口PA3相连



void Delay(void)                        //延时函数
        {
        unsigned int i;
        for(i=0;i<1000*500;i++)
                {
                ;
                }
        }





int main(void)
        {
                         *AT91C_CKGR_MOR = 0x701; //使能主振荡器和设置起振时间
                        *AT91C_PMC_MCKR = 0x01;//选择Mster Clock is main clock, divided by 0  
*AT91C_PMC_SCER = AT91C_CKGR_MOSCEN;//使能系统时钟寄存器的处理器时钟

        *AT91C_PIOA_PER=Led0Port|Led1Port|Led2Port|Led3Port;        //使能LED对应的管脚的IO功能
        *AT91C_PIOA_OER=Led0Port|Led1Port|Led2Port|Led3Port;        //使能LED对应的管脚的输出功能

            

        while(1)
                {
          

       


                *AT91C_PIOA_CODR=Led0Port|Led1Port|Led2Port|Led3Port;   //         Led0123 口全为0  LED全亮
                Delay();
       
                 
        //        *AT91C_PIOA_SODR=Led0Port;                                  //LED0=1  灭掉

                Delay();
                 

//        *AT91C_PIOA_SODR=Led1Port;   
                  
               
        *AT91C_PIOA_SODR=Led2Port;   
                Delay();
       
//        *AT91C_PIOA_SODR=Led3Port;   
                Delay();

                  

                }
        }

出75入8汤圆

 楼主| 发表于 2013-2-26 12:06:20 | 显示全部楼层
闪一会,歇一会,好像在喘气一样,最后干脆不闪,ARM比51麻烦多啦!1

出0入0汤圆

发表于 2013-2-26 22:22:57 | 显示全部楼层
LZ使用的是什么学习板!我也想学此芯片,但发现目前资料很少

出0入0汤圆

发表于 2013-2-26 22:27:31 来自手机 | 显示全部楼层
注意看门狗默认是打开的!有可能是被狗咬了!晶体配置很简单,看手册吧,网上有流传一个AT91SAM7S64的中文手册,你可以看看,基本适用S256!

出75入8汤圆

 楼主| 发表于 2013-2-27 14:32:02 | 显示全部楼层
谢谢!我再看一下!

出75入8汤圆

 楼主| 发表于 2013-2-27 14:33:32 | 显示全部楼层
我自已做的电路板,有需要空板的说一下,不过快递费你自已到付就可以,想一下你自已打板也高于这个价的,我空板免费1

出75入8汤圆

 楼主| 发表于 2013-2-27 14:51:27 | 显示全部楼层
上传一下AT91SAM7S64中文资料,有需要自已下.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出75入8汤圆

 楼主| 发表于 2013-2-27 15:07:35 | 显示全部楼层
刚开始调试时好像把JTAGSEL接高了,导致找不到内核,连不上,后来去掉就可以,另有时找不到内核可以多试几次,JTAG线长有时找不到的,如果内部有程序可以用EARSR接高一下擦掉,否则也找不到,ARM就是麻烦啊,51哪有这些破事

出75入8汤圆

 楼主| 发表于 2013-2-27 15:15:59 | 显示全部楼层
刚碰了一下晶体,不闪了,然后重新开机一直不闪,不是这么脆吧

出75入8汤圆

 楼主| 发表于 2013-2-27 17:20:11 | 显示全部楼层
汗!晶体掉了一只腿.又开始闪了

出75入8汤圆

 楼主| 发表于 2013-3-4 15:54:14 | 显示全部楼层
关了看门狗,可以正常工作了,只是有时上电会死机,难道一定要喂狗?


/**********************************************
File Name: led flash
Revision: 01.00
Corporation:
Microcontroller Corporation:Atmel
Microcontroller name:AT91SAM7S64
Compiler: C51 for Keil3(V8.05        armV3.01)
Author: chen1986sl                                                   
E-mail: chen1986sl@126.com
Date : 2009.15.03                                          
*********************************************/

//实验板:MP0006B
//连线:
//PA0-PA3:输出

#include "AT91SAM7S256.h"            // AT91SAM7S64处理器的寄存器头文件

#define Led0Port         (1<<0)  // PA0  定义LED0 和端口PA0相连
#define Led1Port         (1<<1)  // PA1  定义LED1 和端口PA1相连
#define Led2Port         (1<<2)  // PA2  定义LED2 和端口PA2相连
#define Led3Port         (1<<3)  // PA3  定义LED3 和端口PA3相连



void Delay(void)                        //延时函数
        {
        unsigned int i;
        for(i=0;i<1000*300;i++)
                {
                ;
                }
        }





int main(void)
        {

                 AT91C_BASE_WDTC->WDTC_WDMR= AT91C_WDTC_WDDIS; //关狗


                         *AT91C_CKGR_MOR = 0x701; //使能主振荡器和设置起振时间
                        *AT91C_PMC_MCKR = 0x01;//选择Mster Clock is main clock, divided by 0  
*AT91C_PMC_SCER = AT91C_CKGR_MOSCEN;//使能系统时钟寄存器的处理器时钟




        *AT91C_PIOA_PER=Led0Port|Led1Port|Led2Port|Led3Port;        //使能LED对应的管脚的IO功能
        *AT91C_PIOA_OER=Led0Port|Led1Port|Led2Port|Led3Port;        //使能LED对应的管脚的输出功能

            

        while(1)
                {
          

       


                *AT91C_PIOA_CODR=Led0Port|Led1Port|Led2Port|Led3Port;   //         Led0123 口全为0  LED全亮
                Delay();
       
                 
        //        *AT91C_PIOA_SODR=Led0Port;                                  //LED0=1  灭掉

               
//        *AT91C_PIOA_SODR=Led1Port;   
                  
               
        *AT91C_PIOA_SODR=Led2Port;   
                Delay();
       
//        *AT91C_PIOA_SODR=Led3Port;   
               

                }
        }

出75入8汤圆

 楼主| 发表于 2013-3-5 09:09:24 | 显示全部楼层
死机先不管了,现在进行ADC转换,坛内的例子,当ADC后四位大于512即一半时,灯翻转 状态,现在出现的问题是:一直不翻转:

/**********************************************
File Name: led flash
Revision: 01.00
Corporation:
Microcontroller Corporation:Atmel
Microcontroller name:AT91SAM7S64
Compiler: C51 for Keil3(V8.05        armV3.01)
Author: chen1986sl                                                   
E-mail: chen1986sl@126.com
Date : 2009.15.03                                          
*********************************************/

//实验板:MP0006B
//连线:
//PA0-PA3:输出

#include "AT91SAM7S256.h"            // AT91SAM7S64处理器的寄存器头文件

#define Led0Port         (1<<0)  // PA0  定义LED0 和端口PA0相连
#define Led1Port         (1<<1)  // PA1  定义LED1 和端口PA1相连
#define Led2Port         (1<<2)  // PA2  定义LED2 和端口PA2相连
#define Led3Port         (1<<3)  // PA3  定义LED3 和端口PA3相连
  #define int32U unsigned int


void Delay(void)                        //延时函数
        {
        unsigned int i;
        for(i=0;i<1000*300;i++)
                {
                ;
                }
        }





int main(void)
        {
                  int32U i;        //ADC转换结果
                 AT91C_BASE_WDTC->WDTC_WDMR= AT91C_WDTC_WDDIS; //关狗


                         *AT91C_CKGR_MOR = 0x701; //使能主振荡器和设置起振时间
                        *AT91C_PMC_MCKR = 0x01;//选择Mster Clock is main clock, divided by 0  
*AT91C_PMC_SCER = AT91C_CKGR_MOSCEN;//使能系统时钟寄存器的处理器时钟

            *AT91C_PMC_PCER=(1<<AT91C_ID_ADC);        //使能ADC转换时钟

                *AT91C_ADC_CR=AT91C_ADC_SWRST;        //ADC模拟硬件复位
                 *AT91C_ADC_MR=AT91C_ADC_LOWRES_10_BIT|AT91C_ADC_SLEEP_NORMAL_MODE;
        //ADC通道选择
                         *AT91C_ADC_CHER=AT91C_ADC_CH6;        //选择通道0转换
        //ADC通道禁用寄存器


        *AT91C_PIOA_PER=Led0Port|Led1Port|Led2Port|Led3Port;        //使能LED对应的管脚的IO功能
        *AT91C_PIOA_OER=Led0Port|Led1Port|Led2Port|Led3Port;        //使能LED对应的管脚的输出功能

            

        while(1)
                {
          
                 //启动ADC转换
                *AT91C_ADC_CR=AT91C_ADC_START;        //启动ADC转换       
                //*AT91C_ADC_CR=0x02;
                //等待转换完成
                while((*AT91C_ADC_SR)&(AT91C_ADC_EOC0)==0);
                //读取10位转换数据
                i=(*AT91C_ADC_CDR0)&0x3ff;        //取低10位ADC结果
       
                 if(i>512)        //如果电压大于一半
                        {
                        *AT91C_PIOA_SODR=Led0Port|Led1Port|Led2Port|Led3Port;    //对应管脚输出低电平,LED亮
                        }
                else
                        {
                        *AT91C_PIOA_CODR=Led0Port|Led1Port|Led2Port|Led3Port;    //对应管脚输出高电平,LED灭       
                        }

        //        *AT91C_PIOA_CODR=Led0Port|Led1Port|Led2Port|Led3Port;   //         Led0123 口全为0  LED全亮
        //        Delay();
//        *AT91C_PIOA_SODR=Led2Port;   
        //        Delay();
       

               

                }
        }

出0入0汤圆

发表于 2013-3-5 09:10:52 | 显示全部楼层
ZHAOBAO511 发表于 2013-2-27 14:33
我自已做的电路板,有需要空板的说一下,不过快递费你自已到付就可以,想一下你自已打板也高于这个价的,我空板 ...

也想学习下啊,可以申请个空板吗?QQ413916089

出75入8汤圆

 楼主| 发表于 2013-3-6 08:42:02 | 显示全部楼层
可以,限3个人.

出75入8汤圆

 楼主| 发表于 2013-3-6 08:42:18 | 显示全部楼层
共同学习

出75入8汤圆

 楼主| 发表于 2013-3-6 14:21:36 | 显示全部楼层
上边朋友加了你的QQ,也不回,没办法.

出75入8汤圆

 楼主| 发表于 2013-3-6 14:22:53 | 显示全部楼层
继续上程序:下面这个AD,只在0通道有用,改其它通道无用:

/**********************************************
File Name: ADC
Revision: 01.00
Corporation:
Microcontroller Corporation:Atmel
Microcontroller name:AT91SAM7S64
Compiler: C51 for Keil3(V8.05        armV3.01)
Author: chen1986sl                                                   
E-mail: chen1986sl@126.com
Date : 2009.12.10                                          
*********************************************/



#include "AT91SAM7S256.h"            // AT91SAM7S64处理器的寄存器头文件

#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long


#define Led0Port         (1<<0)  // PA0  定义LED0 和端口PA0相连
#define Led1Port         (1<<1)  // PA1  定义LED1 和端口PA1相连
#define Led2Port         (1<<2)  // PA2  定义LED2 和端口PA2相连
#define Led3Port         (1<<3)  // PA3  定义LED3 和端口PA3相连

//
#define int32U unsigned int

int main(void)
        {
         uint i;        //ADC转换结果
        //LED显示管脚设置
        *AT91C_PIOA_PER=Led0Port|Led1Port|Led2Port|Led3Port;        //使能LED对应的管脚的IO功能
        *AT91C_PIOA_OER=Led0Port|Led1Port|Led2Port|Led3Port;        //使能LED对应的管脚的输出功能

       
        *AT91C_PMC_PCER=(1<<AT91C_ID_ADC);        //使能ADC转换时钟         //使能ADC时钟

       
        *AT91C_ADC_CR=AT91C_ADC_SWRST;        //ADC模拟硬件复位                //ADC软件复位                 *AT91C_ADC_CR=0x01;
       
        *AT91C_ADC_MR=AT91C_ADC_LOWRES_10_BIT|AT91C_ADC_SLEEP_NORMAL_MODE;           //ADC模式选择:10位分辨率,普通模式
       
        *AT91C_ADC_CHER=AT91C_ADC_CH0;        ////ADC通道选择  通道0转换

        while(1)
                {
                //启动ADC转换
                *AT91C_ADC_CR=AT91C_ADC_START;        //启动ADC转换                *AT91C_ADC_CR=0x02;
                       

                while((*AT91C_ADC_SR)&(AT91C_ADC_EOC0)==0);            //ADC_SR 中 EOCn 是判断介绍的标准 0没有完成 1完成


                //读取10位转换数据
                i=*AT91C_ADC_CDR0;     //读通道0的电压,不需要屏蔽 因为CDRn 初始就是0
                  
                if(i>512)        //如果电压大于一半           将读到的电压 通告LED 来显示。实验用 实际无意义
                        {
                        *AT91C_PIOA_CODR=Led0Port|Led1Port|Led2Port|Led3Port;    //对应管脚输出低电平,LED亮
                        }
                else
                        {
                        *AT91C_PIOA_SODR=Led0Port|Led1Port|Led2Port|Led3Port;    //对应管脚输出高电平,LED灭       
                        }
                }
        }

出75入8汤圆

 楼主| 发表于 2013-3-6 14:23:17 | 显示全部楼层
有高手帮下忙改为其它通道,谢谢

出75入8汤圆

 楼主| 发表于 2013-3-11 08:58:49 | 显示全部楼层
更换为其它通道成功,更换为6成功:

/**********************************************
File Name: ADC
Revision: 01.00
Corporation:
Microcontroller Corporation:Atmel
Microcontroller name:AT91SAM7S64
Compiler: C51 for Keil3(V8.05        armV3.01)
Author: chen1986sl                                                   
E-mail: chen1986sl@126.com
Date : 2009.12.10                                          
*********************************************/



#include "AT91SAM7S256.h"            // AT91SAM7S64处理器的寄存器头文件

#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long


#define Led0Port         (1<<0)  // PA0  定义LED0 和端口PA0相连
#define Led1Port         (1<<1)  // PA1  定义LED1 和端口PA1相连
#define Led2Port         (1<<2)  // PA2  定义LED2 和端口PA2相连
#define Led3Port         (1<<3)  // PA3  定义LED3 和端口PA3相连

//
#define int32U unsigned int

int main(void)
        {
         uint i;        //ADC转换结果

                  AT91C_BASE_WDTC->WDTC_WDMR= AT91C_WDTC_WDDIS; //关狗

                 *AT91C_CKGR_MOR = 0x701; //使能主振荡器和设置起振时间
                        *AT91C_PMC_MCKR = 0x01;//选择Mster Clock is main clock, divided by 0  
*AT91C_PMC_SCER = AT91C_CKGR_MOSCEN;//使能系统时钟寄存器的处理器时钟

        //LED显示管脚设置
        *AT91C_PIOA_PER=Led0Port|Led1Port|Led2Port|Led3Port;        //使能LED对应的管脚的IO功能
        *AT91C_PIOA_OER=Led0Port|Led1Port|Led2Port|Led3Port;        //使能LED对应的管脚的输出功能

       
        *AT91C_PMC_PCER=(1<<AT91C_ID_ADC);        //使能ADC转换时钟         //使能ADC时钟

       
        *AT91C_ADC_CR=AT91C_ADC_SWRST;        //ADC模拟硬件复位                //ADC软件复位                 *AT91C_ADC_CR=0x01;
       
        *AT91C_ADC_MR=AT91C_ADC_LOWRES_10_BIT|AT91C_ADC_SLEEP_NORMAL_MODE;           //ADC模式选择:10位分辨率,普通模式
       
        *AT91C_ADC_CHER=AT91C_ADC_CH6;        ////ADC通道选择  通道0转换

        while(1)
                {
                //启动ADC转换
                *AT91C_ADC_CR=AT91C_ADC_START;        //启动ADC转换                *AT91C_ADC_CR=0x02;
                       

                while((*AT91C_ADC_SR)&(AT91C_ADC_EOC0)==0);            //ADC_SR 中 EOCn 是判断介绍的标准 0没有完成 1完成


                //读取10位转换数据
                i=*AT91C_ADC_CDR6;     //读通道0的电压,不需要屏蔽 因为CDRn 初始就是0
                  
                if(i>512)        //如果电压大于一半           将读到的电压 通告LED 来显示。实验用 实际无意义
                        {
                        *AT91C_PIOA_CODR=Led0Port|Led1Port|Led2Port|Led3Port;    //对应管脚输出低电平,LED亮
                        }
                else
                        {
                        *AT91C_PIOA_SODR=Led0Port|Led1Port|Led2Port|Led3Port;    //对应管脚输出高电平,LED灭       
                        }
                }
        }

/*
//关键字:
        *AT91C_ADC_CHER=AT91C_ADC_CH0; //选择0通道
        *AT91C_ADC_CHER=AT91C_ADC_CH3; //选择3通道

        while((*AT91C_ADC_SR)&(AT91C_ADC_EOC0)==0);         //判断通道0是不是转换结束  查询模式下用
        while((*AT91C_ADC_SR)&(AT91C_ADC_EOC5)==0);         //判断通道5是不是转换结束  查询模式下用
               
*AT91C_ADC_MR=AT91C_ADC_LOWRES_10_BIT|AT91C_ADC_SLEEP_NORMAL_MODE;                   10位分辨率,普通模式

AT91C_ADC_LOWRES_10_BIT         ---                 10位分辨率
AT91C_ADC_LOWRES_8_BIT         ---                 8位分辨率

AT91C_ADC_SLEEP_NORMAL_MODE                        正常模式
AT91C_ADC_SLEEP_MODE                            睡眠模式

没有用到分频  如果要用到具体查询 ADC_MR          */

出0入0汤圆

发表于 2018-4-26 13:23:03 | 显示全部楼层
谢谢谢谢谢谢!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 18:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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