⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 4k.lst

📁 针对at91sam7s64芯片实现产生pwm信号
💻 LST
字号:
ARM COMPILER V2.53,  4k                                                                    13/11/07  16:42:19  PAGE 1   


ARM COMPILER V2.53, COMPILATION OF MODULE 4k
OBJECT MODULE PLACED IN 4k.OBJ
COMPILER INVOKED BY: C:\Keil\ARM\BIN\CA.exe 4k.c THUMB DEBUG TABS(4) 

stmt  level    source

    1          /*
    2          *微镜转动一次采集4k的数据
    3          */
    4          
    5          
    6          #include "at91sam7s64.h"
    7          #include "lib_at91sam7s64.h"
    8          
    9          unsigned int SPI_Rx;
   10          unsigned short int AD_Result[4096],AD_Number;
   11          unsigned int T0RC=0x00000100;
   12          unsigned int T1RC=0x00001000;
   13          
   14          unsigned int PWM0_DUTY=0x200;
   15          unsigned char PWM_Frequce=50;
   16          
   17          unsigned char *PCrx;
   18          unsigned char PCRX_buff[5];
   19          unsigned char PCRX_state;       //接收状态标志,=0为等待接收,=1为正在接收,=2为接收完毕 
   20          unsigned char PCRX_timeout;
   21          
   22          unsigned char Cammand_state;   //命令标志,=0为待机,=1为启动AD,=2传输开始,
   23          
   24          #define  Idel           0;
   25          #define  Start_PWM      1;
   26          #define  Start_AD       2;
   27          #define  Trans_Data     3;
   28          
   29          /*******************************************************************************
   30               SPI读一个字节的数据 Read_Byte_SPI()
   31          *******************************************************************************/
   32          unsigned int Read_Byte_SPI(unsigned int SPI_DATA)             //SPI读一个字节的数据
   33          {
   34   1          *AT91C_SPI_TDR = SPI_DATA;  
   35   1          while((*AT91C_SPI_SR&AT91C_SPI_TXEMPTY) ==0) ;  //等待数据接收完成
   36   1          return (*AT91C_SPI_RDR & 0xffff);
   37   1      }
   38          
   39          
   40           void  Uart0_Interrupt(void)  __irq
   41          {       
   42   1      
   43   1         if(PCRX_state==0)                 //如果处于等待接受状态//
   44   1         {
   45   2              PCrx=PCRX_buff;                  //接收指针指向接收缓冲//
   46   2              PCRX_state=1;                    //接收状态置1//                   
   47   2              PCRX_timeout=0;                  //接收超时置0//
   48   2         }
   49   1         if(PCRX_state==1)                 //如果接收开始//
   50   1         {
   51   2             *PCrx++=(*AT91C_US0_RHR&0xff);                      //指针加一//
   52   2             PCRX_timeout=0;                   //接收超时置0/
   53   2         }
   54   1          *AT91C_AIC_EOICR = 0x00;    
   55   1      }   
   56          
   57          
   58          void timer0_c_irq_handler(void) __irq        //1us
   59          {
ARM COMPILER V2.53,  4k                                                                    13/11/07  16:42:19  PAGE 2   

   60   1              unsigned int i;
   61   1              SPI_Rx =0;
   62   1              
   63   1              *AT91C_PIOA_CODR=0x00040000;    //PIOA18-AD START 输出低电平,开始转换
   64   1              SPI_Rx=Read_Byte_SPI(0xD000);
   65   1              *AT91C_PIOA_SODR=0x00040000;    //PIOA18-AD START输出高电平,结束转换
   66   1      
   67   1              if(AD_Number==4096)     
   68   1              {                           
   69   2                  *AT91C_TC0_CCR = AT91C_TC_CLKDIS;   //一次4k数据采样结束,关闭 t0,等待把数据取走       
   70   2              //  *AT91C_TC1_CCR = AT91C_TC_SWTRG|AT91C_TC_CLKEN;     //打开t1 超时定时器,准备接收新的命 
   71   2                  AD_Number=0;
   72   2              }
   73   1              else 
   74   1              {
   75   2                  AD_Result[AD_Number++]=SPI_Rx;
   76   2              }
   77   1              *AT91C_TC0_RC = T0RC;                                               //RC赋值        
   78   1              i= *AT91C_TC0_SR;
   79   1              *AT91C_AIC_EOICR = 0x00;
   80   1      }
   81          
   82          //TIMER1作为串口超时计时器
   83          void timer1_c_irq_handler(void) __irq            //25ms
   84          {
   85   1         unsigned int i;
   86   1         if((*AT91C_PIOA_ODSR&0x000300)==0x000300)        //如果PIOA8输出高电平
   87   1              *AT91C_PIOA_CODR=0x000300;                  //PIOA8输出低电平
   88   1         else 
   89   1              *AT91C_PIOA_SODR=0x000300;                  //PIOA8输出高电平
   90   1                        
   91   1         if(PCRX_state==1)                //如果接收开始//
   92   1         {
   93   2            if(PCRX_timeout>20)            //并且超时20次//
   94   2              {
   95   3                  PCRX_state=2;             //接收成功//
   96   3              //  *AT91C_TC1_CCR =AT91C_TC_CLKDIS; //关闭t1,
   97   3              }
   98   2            else PCRX_timeout++;               //接收开始但超时<20次,接收超时加一//
   99   2         }
  100   1         *AT91C_TC1_RC = T1RC;                  //定时预设值*/ 
  101   1         i=*AT91C_TC1_SR;   
  102   1         *AT91C_AIC_EOICR = 0x00;
  103   1      }
  104          
  105          void Uart_PackgeProce(void)
  106          {
  107   1         unsigned char i;
  108   1         if((PCRX_buff[0]==0xff)&&(PCRX_buff[4]==0x55))       //如果首尾数据标准正确
  109   1         {
  110   2              switch(PCRX_buff[1])                            //命令状态判断
  111   2                  {                                      
  112   3                   case 0:  Cammand_state=Idel;           break;
  113   3                   case 1:  Cammand_state=Start_PWM;       break;
  114   3                   case 2:  Cammand_state=Start_AD        break;
  115   3                   case 3:  Cammand_state=Trans_Data;     break;
  116   3                   default :                              break;
  117   3                  }
  118   2              if((PCRX_buff[2]>0)&&(PCRX_buff[2]<60))     //如果频率数在范围之内
  119   2                  {
  120   3                     PWM_Frequce= PCRX_buff[2]; 
  121   3                     T0RC= 47923200/(PWM_Frequce*4096*2);     //每个微镜周期采集4k的数据 
  122   3                  }
  123   2         }
  124   1          for(i=0;i<5;i++)                                 //接收缓存清零
  125   1          PCRX_buff[i]=0;
ARM COMPILER V2.53,  4k                                                                    13/11/07  16:42:19  PAGE 3   

  126   1      }
  127          
  128          void   Uart0_init(void)
  129          {     
  130   1             *AT91C_PMC_PCER = (unsigned int)1<<AT91C_ID_US0;                  //允许US0口的时钟 
  131   1             *AT91C_PIOA_PDR = AT91C_PIO_PA5 | AT91C_PIO_PA6;                  //PA4、5设为外设
  132   1             *AT91C_PIOA_ASR = AT91C_PIO_PA5 | AT91C_PIO_PA6;                  //PA4、5设为外设A
  133   1             *AT91C_US0_CR = AT91C_US_RXEN  | AT91C_US_TXEN;
  134   1      
  135   1              *AT91C_US0_MR=AT91C_US_USMODE_NORMAL |  /* Normal Mode */
  136   1                        AT91C_US_CLKS_CLOCK    |  /* Clock = MCK */
  137   1                        AT91C_US_CHRL_8_BITS   |  /* 8-bit Data  */
  138   1                        AT91C_US_PAR_NONE      |  /* No Parity   */
  139   1                        AT91C_US_NBSTOP_1_BIT;    /* 1 Stop Bit  */
  140   1              //普通USART模式,主时钟,8字节数据,无效验
  141   1      
  142   1             *AT91C_US0_BRGR=(unsigned int) (47923200/(9600*16)) ;     //波特率9600
  143   1             *AT91C_US0_IER =AT91C_US_RXRDY ;
  144   1             AT91C_AIC_SVR[AT91C_ID_US0]=(unsigned int)*Uart0_Interrupt;
  145   1             *AT91C_AIC_IECR = 1<<AT91C_ID_US0;                                  //打开AIC中断      
  146   1      }
  147          
  148          unsigned char putchar (unsigned char ch)
  149          {                                               
  150   1        while (!((*AT91C_US0_CSR) & AT91C_US_TXRDY));   
  151   1        return (*AT91C_US0_THR = ch);                 
  152   1      }
  153          void printf(  unsigned char *s)             
  154          {
  155   1           while (*s) 
  156   1           {
  157   2              putchar(*s);
  158   2              s++;
  159   2           }
  160   1      }
  161          
  162          
  163          void Sys_init()
  164          {
  165   1           *AT91C_WDTC_WDMR=AT91C_WDTC_WDDIS;    //禁用看门狗
  166   1           *AT91C_PMC_SCER |= AT91C_PMC_PCK2;     //PCK2输出
  167   1           AT91C_PMC_PCKR[2]=AT91C_PMC_CSS_PLL_CLK|AT91C_PMC_PRES_CLK_2;
  168   1           *AT91C_PMC_MOR=((AT91C_CKGR_OSCOUNT &(0X06<<8)|AT91C_CKGR_MOSCEN)); //主振荡器使能,指定慢时钟周期乘以8

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -