第八章作业

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,部分位出现错误,结果自然会出错      

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值