uint8_t W25Q16_Init(void) { // uint16_t temp; W25Q16_Configuration(); /* SPI引脚配置及初始化 */ if(SPI_Flash_ReadID()==W25Q16_ID) { // printf("\r\n W25Q16 ID is 0x%x \r\n", temp); return 0; } else return 1; }
/**************************************************************************** * 名 称:FS_Init * 功 能:初始化系统配置,小车配置等信息 * 参 数:无 * 反 回:无 * 说 明: ****************************************************************************/ void FS_Init(void) { #if SPI_FLASH_DEBUG u16 ChipID = 0; #endif SPI_Flash_Init(); #if SPI_FLASH_DEBUG ChipID = SPI_Flash_ReadID(); if((ChipID & FLASH_ID) == FLASH_ID) printf("Read SPI Flash Chip ID Success\r\n"); else printf("Read SPI Flash Chip ID Error\r\n"); #endif SPI_Flash_Read( CAR_CFG_OFFSET, (u8*)&Car_Save_Info, sizeof(Car_Save_Info)); if( strcmp( Car_Save_Info.CheckStr , CAR_CHECK_STR) != NULL ) { #if SPI_FLASH_DEBUG printf("Read CarPara Error,Write to Default Info\r\n"); #endif memset( (char*)&Car_Save_Info, 0x00, sizeof(Car_Save_Info)); sprintf(Car_Save_Info.CheckStr,"%s",CAR_CHECK_STR); Car_Save_Info.CarPara.RunMode = CAR_MODE_MANUAL; Car_Save_Info.CarPara.SetSpeed = 15; SPI_Flash_Write( CAR_CFG_OFFSET, (unsigned char *)&Car_Save_Info, sizeof(Car_Save_Info)); } #if SPI_FLASH_DEBUG printf("Read CarPara Success\r\n"); #endif SPI_Flash_Read( ROUTE_CFG_OFFSET, (u8*)&Route_Save_Info, sizeof(Route_Save_Info)); if( strcmp( Route_Save_Info.CheckStr , ROUTE_CHECK_STR) != NULL ) { #if SPI_FLASH_DEBUG printf("Read Route Error,Write to Default Info\r\n"); #endif memset( (char*)&Route_Save_Info, 0x00, sizeof(Route_Save_Info)); sprintf(Route_Save_Info.CheckStr,"%s",ROUTE_CHECK_STR); SPI_Flash_Write( ROUTE_CFG_OFFSET, (unsigned char *)&Route_Save_Info, sizeof(Route_Save_Info)); } #if SPI_FLASH_DEBUG printf("Read Route Success\r\n"); #endif }
//初始化SPI FLASH的IO口 void SPI_Flash_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE ); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4; //SPI CS GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4); SPI1_Init(); //初始化SPI SPI1_SetSpeed(SPI_BaudRatePrescaler_4); //设置为18M时钟,高速模式 SPI_FLASH_TYPE=SPI_Flash_ReadID();//读取FLASH ID. }
//初始化SPI FLASH的IO口 void SPI_Flash_Init(void) { RCC->APB2ENR|=1<<3; //使能PORTB时钟 RCC->APB2ENR|=1<<5; //使能PORTD时钟 RCC->APB2ENR|=1<<8; //使能PORTG时钟 GPIOB->CRH&=0XFFF0FFFF; GPIOB->CRH|=0X00030000; //PB12 推挽 GPIOB->ODR|=1<<12; //PB12上拉 //这里pd2和pg7拉高,是为了防止NRF24L01和SD卡影响FLASH的烧写. //因为他们共用一个SPI口. GPIOD->CRL&=0XFFFFF0FF; GPIOD->CRL|=0X00000300; //PD2 推挽 GPIOD->ODR|=1<<2; //PD2上拉 GPIOG->CRL&=0X0FFFFFFF; GPIOG->CRL|=0X30000000; //PG7 推挽 GPIOG->ODR|=1<<7; //PG7 上拉 SPI2_Init(); //初始化SPI SPI2_SetSpeed(SPI_SPEED_2);//设置为18M时钟,高速模式 SPI_FLASH_TYPE=SPI_Flash_ReadID();//读取FLASH ID. }
int main(void) { u8 Data_PC[SIZE]; //从Flash中读取数据到Data_PC,并上传至上位机 u16 a,b=0; delay_init(); //延时函数初始化 NVIC_Configuration();//设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(9600); //串口初始化为9600 LED_Init(); //LED端口初始化 LCD_Init(); KEY_Init(); WORD_Init(); TIM2_Int_Init(999,7199); TIM3_Int_Init(9,7199); EXTIX_Init(); //外部中断初始化 Adc_Init(); //ADC初始化 SPI_Flash_Init(); //SPI FLASH 初始化 while(1) { //功能:开机状态显示 //说明:1.开机,绿灯亮(DS1) // 2.使用temp是为了避免重复执行该if语句 if(flag2==1&&temp==0) { while(SPI_Flash_ReadID()!=W25Q64) //检测不到W25Q64 { LCD_ShowString(40,150,200,16,16,"W25Q64 Check Failed!"); delay_ms(500); LCD_ShowString(40,150,200,16,16,"Please Check! "); delay_ms(500); LED0=!LED0;//DS0闪烁 } LCD_ShowString(60,130,200,16,16,"W25Q64 Ready!"); LED1=0; temp=1; } //功能:数据采集并保存至Flash中 //说明:1.使用temp1是为了避免重复使能TIM3 // 2.使用temp2是为了避免在数据上传至上位机的过程中,与终止上传功能相冲突 // 3.flag1=1代表按键按下,并开始采集 // 4.flag2=1代表开机,flag2=0代表未开机 // 5.采集过程中,红灯(DS0)以一定频率闪烁 if(flag2==1&&temp2==0&&flag1==1) { if(temp1==0) { LCD_ShowString(20,150,200,16,16,"Data collection began..."); TIM_Cmd(TIM3, ENABLE); //使能TIM3中断 LED0=0; } temp1=1; if(flag_cycle==0&&flag_cycle_1==0) { SPI_Flash_Write((u8*)TEXT_Buffer2,FLASH_SIZE+counter*SIZE,SIZE); counter++; flag_cycle_1=1; } if(flag_cycle==1&&flag_cycle_1==0) { SPI_Flash_Write((u8*)TEXT_Buffer1,FLASH_SIZE+counter*SIZE,SIZE); counter++; flag_cycle_1=1; } } //功能:将Flash中采集到的数据上传至上位机 //说明:1.使用temp1是为了保证上传是在采集之后进行 // 2.使用temp3是为了避免由于按键误操作使得该程序重复被执行 // 3.flag1=0代表按键再次被按下,上传开始 ;若再次被按下,则上传被终止;之后再按就没有作用了 // 4.上传过程中,红灯(DS0)以一定频率闪烁 if(temp1==1&&temp3==0&&flag1==0) { TIM_Cmd(TIM3, DISABLE); //失能TIM3中断 //用于解决当采集时间不是42ms的倍数时,部分采集数据未写入FLash的问题 if((time_collect-1)%42!=0) { data_residue=(time_collect-1)%42*6; if(flag_cycle==0) { SPI_Flash_Write((u8*)TEXT_Buffer2,FLASH_SIZE+(counter+1)*SIZE,SIZE); } if(flag_cycle==1) { SPI_Flash_Write((u8*)TEXT_Buffer1,FLASH_SIZE+(counter+1)*SIZE,SIZE); } } LCD_ShowString(20,170,200,16,16,"Data collection complete!"); LCD_ShowString(20,190,200,16,16,"Data is being uploaded..."); temp2=1; for(a=1;a<counter;a++) { LED0=!LED0; SPI_Flash_Read(Data_PC,FLASH_SIZE+a*SIZE,SIZE); for(b=0;b<SIZE;b++) { if(flag1==1) //上传中途使用按键停止传送 { break; } USART_GetFlagStatus(USART1, USART_FLAG_TC); USART_SendData(USART1,Data_PC[b]); while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); } if(flag1==1) //上传中途使用按键停止传送 { LCD_ShowString(20,210,200,16,16,"Data upload is terminated!"); break; } } //用于解决当采集时间不是42ms的倍数时,部分采集数据未写入FLash的问题 if(flag1!=1&&(time_collect-1)%42!=0) { LED0=!LED0; SPI_Flash_Read(Data_PC,FLASH_SIZE+(a+1)*SIZE,SIZE); for(b=0;b<data_residue;b++) { if(flag1==1) //上传中途使用按键停止传送 { break; } USART_GetFlagStatus(USART1, USART_FLAG_TC); USART_SendData(USART1,Data_PC[b]); while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); } if(flag1==1) //上传中途使用按键停止传送 { LCD_ShowString(20,210,200,16,16,"Data upload is terminated!"); break; } } if(flag1!=1) //要么显示数据上传完成,要么显示数据上传完成 { LCD_ShowString(20,210,200,16,16,"Data upload is completed!"); } temp3=1; } //功能:关机并擦除Flash //说明:1.flag2=0代表关机,与上temp1,temp2是要保证前面的已被执行 // 2.关机过程中擦除Flash,完成之后红绿灯同时亮一秒后灭 if(temp1==1&&temp2==1&&flag2==0) //关机机状态显示 { flag1=0; flag2=0; temp1=0; temp2=0; LED0=1; LED1=1; SPI_Flash_Erase_Chip(); LED0=0; LED1=0; delay_ms(1000); LED0=1; LED1=1; LCD_ShowString(80,230,200,16,16,"Shutdown!"); } } }