用实验验证,对于有数据的某扇区,如果没有擦除(Flash_erase),可否写入新数据?注:扇区号为学号后2位,数据文本中要有姓名。
int main(void)
{
//(1)======启动部分(开头)==========================================
//(1.1)声明main函数使用的局部变量
uint32_t mMainLoopCount; //主循环次数变量
uint8_t mFlag; //灯的状态标志
uint32_t mLightCount; //灯的状态切换次数
uint8_t mK1[32]; //按照逻辑读方式从指定flash区域中读取的数据
uint8_t mK2[32]; //按照物理读方式从指定flash区域中读取的数据
uint8_t flash_test[32]={'A','B','C','D','E','F','G',' ','t',
'o',' ','S','o','o','c','h','o','w',' ',
'U','n','i','v','e','r','s','i','t','y','!'};
uint8_t result; //判断扇区是否为空标识
//(1.2)【不变】关总中断
DISABLE_INTERRUPTS;
//(1.3)给主函数使用的局部变量赋初值
mMainLoopCount=0; //主循环次数变量
mFlag='A'; //灯的状态标志
mLightCount=0; //灯的闪烁次数
//(1.4)给全局变量赋初值
//(1.5)用户外设模块初始化
gpio_init(LIGHT_BLUE,GPIO_OUTPUT,LIGHT_ON); //初始化蓝灯
//(1.6)使能模块中断
//(1.7)【不变】开总中断
ENABLE_INTERRUPTS;
//(1)======启动部分(结尾)==========================================
//擦除第50扇区
//flash_erase(24);
//向50扇区第0偏移地址开始写32个字节数据
flash_write(24,0,32,(uint8_t *) "I am SunChengShen!");
flash_read_logic(mK1,24,0,32); //从50扇区读取32个字节到mK1中
printf("逻辑读方式读取50扇区的32字节的内容: %s\n",mK1);
//擦除第50扇区
//flash_erase(24);
//向50扇区写32个字节数据
flash_write_physical(0x8019000,32,flash_test);
flash_read_physical(mK2,0x8019000,32); //从50扇区读取32个字节到mK2中
printf("物理读方式读取50扇区的32字节的内容: %s\n",mK2);
result = flash_isempty(50,MCU_SECTORSIZE); // 判断第50扇区是否为空
printf("第50扇区是否为空,1表示空,0表示不空:%d\n",result);
}
①进行擦除操作
②不进行擦除操作
对于有数据的某扇区,如果没有擦除(Flash_erase),仍可写入新数据。
在ADC模块中,显示当前温度和芯片内部温度,感受温度变化(分别用冷、热触碰)。
void Delay_ms(uint16_t u16ms);
float Regression_Ext_Temp(uint16_t tmpAD); //环境温度AD值转为实际温度
float Regression_MCU_Temp(uint16_t mcu_temp_AD); //MCU温度AD值转为实际温度
//----------------------------------------------------------------------
//主函数,一般情况下可以认为程序从此开始运行(实际上有启动过程,参见书稿)
int main(void)
{
//(1)======启动部分(开头)==========================================
//(1.1)声明main函数使用的局部变量
uint32_t mMainLoopCount; //主循环次数变量
uint8_t mFlag; //灯的状态标志
uint32_t mCount; //延时的次数
uint32_t mLightCount; //灯的状态切换次数
uint16_t num_AD1;
uint16_t num_AD2;
uint16_t num_AD3;
//(1.2)【不变】关总中断
DISABLE_INTERRUPTS;
//(1.3)给主函数使用的局部变量赋初值
mMainLoopCount=0; //主循环次数变量
mFlag='A';
mLightCount=0; //灯的闪烁次数
mCount=0;//记次数
//(1.4)给全局变量赋初值
//(1.5)用户外设模块初始化
gpio_init(LIGHT_BLUE,GPIO_OUTPUT,LIGHT_ON); //初始化蓝灯
adc_init(ADC_CHANNEL_1,AD_DIFF); //初始化ADC通道1,
adc_init(ADC_CHANNEL_15,AD_DIFF); //初始化ADC通道15
adc_init(ADC_CHANNEL_TEMPSENSOR,AD_SINGLE); //初始化ADC通道:内部温度
emuart_init(UART_User,115200);
//(1.6)使能模块中断
uart_enable_re_int(UART_User);
//(1.7)【不变】开总中断
ENABLE_INTERRUPTS;
//(1)======启动部分(结尾)==========================================
//(2)======主循环部分(开头)========================================
for(;;) //for(;;)(开头)
{
//(2.1)主循环次数变量+1
mMainLoopCount++;
//(2.2)未达到主循环次数设定值,继续循环
//延时1秒
if (mMainLoopCount<=3000000) continue;
//(2.3)达到主循环次数设定值,执行下列语句,进行灯的亮暗处理
//(2.3.1)清除循环次数变量
mMainLoopCount=0;
//(2.3.2)如灯状态标志mFlag为'L',灯的闪烁次数+1并显示,改变灯状态及标志
if (mFlag=='L') //判断灯的状态标志
{
mLightCount++;
mFlag='A'; //灯的状态标志
gpio_set(LIGHT_BLUE,LIGHT_ON); //灯“亮”
Delay_ms(1000);
}
//(2.3.3)如灯状态标志mFlag为'A',改变灯状态及标志
else
{
mFlag='L'; //灯的状态标志
gpio_set(LIGHT_BLUE,LIGHT_OFF); //灯“暗”
Delay_ms(1000);
}
num_AD1 = adc_ave(ADC_CHANNEL_1,8);
num_AD2 = adc_ave(ADC_CHANNEL_15,8);
num_AD3 = adc_ave(ADC_CHANNEL_TEMPSENSOR,8);
printf("通道1(GEC47、46)的A/D值: %d\r\n",num_AD1);
printf("通道15(GEC12、11)的A/D值:%d\r\n",num_AD2);
printf("内部温度传感器的A/D值:%d\r\n\n",num_AD3);
mCount++;
} //for(;;)结尾
//(2)======主循环部分(结尾)========================================
} //main函数(结尾)
void Delay_ms(uint16_t u16ms)
{
uint32_t u32ctr;
for(u32ctr = 0; u32ctr < 8000*u16ms; u32ctr++)
{
__ASM("NOP");
}
}
float Regression_Ext_Temp(uint16_t tmpAD)
{
float Vtemp,Rtemp,temp;
if(tmpAD<=72)
{
return -274;
}
Vtemp = (tmpAD*3300.0)/4096;
Rtemp = Vtemp/(3300.0 - Vtemp)*10000.0;
temp = (1/(log(Rtemp/10000.0)/3950.0 + (1/(273.15 + 25)))) - 273.15 + 0.5;
return temp;
}
float Regression_MCU_Temp(uint16_t mcu_temp_AD)
{
float mcu_temp_result;
mcu_temp_result=(float)(55+(100*((float)(mcu_temp_AD) - AD_CAL1))/(AD_CAL2 - AD_CAL1));
return mcu_temp_result;
}