一、用实验验证,对于有数据的某扇区,如果没有擦除(Flash_erase),可否写入新数据?
main.c:
#define GLOBLE_VAR
#include "includes.h" //包含总头文件
int main(void)
{
//声明main函数使用的局部变量
uint8_t mK1[32]; //读取32字节数据
uint8_t mK2[65]; //读取65字节数据
//关总中断
DISABLE_INTERRUPTS;
//开总中断
ENABLE_INTERRUPTS;
printf("------------------------------------------------------\n");
printf("验证对于有数据的某扇区,如果没有擦除(Flash_erase),可否写入新数据\n");
printf("------------------------------------------------------\r\n");
//擦除第60扇区
flash_erase(60);
//向60扇区第0偏移地址开始写32个字节数据
printf("向60扇区写入32个字节数据\n");
flash_write(60,0,32,(uint8_t *) "32106100060_CA");
flash_read_logic(mK1,60,0,32); //从60扇区读取32个字节到mK1中
printf("读取60扇区的32字节的内容: %s\n",mK1);
//向60扇区第33偏移地址开始写32个字节数据
printf("不擦除继续向60扇区写入32个字节数据\n");
flash_write(60,33,65,(uint8_t *) "CA_32106100060");
flash_read_logic(mK2,60,0,65); //从60扇区读取65个字节到mK2中
printf("读取60扇区的65字节的内容: %s\n",mK2);
}
打开工程文件:
图中可知,对于有数据的某扇区,如果没有擦除(Flash_erase),不能写入新数据
二、在ADC模块中,显示当前温度和芯片内部温度,感受温度变化(分别用冷、热触碰)
main.c:
#define GLOBLE_VAR
#include "includes.h" //包含总头文件
//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)
{
//声明main函数使用的局部变量
uint16_t num_AD1;
uint16_t num_AD2;
uint16_t num_AD3;
float ext_temp; //外部温度
float mcu_temp; //MCU温度
//关总中断
DISABLE_INTERRUPTS;
//用户外设模块初始化
adc_init(ADC_CHANNEL_15,AD_DIFF); //初始化ADC通道15:热敏电阻
adc_init(ADC_CHANNEL_TEMPSENSOR,AD_SINGLE); //初始化ADC通道:内部温度
//开总中断
ENABLE_INTERRUPTS;
printf("------------------------------------------------------\n");
printf("分别通过触摸芯片表面和热敏电阻,引起A/D值变化 \n");
printf("显示芯片内部温度和热敏电阻当前温度 \n");
printf("------------------------------------------------------\n");
while(1){
num_AD2 = adc_ave(ADC_CHANNEL_15,8); // 读取通道15的平均AD值
num_AD3 = adc_ave(ADC_CHANNEL_TEMPSENSOR,8); // 读取内部温度传感器的平均AD值
ext_temp = Regression_Ext_Temp(num_AD2); // 计算热敏温度
mcu_temp = Regression_MCU_Temp(num_AD3); // 计算MCU温度
printf("CA热敏电阻的A/D值:%d\n", num_AD2);
printf("CA热敏电阻的温度: %.2f¡ãC\n", ext_temp);
printf("CA内部温度传感器的A/D值:%d\n", num_AD3);
printf("CA芯片内部温度: %.2f¡ãC\r\n\n", mcu_temp);
Delay_ms(3000); // 延时3秒
}
}
//======以下为主函数调用的子函数===========================================
//======================================================================
//函数名称:Delay_ms
//函数返回:无
//参数说明:无
//功能概要:延时 - 毫秒级
//======================================================================
void Delay_ms(uint16_t u16ms)
{
uint32_t u32ctr;
for(u32ctr = 0; u32ctr < 8000*u16ms; u32ctr++)
{
__ASM("NOP");
}
}
//============================================================================
//函数名称:Regression_Ext_Temp
//功能概要:将读到的环境温度AD值转换为实际温度
//参数说明:tmpAD:通过adc_read函数得到的AD值
//函数返回:实际温度值
//============================================================================
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;
}
//============================================================================
//函数名称:Regression_MCU_Temp
//功能概要:将读到的mcu温度AD值转换为实际温度
//参数说明:mcu_temp_AD:通过adc_read函数得到的AD值
//函数返回:实际温度值
//============================================================================
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;
}
触摸芯片表面:
触摸热敏电阻:
冷触碰: