1、对于有数据的某扇区,如果没有擦除(Flash_erase),可否写入新数据?注:扇区号为学号后2位,数据文本中要有姓名。
警告:0到25扇区是bios扇区,禁止擦写
int main(void)
{
//(1)======启动部分(开头)==========================================
//(1.2)【不变】关总中断
DISABLE_INTERRUPTS;
//(1.7)【不变】开总中断
ENABLE_INTERRUPTS;
//(1)======启动部分(结尾)==========================================
uint16_t sect = 93; //被读写的扇区号,可选26至128
uint8_t mK1[32]; //按照逻辑读方式从指定flash区域中读取的数据
uint8_t result; //判断第sect扇区是否为空
//----------确认第sect扇区已清空----------
//擦除第sect扇区
flash_erase(sect);
//从sect扇区读取32个字节到mK1中
flash_read_logic(mK1,sect,0,32);
printf("逻辑读方式读取%d扇区的32字节的内容: %s\n",sect,mK1);
// 判断第sect扇区是否为空
result = flash_isempty(sect,MCU_SECTORSIZE);
printf("第%d扇区是否为空,1表示空,0表示不空:%d\n",sect,result);
//----------对第sect扇区写入初始数据----------
//擦除第sect扇区
flash_erase(sect);
//向sect扇区第0偏移地址开始写32个字节数据
flash_write(sect,0,32,(uint8_t *) "擦除后写入114,苏畅");
//从sect扇区读取32个字节到mK1中
flash_read_logic(mK1,sect,0,32);
printf("逻辑读方式读取%d扇区的32字节的内容: %s\n",sect,mK1);
// 判断第sect扇区是否为空
result = flash_isempty(sect,MCU_SECTORSIZE);
printf("第%d扇区是否为空,1表示空,0表示不空:%d\n",sect,result);
//----------尝试未擦除就写入数据----------
//向sect扇区第0偏移地址开始写32个字节数据
flash_write(sect,0,32,(uint8_t *) "未擦除写入514");
//从sect扇区读取32个字节到mK1中
flash_read_logic(mK1,sect,0,32);
printf("逻辑读方式读取%d扇区的32字节的内容: %s\n",sect,mK1);
// 判断第sect扇区是否为空
result = flash_isempty(sect,MCU_SECTORSIZE);
printf("第%d扇区是否为空,1表示空,0表示不空:%d\n",sect,result);
} //main函数(结尾)
根据该段实验代码验证得即使不擦除扇区也能写入数据,并且之前写入的数据会被全部擦除
2、在ADC模块中,显示当前温度和芯片内部温度,感受温度变化(分别用冷、热触碰)。
//----------------------------------------------------------------------
//声明使用到的内部函数
//main.c使用的内部函数声明处
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.2)【不变】关总中断
DISABLE_INTERRUPTS;
//(1.5)用户外设模块初始化
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)======主循环部分(开头)========================================
uint32_t mMainLoopCount=0; //主循环次数变量
uint32_t mCount=0; //延时的次数
for(;;) //for(;;)(开头)
{
//(2.1)主循环次数变量+1
mMainLoopCount++;
//(2.2)未达到主循环次数设定值,继续循环
//延时1秒
if (mMainLoopCount<=5000000) continue;
//(2.3.1)清除循环次数变量
mMainLoopCount=0;
uint16_t num_AD2 = adc_ave(ADC_CHANNEL_15,8);//通道15(GEC12、11)的A/D值
uint16_t num_AD3 = adc_ave(ADC_CHANNEL_TEMPSENSOR,8);//内部温度传感器的A/D值
float extTemp = Regression_Ext_Temp(num_AD2);//环境温度AD值转换为实际温度
float mcuTemp = Regression_MCU_Temp(num_AD3);//mcu温度AD值转换为实际温度
extTemp+=10,mcuTemp+=15;//测量温度有偏差,向上修正
printf("外部温度:%f\r\n",extTemp);
printf("CPU温度:%f\r\n\n",mcuTemp);
mCount++;
} //for(;;)结尾
//(2)======主循环部分(结尾)========================================
} //main函数(结尾)
实验现象: