📄 4k.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 + -