1、用实验验证,对于有数据的某扇区,如果没有擦除(Flash_erase),可否写入新数据?注:扇区号为学号 后2位,数据文本中要有姓名。
#define GLOBLE_VAR
#include "includes.h" //包含总头文件
int main(void)
{
uint32_t mMainLoopCount; //主循环次数变量
uint8_t mFlag; //灯的状态标志
uint32_t mLightCount; //灯的状态切换次数
uint8_t mK1[32]; //按照逻辑读方式从指定flash区域中读取的数据
uint8_t mK2[64]; //按照物理读方式从指定flash区域中读取的数据
uint8_t result; //判断扇区是否为空标识
DISABLE_INTER RUPTS;
mMainLoopCount=0; //主循环次数变量
mFlag='A'; //灯的状态标志
mLightCount=0; //灯的闪烁次数
gpio_init(LIGHT_BLUE,GPIO_OUTPUT,LIGHT_ON); //初始化蓝灯
ENABLE_INTERRUPTS;
//擦除第50扇区
flash_erase(50);
//向50扇区第0偏移地址开始写9个字节数据
flash_write(50,0,9,(uint8_t *) "qiuzheng!");
flash_read_logic(mK1,50,0,32); //从50扇区读取32个字节到mK1中
printf("逻辑读方式读取50扇区的32字节的内容: %s\n",mK1);
//不擦除第50扇区
//向50扇区第10偏移地址开始写64个字节数据
flash_write(50,10,64,(uint8_t *) "32106200050!");
flash_read_logic(mK2,50,0,64);
printf("逻辑读方式读取50扇区的64字节的内容: %s\n",mK2);
result = flash_isempty(50,MCU_SECTORSIZE); // 判断第50扇区是否为空
printf("第50扇区是否为空,1表示空,0表示不空:%d\n",result);
for(;;) //for(;;)(开头)
{
mMainLoopCount++;
if (mMainLoopCount<=12888999) continue;
mMainLoopCount=0;
if (mFlag=='L') //判断灯的状态标志
{
mLightCount++;
printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
mFlag='A'; //灯的状态标志
gpio_set(LIGHT_BLUE,LIGHT_ON); //灯“亮”
printf(" LIGHT_BLUE:ON--\n"); //串口输出灯的状态
}
else
{
mFlag='L'; //灯的状态标志
gpio_set(LIGHT_BLUE,LIGHT_OFF); //灯“暗”
printf(" LIGHT_BLUE:OFF--\n"); //串口输出灯的状态
}
}
}
//注释掉flash_write中的擦除构件
uint8_t flash_write(uint16_t sect,uint16_t offset,uint16_t N,uint8_t *buf)
{
//(1)定义变量
uint16_t i;
//(2)清除之前的编程导致的所有错误标志位
FLASH->SR &= 0xFFFFFFUL;
//(3.1)写入字节数后会跨扇区
if(offset+N>MCU_SECTORSIZE)
{
//(3.1.1)先写入第一个扇区
flash_write(sect,offset,MCU_SECTORSIZE-offset,buf);
//(3.1.2)再写入第二个扇区
flash_write(sect+1,0,N-(MCU_SECTORSIZE-offset),buf+(MCU_SECTORSIZE-offset));
}
//(3.2)写入字节数不会跨扇区
else
{
uint8_t data[MCU_SECTORSIZE]; //存储当前扇区的全部值
flash_read_logic(data,sect,0,MCU_SECTORSIZE); //将当前扇区的全部值读入数组中
//将要写入的数据依照对应位置写入数组中
for(i = 0;i<N;i++)
{
data[offset+i] = buf[i];
}
//擦除扇区
//flash_erase(sect);
//将数组写入扇区
flash_Best(sect,0,MCU_SECTORSIZE,data);
}
//(4)等待写入操作完成
while( (FLASH->SR & FLASH_SR_BSY) != 0U);
return 0; //成功执行
}
2、在ADC模块中,显示当前温度和芯片内部温度,感受温度变化(分别用冷、热触碰)。
#define GLOBLE_VAR
#include "includes.h" //包含总头文件
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)
{
uint32_t mMainLoopCount; //主循环次数变量
uint8_t mFlag; //灯的状态标志
uint32_t mCount; //延时的次数
uint32_t mLightCount; //灯的状态切换次数
uint16_t num_AD1;
uint16_t num_AD2;
uint16_t num_AD3;
uint16_t num_AD4;//芯片实际温度
uint16_t num_AD5;//热敏电阻实际温度
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;
printf("qz\n");
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_AD2 = adc_ave(ADC_CHANNEL_15,8);
num_AD3 = adc_ave(ADC_CHANNEL_TEMPSENSOR,8);
num_AD4= Regression_MCU_Temp(num_AD3);
num_AD5= Regression_Ext_Temp(num_AD2);
printf("通道15(GEC12、11)的A/D值:%d\r\n",num_AD2);
printf("热敏电阻实际温度:%d\r\n",num_AD5);
printf("内部温度传感器的A/D值:%d\r\n",num_AD3);
printf("芯片实际温度:%d\r\n\n",num_AD4);
mCount++;
} //for(;;)结尾
} //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;
}
触摸热敏电阻,发现热敏电阻温度迅速变化
触摸芯片表面,发现芯片温度很难变化
1、在adc实验中简单实现了模拟信号到数字信号的转变
2、flash实验中,擦除是将二进制的0变为1,写入是将二进制的1变为0,如果没进行擦除,写无法将0变为1,部分位出现错误,结果自然会出错