AT91 softpack 1.5 代码解读 基于 SAM7X EK 综合应用代码解读 文档编号 文档版本 Rev. A 文档摘要 基于 AT91SAM7X EK 开发板的代码解读,GPIO H161T01 代码解读 关键词 AT91SAM7X256 系统板 创建日期 2010 07 14 创建人员 Cust126 审核人员 Robin 文档类型 公开发布 / 开发板配套文件 版权信息 Mcuzone 原创文档, 转载请注明出处
更新历史 版本时间更新作者 Rev. A 2010 07 14 初始创建 Cust126 微控电子乐微电子杭州市登云路 639 号 2B143 销售 TEL:86 571 89908193 13957118045 支持 TEL:18913989166 13957118045 FAX:86 571 89908193 www.mcuzone.com www.atarm.com
1. 概述 本文档以 SAM7X EK 为硬件平台,IAR EWARM 为编译器平台, 使用 J Link 作为调试工具, 演示并解读 AT91SAM7X256 的综合应用操作流程 2. 综合应用操作 2.1 综合应用操作的目的与功能描述 主要是熟悉 SAM7X EK 为硬件平台, 并对小的应用程序模块综合起来进行项目的开发 实现的功能是每隔 1s AD 采集一次数据并把数据存储在 DATAFLASH 中去, 其中 DATAFLASH 前面几个数据为当前系统时间 采集的数据在 LCD 上显示 2.2.1 main 函数代码注释解读 下面对主要代码进行注释解读, 首先是 main 函数内容 : int main(void) int i; // Enable DBGU struct tm *rtc_time; TRACE_CONFIGURE(DBGU_STANDARD, 115200, BOARD_MCK); printf(" Basic RTT Project %s \n\r", SOFTPACK_VERSION); printf(" %s\n\r", BOARD_NAME); printf(" Compiled: %s %s \n\r", DATE, TIME );
PIO_Configure(pins, PIO_LISTSIZE(pins)); AT91C_BASE_PMC >PMC_PCER = 1 << AT91C_ID_TWI; TWI_Configure(AT91C_BASE_TWI, TWCK, BOARD_MCK); TWID_Initialize(&twid, AT91C_BASE_TWI); AIC_ConfigureIT(AT91C_ID_TWI, 0, ISR_Twi); AIC_EnableIT(AT91C_ID_TWI); pcf8563_init(); SetDatetime(); ConfigureLeds(); LCD_CS_1; LCD_SCL_1; LCD_RST_1; LCD_SCL_1; LCD_DC_1; LCD_init(); LCD_test(); #ifdef PINS_ADC PIO_Configure(pinsADC, PIO_LISTSIZE(pinsADC)); #endif // Configure RTT AT91F_CfgSPIForDataFlash(); ADC_Initialize( AT91C_BASE_ADC, AT91C_ID_ADC, AT91C_ADC_TRGEN_DIS, 0, AT91C_ADC_SLEEP_NORMAL_MODE, AT91C_ADC_LOWRES_10_BIT, BOARD_MCK, BOARD_ADC_FREQ, 10, 1200); ADC_EnableChannel(AT91C_BASE_ADC, ADC_NUM_1); ADC_EnableChannel(AT91C_BASE_ADC, ADC_NUM_2); AIC_ConfigureIT(AT91C_ID_ADC, 5, ISR_Adc);
AIC_EnableIT(AT91C_ID_ADC); printf(" I Press any key to perform a measurement on the ADC...\n\r"); ConfigureRtt(); // User input loop while (1) rtc_time = GetDatetime(); delay_ms(1000); ti[0]=rtc_time >tm_hour; ti[1]=rtc_time >tm_min; ti[2]=rtc_time >tm_sec; DisplayString("mcuzone",4,0); DisplayString("counter:",0,1); DisplayChar(i+48,9,1); DisplayString("ADC:",0,2); DisplayChar(temp[3]+48,6,2); DisplayChar(temp[2]+48,7,2); DisplayChar(temp[1]+48,8,2); DisplayChar(temp[0]+48,9,2); DisplayString("mV",10,2); // 显示 ADC 采集的数据 DisplayString("time",5,3); // 显示系统时间 DisplayChar((rtc_time >tm_hour/10)%10+48,0,4); DisplayChar(rtc_time >tm_hour%10+48,1,4); DisplayString(":",2,4); DisplayChar((rtc_time >tm_min/10)%10+48,3,4); DisplayChar(rtc_time >tm_min%10+48,4,4); DisplayString(":",5,4); DisplayChar((rtc_time >tm_sec/10)%10+48,6,4); DisplayChar(rtc_time >tm_sec%10+48,7,4); 下面是对子函数的解读 : void ISR_Rtt(void) unsigned int status;
unsigned int id_channel; unsigned int i,j,u; // Get RTT status status = RTT_GetStatus(AT91C_BASE_RTTC); n++; // Start measurement if ((status & AT91C_RTTC_RTTINC) == AT91C_RTTC_RTTINC) m=rtt_gettime(at91c_base_rttc); //DBGU_GetChar(); conversiondone = 0; ADC_EnableIt(AT91C_BASE_ADC, ADC_NUM_1); ADC_EnableIt(AT91C_BASE_ADC, ADC_NUM_2); //printf("time: %u\n\r", RTT_GetTime(AT91C_BASE_RTTC)); //printf("m: %u\n\r", m); ADC_StartConversion(AT91C_BASE_ADC); while( conversiondone!= ((1<<ADC_NUM_1) (1<<ADC_NUM_2)) ); for(id_channel=adc_num_2;id_channel<=adc_num_2;id_channel++) Buffer[m%264]=ConvHex2mV(ADC_GetConvertedData(AT91C_BASE_ADC, id_channel)); //Buffer[m]=ADC_GetConvertedData(AT91C_BASE_ADC, id_channel); printf("buffer[%d]: %u\n\r", (m%264),buffer[m%264]); temp[0]=buffer[m%264]%10; temp[1]=(buffer[m%264]/10)%10; temp[2]=(buffer[m%264]/100)%10; temp[3]=(buffer[m%264]/1000)%10; // 数据转换 if(n==264) n=0; q++; if(q==8192) q=0;
//########################################################################## // 初始化 SPI_DataFlash AT91F_CfgSPIForDataFlash(); // 擦除 DATAFLASH 的某一页 ( 第 10 页 ) //AT91F_USRT_Printk((AT91PS_USART)AT91C_BASE_DBGU,"Erase one pages!\n\r"); printf("erase %4d pages!\n\r",q); // 等待 DATAFLASH 准备好 // 擦除 DATAFLASH while(at91f_dataflashpageerase (&DataFlash,(unsigned char*)buffer_dataflash,(q*dataflash.pdevice >pages_size),(dataflash.pdevice >pages_size) )!=DATAFLASH_OK); // 等待擦除完 // 写 DATAFLASH 的某一页 ( 第 10 页 ) //AT91F_USRT_Printk((AT91PS_USART)AT91C_BASE_DBGU,"Write one pages!\n\r"); printf("write %4d pages!\n\r",q); // 写入时数据转换 for(j=0;j<4;j++) Buffer_Write_Dataflash[2*j]=((ti[j] >> 8)&0xff); Buffer_Write_Dataflash[2*j+1]=(ti[j]&0x00ff); for(j=4;j<264;j++) Buffer_Write_Dataflash[2*j]=((Buffer[j] >> 8)&0xff); Buffer_Write_Dataflash[2*j+1]=(Buffer[j]&0x00ff); for(i=0;i<buffer_size_dataflash;i++) Buffer_Dataflash[i]=Buffer_Write_Dataflash[i]; // 等待 DATAFLASH 准备好 // 写数据到 DATAFLASH while(at91f_dataflashpagepgmbuf(&dataflash,(unsigned char*)buffer_dataflash,(q*dataflash.pdevice >pages_size),(dataflash.pdevice >pages_size) )!=DATAFLASH_OK);
// 等待写完 // 读 DATAFLASH 的某一页 ( 第 10 页 ) //AT91F_USRT_Printk((AT91PS_USART)AT91C_BASE_DBGU,"Read one pages!\n\r"); printf("read %4d pages!\n\r",q); for(i=0;i<buffer_size_dataflash;i++) Buffer_Dataflash[i] = 0x00; // 等待 DATAFLASH 准备好 // 从 DATAFLASH 读数据 while(at91f_dataflashpageread(&dataflash,(q*dataflash.pdevice >pages_size),(unsigned char*)buffer_dataflash,(dataflash.pdevice >pages_size) )!=DATAFLASH_OK); // 等待读完 for(i=0;i<buffer_size_dataflash;i++)buffer_read_dataflash[i]=buffer_dataflash[i]; // 比较写入与读出的数据, 如果不相等, 则数据出错 //for(i=0;i<buffer_size_dataflash;i++) // //if(i>=20) // //if(buffer_read_dataflash[i]!=2) //AT91F_USRT_Printk((AT91PS_USART)AT91C_BASE_DBGU,"the data is error test is failure!\n\r"); break; // //else // //if(buffer_read_dataflash[i]!=buffer_write_dataflash[i]) break; //AT91F_USRT_Printk((AT91PS_USART)AT91C_BASE_DBGU,"the data is error test is failure!\n\r"); // printf("%4d",buffer_read_dataflash[i]);
// //if(i==buffer_size_dataflash) AT91F_USRT_Printk((AT91PS_USART)AT91C_BASE_DBGU,"the test is right!\n\r");// 写入如读出的数据相等 for(j=0;j<264;j++) BufferOUT[j]=(( Buffer_Read_Dataflash[2*j] << 8 ) ( Buffer_Read_Dataflash[2*j+1] & 0x00ff )); printf("%4d",bufferout[j]); printf("\n\r"); AT91F_SPI_Close(AT91C_BASE_SPI0); 其余的子函数都在之前发布的技术文档里有解释, 在这里就不在重复叙述了