HT66F004系列MCU EEPROM读写C模块:快速移植与应用

需积分: 25 11 下载量 199 浏览量 更新于2024-09-03 2 收藏 2KB TXT 举报
本文档主要介绍了如何在合泰公司的HT66F002/HT66F0025/HT66F003/HT66F004系列微控制器上使用EEPROM(Electrically Erasable Programmable Read-Only Memory)进行数据读写操作。这个模块提供了一个通用的C语言接口,可以方便地移植到不同的合泰MCU(Microcontroller Unit)中。 首先,文档定义了一些必要的预处理器宏,如`uchar`(用于8位无符号字符类型)、`uint`(用于无符号整型)、以及一些用于控制EEPROM操作的变量,如地址寄存器、数据寄存器、是否进入休眠状态等。`fun_eeprom_Write`函数是用于向EEPROM写入数据的关键部分,它接收一个地址和一个数据值作为参数。根据目标MCU的具体EEPROM类型(短地址或长地址),函数会设置相应的寄存器和控制位来开启写入模式,并确保写操作结束后关闭写保护。 对于短地址类型的EEPROM(如HT66F002和HT66F003),在写入前先检查WREN(Write Enable)状态,然后将地址寄存器和数据寄存器设置好,执行写操作,并在写入完成后重置WREN。对于长地址类型的EEPROM(如HT66F004),则需要额外设置地址范围,同时启用WREN和写入模式,等待写操作完成后再禁用WREN。 另一个函数`fun_eeprom_Read`负责从EEPROM读取数据,同样接收一个地址作为参数。它首先将地址加载到地址寄存器,然后根据EEPROM类型进行相应的操作。对于读取操作,通常不涉及写保护位的控制,而是直接读取数据并返回。 总结来说,该C程序模块提供了针对HT66F004系列MCU的EEPROM读写功能,通过灵活的接口设计可以适应不同类型的EEPROM,并确保了基本的错误处理和操作流程。这对于开发基于合泰MCU的项目时,管理和存储数据非常实用,特别是那些需要非易失性存储的场景。移植此代码到其他合泰MCU时,只需根据具体硬件配置调整相应的寄存器和宏定义即可。

Vector3f RayColor(const Ray& ray, Scene& scene, int depth=0, bool test=false){ HitInfo closest_hp; closest_hp.t = FLT_MAX; closest_hp.objIdx = -1; //光线和球求交 for (int i = 0; i < scene.ObjectCount(); ++i) { HitInfo ht; bool bhit = scene.GetObjectPtr(i)->Hit(ray, ht); if (bhit) { if (ht.t > 0 && ht.t<closest_hp.t) { closest_hp = ht; closest_hp.objIdx = i; } } } //这里图省事,直接把光照参数写在这边 Vector3f lightpos(0.0, 4, 2); Vector3f lightAmbient(0.6, 0.6, 0.6); Vector3f lightDiffuse(1.0, 1.0, 1.0); Vector3f lightSpecular(1.0, 1.0, 1.0); if (closest_hp.objIdx != -1) { int idx = closest_hp.objIdx; Material mtl = scene._scene[idx].second; //环境光 Vector3f ambient = Vector3f(lightAmbient[0]* mtl._Ka[0], lightAmbient[1] * mtl._Ka[1], lightAmbient[2] * mtl._Ka[2]); Vector3f color = ambient; bool isShadow = false; //shadow ray 求交 Ray shadow_ray(closest_hp.position, lightpos - closest_hp.position); //请在以下部分加入对shadow ray是否被场景遮挡的判断,并对isShadow这个变量进行修改 //请在以上部分加入对shadow ray是否被场景遮挡的判断,并对isShadow这个变量进行修改 Vector3f eyedir = (Vector3f(0, 0, 0) - closest_hp.position).normalized(); if(!isShadow) //如果不是阴影,继续计算 { //漫反射 Vector3f lightdir = (lightpos - closest_hp.position).normalized(); float coscoef = lightdir.dot(closest_hp.normal); if (coscoef < 0) coscoef = 0; Vector3f diffuse = Vector3f(0.8* mtl._Kd[0] * coscoef, 0.8 * mtl._Kd[1] * coscoef, 0.8 * mtl._Kd[2] * coscoef); Vector3f half = (eyedir + shadow_ray.Direction().normalized()).normalized(); float specularcoef = half.dot(closest_hp.normal); if (specularcoef < 0) specularcoef = 0; else specularcoef = pow(specularcoef, mtl._shiness); Vector3f specular = Vector3f(lightSpecular[0]* mtl._Ks[0] * specularcoef, lightSpecular[1] * mtl._Ks[1] * specularcoef, lightSpecular[2] * mtl._Ks[2] * specularcoef); color += diffuse + specular; }漫反射和镜面反射递归函数具体代码是什么

2023-06-03 上传
2023-06-09 上传