[作业]嵌入式第8章:Flash和ADC

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函数(结尾)

实验现象:

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值