1. 项目概述与ISP缩放器核心价值在嵌入式视觉系统开发中图像信号处理器ISP的缩放模块Resizer 常缩写为RSZ是一个既基础又关键的环节。无论是安防摄像头需要将高分辨率视频流适配到不同显示屏幕还是移动设备为了节省带宽和计算资源而进行的图像下采样亦或是工业检测中需要将感兴趣区域ROI进行放大分析都离不开高质量的图像缩放。这个“缩放”动作远非简单的像素复制或删除其背后是一套精密的数学运算和硬件流水线而驱动这套流水线的正是我们开发者需要配置的一系列寄存器。TI的Camera ISP提供了一个高度可编程的RSZ模块其灵活性和性能在业内是出了名的但相应的其寄存器配置的复杂度也劝退了不少新手。手册上密密麻麻的寄存器位域描述像RSZ_CNT、RSZ_HFILT10这些初次接触时确实让人头疼。但一旦你掌握了其内在逻辑就会发现它其实是一套非常优雅和强大的工具。今天我就结合自己多年在嵌入式视觉项目中的踩坑经验来为大家深入拆解TI Camera ISP图像缩放器的寄存器配置与编程实战。我们不止看每个寄存器是“什么”更要弄懂“为什么”要这么配置以及在实际项目中“怎么用”才能避免那些恼人的图像瑕疵和性能瓶颈。2. 缩放器核心架构与工作流程解析在深入每个寄存器之前我们必须先建立起对TI ISP缩放器整体架构和工作流程的认知。这就像盖房子前先看蓝图理解了数据流向和控制逻辑后续的寄存器配置才会有的放矢。2.1 数据通路与工作模式TI ISP的RSZ模块支持两种主要的数据输入源这在RSZ_CNT.INPSRC位中有明确选择来自预览引擎PREVIEW或CCD控制器CCDC的实时数据流这是最常用的模式用于处理从图像传感器直接过来的、未经压缩的原始YUV数据。此时缩放器作为ISP流水线中的一个环节实时处理帧数据。来自内存SDRAM的已存储图像数据这种模式通常用于后处理比如对已经捕获并存储在内存中的一帧图像进行二次缩放或格式转换属于“内存到内存”的操作。这里有一个非常重要的细节手册里提到了但容易被忽略当输入源选择为0即来自PREVIEW/CCDC时如果CCDC和预览引擎同时试图向RSZ输送数据CCDC拥有优先级。这意味着在双路摄取的系统中你需要仔细规划数据流避免通道冲突。工作模式则由RSZ_PCR寄存器控制单次模式One-shotRSZ_PCR.ONESHOT1。模块使能ENABLE1后处理完一帧数据BUSY位拉高然后ENABLE位自动清零。这适用于内存到内存的操作或需要精确控制单帧处理的场景。连续模式ContinuousRSZ_PCR.ONESHOT0。模块使能后会持续处理输入源送来的帧数据直到软件主动将其禁用。这是处理实时视频流的典型模式。关键经验在配置连续模式处理视频流时务必注意RSZ_PCR.ENABLE位的描述——“必须是配置一帧的最后一个写入字段”。也就是说你在配置完所有尺寸、系数、地址寄存器后最后再写ENABLE1来启动这一帧的处理。顺序错了可能导致配置未生效或帧同步错乱。2.2 缩放原理与相位累加器TI的RSZ模块采用多相滤波Polyphase Filtering算法来实现任意比例的缩放这是其高质量输出的核心。理解这一点对配置滤波器系数至关重要。想象一下我们要把原图的宽度从W_in缩放到W_out。缩放比例因子R W_in / W_out。对于每个输出像素我们需要在输入图像上找到一个对应的“采样点”。这个点通常不是整数像素位置。相位累加器Phase Accumulator就是用来追踪这个非整数位置的。具体来说模块内部维护一个累加器初始值由RSZ_CNT.HSTPH水平起始相位设置。对于每个输出的像素累加器增加一个步进Δ 256 / (HRSZ 1)。这里的HRSZ就是我们配置在RSZ_CNT[9:0]的值。Δ的整数部分决定了在输入图像上跳过几个像素小数部分即相位决定了在两个输入像素之间进行插值的权重。为什么公式是256 / (HRSZ 1)这里涉及到一个定点数的技巧。256代表了一个完整的相位周期因为2^8256用8位小数表示。HRSZ的范围是64到1024HRSZ1的范围是65到1025。所以Δ的范围大约是0.25到3.94。当HRSZ255时Δ256/2561即输入输出为1:1不缩放。当HRSZ255时Δ1为上采样放大当HRSZ255时Δ1为下采样缩小。垂直方向同理使用VRSZ和VSTPH。这个基于相位累加的多相滤波架构使得RSZ能够以固定的硬件资源8个抽头的滤波器通过加载不同的系数集来适应不同的缩放比例和相位实现高质量的插值。2.3 滤波器系数与相位的关系这是整个配置中最精妙也最复杂的部分。手册中列出了从RSZ_HFILT10到RSZ_HFILT3130共16个寄存器垂直方向同理每个寄存器包含两个10位的滤波器系数COEFx。这些系数不是随意设置的它们对应着8抽头滤波器在不同相位下的系数值。手册的寄存器描述里其实隐含了映射关系例如RSZ_HFILT54的描述写着“Phase 0/1, tap 5/1”和“Phase 0/1, tap 4/0”。这需要解读TI的RSZ支持8个相位Phase 0-7。每个相位下滤波器有8个抽头Tap 0-7。但硬件为了节省寄存器资源采用了复用设计。RSZ_HFILT10存储了Phase 0下Tap 0和Tap 1的系数。RSZ_HFILT54则比较特殊它存储的COEF4对应Phase 0的Tap 4和Phase 1的Tap 0COEF5对应Phase 0的Tap 5和Phase 1的Tap 1。其他寄存器以此类推。为什么这么设计因为对于线性相位滤波器其系数具有对称性或规律性。通过巧妙的存储映射可以用有限的寄存器覆盖所有相位和抽头的组合。通常TI会提供一组推荐的“默认”滤波器系数用于通用的上采样和下采样。在大多数质量要求不是极端苛刻的场景下直接使用这组默认系数即可。当你有特殊的图像质量需求如需要更锐利或更柔和的缩放效果时才需要去深度定制这些系数。系数格式为S10Q8即有符号10位整数8位小数。这意味着系数范围是-2.0到1.996约等于2 - 1/256。1.0用十六进制表示就是0x100二进制01 0000 0000。在设置自定义系数时必须保证一组系数例如一个相位下的8个抽头之和为1即0x100否则会导致图像亮度漂移。3. 核心寄存器功能详解与配置实战理解了架构和原理我们现在可以逐个击破关键寄存器并给出具体的配置示例和代码片段。我会按照一个典型的配置流程来组织。3.1 基础控制与状态寄存器RSZ_PID (Peripheral ID Register)这是一个只读寄存器用于识别模块。TID字段标识这是Resizer模块0x10CID标识属于Camera ISP类0xFEPREV是版本号。在驱动初始化时读取此寄存器可以验证硬件是否正确连接和识别。RSZ_PCR (Peripheral Control Register)这是最重要的控制寄存器之一。BIT[0] ENABLE: 模块使能位。黄金法则在配置完所有其他参数后最后写入此位为1来启动一帧的处理。在连续模式下如果你想停止也要在合适的时机如帧间将其写0。BIT[1] BUSY: 只读状态位。为1表示模块正在处理一帧数据。在单次模式下你可以轮询此位当它从1变0时表示一帧处理完成。在连续模式下通常结合中断来管理。BIT[2] ONESHOT: 模式选择。0为连续模式1为单次模式。注意描述此位仅在输入源为CCDC或PREVIEW时有效。对于内存到内存的操作缩放器总是工作在单次模式。配置示例连续模式输入来自CCDC/PREVIEW// 假设 RSZ_BASE 是RSZ模块的基地址 volatile uint32_t *rsz_pcr (uint32_t*)(RSZ_BASE 0x0004); *rsz_pcr (0 2) | (0 1); // ONESHOT0 (连续模式), BUSY只读忽略 ENABLE0 (稍后设置)3.2 图像尺寸与输入输出配置这是配置的骨架决定了“从哪里拿数据”、“处理多大区域”、“放到哪里去”、“变成多大”。RSZ_IN_SIZE (Input Size Register)HORZ[12:0]: 输入图像的宽度像素数。范围0-4095。VERT[28:16]: 输入图像的高度行数。范围0-4095。注意这个尺寸定义的是缩放器实际会读取的输入区域不一定等于传感器输出的全分辨率。它可以和RSZ_IN_START配合实现ROI区域裁剪后再缩放。RSZ_IN_START (Input Start Register)HORZ_ST[12:0]: 水平起始像素。这里有个大坑当输入来自SDRAM时此值以像素为单位。对于16位YUV数据起始地址必须是偶数因为一个像素占2字节。手册建议设为15YUV16bit或318bit颜色分离数据这是为了满足内部FIFO的预取要求确保性能。当输入来自CCDC/PREVIEW时此值以字节为单位即像素数的两倍并且最低有效位需要用来反映像素起始位置。例如如果你想从第3个像素开始0-based索引那么HORZ_ST应该设置为(3*2) 6。如果起始位置是半像素在某些插值场景下你可能需要设置奇数值。务必仔细阅读手册相关描述。VERT_ST[28:16]: 垂直起始行。输入来自SDRAM时必须设为0来自CCDC/PREVIEW时定义从哪一行开始读取。RSZ_OUT_SIZE (Output Size Register)HORZ[11:0]: 输出图像的宽度。最大值限制为3312像素。如果使用7抽头滤波器且下采样率大于2:1则最大宽度为1650像素。此值必须为偶数。VERT[27:16]: 输出图像的高度。关键约束手册明确指出当垂直缩放因子大于1即上采样时写入SDRAM的字节数必须是16字节的倍数。这关系到内存总线效率。计算输出图像一行数据的字节数时宽度*每像素字节数需要确保是16的倍数必要时进行填充Padding。RSZ_SDR_INADD / RSZ_SDR_INOFF / RSZ_SDR_OUTADD / RSZ_SDR_OUTOFF这四个寄存器仅在输入或输出涉及SDRAM时使用。ADDR: 32位内存地址。硬件强制将低5位对齐到32字节边界即地址是32的倍数。对于输出地址RSZ_SDR_OUTADD为了最优SDRAM带宽利用强烈建议对齐到256字节边界。OFFSET: 行偏移量。指在内存中一行数据的结束到下一行数据开始之间的字节偏移。这允许处理非连续存储的图像如带有步长/跨距的缓冲区。同样低5位被硬件强制对齐输出偏移也建议256字节对齐。重要特性这些地址和偏移寄存器可以在RSZ忙碌时BUSY1被修改但修改只会对下一帧生效。这为实现双缓冲Ping-Pong Buffer或动态更新处理区域提供了便利。配置示例从CCDC取全幅图像缩放后存入SDRAM 假设输入为720p YUV422 (1280x720)输出为VGA (640x480)。// 1. 配置输入尺寸和起始来自CCDC全幅 volatile uint32_t *rsz_in_size (uint32_t*)(RSZ_BASE 0x0014); volatile uint32_t *rsz_in_start (uint32_t*)(RSZ_BASE 0x0010); *rsz_in_size (720 16) | (1280); // VERT720, HORZ1280 *rsz_in_start (0 16) | (0); // VERT_ST0, HORZ_ST0 (从第0个像素开始) // 2. 配置输出尺寸 volatile uint32_t *rsz_out_size (uint32_t*)(RSZ_BASE 0x000C); *rsz_out_size (480 16) | (640); // VERT480, HORZ640 // 3. 配置输出内存地址和偏移假设输出缓冲区为 out_buf extern uint8_t out_buf[]; uint32_t out_addr (uint32_t)out_buf; // 确保地址256字节对齐这里假设 out_buf 已对齐 volatile uint32_t *rsz_out_add (uint32_t*)(RSZ_BASE 0x0020); volatile uint32_t *rsz_out_off (uint32_t*)(RSZ_BASE 0x0024); *rsz_out_add out_addr; // 计算行偏移640像素 * 2字节/像素 1280字节。检查是否为16倍数1280 % 16 0 符合要求。 // 为了256字节对齐优化我们可以将偏移设为1280但1280不是256的倍数。如果为了极致性能可能需要填充到1280?256的倍数。 // 这里我们先按实际宽度设置。 *rsz_out_off 1280; // 一行640个YUV422像素占1280字节 // 4. 输入来自CCDC因此SDRAM输入地址和偏移寄存器保持为0或忽略不写。3.3 缩放比例与算法控制寄存器RSZ_CNT (Resizer Control Register)这是缩放行为的“大脑”。HRSZ[9:0]/VRSZ[19:10]: 水平和垂直缩放值。记住公式缩放步进 Δ 256 / (HRSZ1)。要得到目标缩放比例需要反推HRSZ。例如水平从1280缩放到640比例是0.5下采样。Δ 输入/输出 1280/640 2.0。那么HRSZ (256 / Δ) - 1 (256 / 2.0) - 1 128 - 1 127。所以HRSZ应配置为127。同理计算垂直方向。范围是64到1024对应的Δ范围大约是4.0到0.25即最大4倍下采样或4倍上采样。HSTPH[22:20]/VSTPH[25:23]: 水平和垂直起始相位。范围0-7。这决定了第一个输出像素在输入像素网格中的初始相位偏移。通常设为0。在需要微调图像位置或实现特定插值效果时调整。YCPOS[26]: YC位置。0表示16位字中[15:8]是Y亮度[7:0]是C色度1则相反。这必须与输入数据的打包格式严格匹配。INPTYP[27]: 输入类型。0表示YUV422交织格式Y、Cb、Y、Cr...1表示8位颜色分离数据。绝大多数情况用0。INPSRC[28]: 输入源选择。0为CCDC/PREVIEW1为内存。CBILIN[29]: 色度水平算法选择。这是保证色度处理质量的关键。0色度使用与亮度相同的处理即多相滤波。这仅适用于下采样。1色度使用双线性插值处理。这仅适用于上采样。为什么因为色度信息通常比亮度信息少在YUV422中水平方向色度是亮度的一半直接使用复杂的多相滤波在下采样时可能导致混叠而在上采样时双线性插值在质量和复杂度上是个不错的折中。务必根据缩放方向正确设置此位。配置示例续前例1280x720 - 640x480// 计算HRSZ和VRSZ // 水平: 1280 - 640, 比例 0.5, Δ_h 2.0 uint32_t hrsz_val (256 / 2) - 1; // 127 // 垂直: 720 - 480, 比例 0.666..., Δ_v 720/480 1.5 uint32_t vrsz_val (256 / 1.5) - 1; // 170.666... 取整 171? 这里需要精确计算 // 更精确的计算 VRSZ (256 * 输出高度 / 输入高度) - 1 vrsz_val (256 * 480 / 720) - 1; // (122880 / 720) - 1 170 - 1 169 // 检查范围169在64-1024之间有效。 // 配置RSZ_CNT volatile uint32_t *rsz_cnt (uint32_t*)(RSZ_BASE 0x0008); uint32_t cnt_val 0; cnt_val | (0 30); // RESERVED cnt_val | (0 29); // CBILIN: 下采样色度用和亮度相同的滤波(0) cnt_val | (0 28); // INPSRC: 来自CCDC/PREVIEW (0) cnt_val | (0 27); // INPTYP: YUV422交织 (0) cnt_val | (0 26); // YCPOS: YC顺序 (根据实际数据定假设为0) cnt_val | (0 23); // VSTPH: 垂直起始相位0 cnt_val | (0 20); // HSTPH: 水平起始相位0 cnt_val | (vrsz_val 10); // VRSZ cnt_val | (hrsz_val 0); // HRSZ *rsz_cnt cnt_val;3.4 滤波器系数寄存器组RSZ_HFILTxx和RSZ_VFILTxx系列寄存器。除非你有特殊的图像质量需求如需要极锐利的缩小或非常平滑的放大否则强烈建议使用TI提供的默认系数集。这些系数通常存储在驱动的头文件或系数表中。一个常见的做法是在驱动初始化时将一组预计算好的系数表一次性加载到这些寄存器中。系数表通常是一个二维数组coeff_table[8][8] 表示8个相位下每个相位8个抽头的系数。加载示例// 假设有一个默认的系数表 default_h_coeff[8][8] 和 default_v_coeff[8][8] 系数已转换为S10Q8格式的整数。 void rsz_load_default_coeff(void) { volatile uint32_t *base_h (uint32_t*)(RSZ_BASE 0x0028); // RSZ_HFILT10地址 volatile uint32_t *base_v (uint32_t*)(RSZ_BASE 0x0068); // RSZ_VFILT10地址 // 水平滤波器系数加载根据硬件复用规则 // 注意这里需要根据手册描述的复用关系将8x8的系数矩阵映射到16个寄存器对。 // 以下是一个简化示例实际映射需严格按照手册的Phase/Tap对应关系。 // 例如假设我们有一个函数将标准矩阵转换为硬件寄存器值。 uint32_t h_regs[16]; convert_coeff_matrix_to_regvals(default_h_coeff, h_regs); for(int i 0; i 16; i) { *(base_h i) h_regs[i]; // 依次写入 RSZ_HFILT10, RSZ_HFILT32, ... } // 垂直滤波器系数加载 uint32_t v_regs[16]; convert_coeff_matrix_to_regvals(default_v_coeff, v_regs); for(int i 0; i 16; i) { *(base_v i) v_regs[i]; } }核心技巧系数加载通常在初始化时完成一次即可除非你在运行时动态切换缩放算法。在视频流处理过程中频繁重写这些寄存器是不必要且可能影响性能的。3.5 亮度增强寄存器 (RSZ_YENH)RSZ_YENH是一个可选的后期处理模块用于增强图像的边缘锐度。其公式为Y_new Y_original HPF(Y_original) * max(GAIN, (|HPF(Y_original)| - CORE) * SLOP 8) 4。ALGO[17:16]: 选择高通滤波器HPF内核。0禁用1是[-1, 2, -1]/22是[-1, -2, 6, -2, -1]/4。后者通常能提供更精细的边缘检测。GAIN[15:12]: 最大增益U4Q4格式。这是施加在边缘上的最大增强倍数。SLOP[11:8]: 斜率U4Q4格式。控制边缘强度与增强幅度之间的比例关系。CORE[7:0]: 核心偏移U8Q0。这是一个阈值只有当边缘强度HPF的绝对值超过此阈值时增强才会根据斜率生效否则直接使用GAIN作为固定增强值。使用建议对于大多数自然图像轻微的亮度增强ALGO1,GAIN较小如0x2SLOP0CORE一个较小值如5可以提升主观清晰度而不引入过多噪点。对于文本或高对比度工业图像可以尝试更强的设置。务必在最终系统上通过视觉评估来调整这些参数过度增强会导致“白边”伪影Halos和噪声放大。4. 完整配置流程与编程框架将上述所有步骤串联起来一个稳健的RSZ模块初始化和帧处理流程如下4.1 初始化阶段硬件验证读取RSZ_PID寄存器确认模块存在且版本兼容。加载滤波器系数调用rsz_load_default_coeff()函数加载水平和垂直滤波器的默认系数。配置静态参数设置RSZ_CNT中的INPTYP、YCPOS、CBILIN根据数据格式和缩放方向等不会频繁改变的参数。配置亮度增强可选根据图像质量需求配置RSZ_YENH寄存器。配置工作模式在RSZ_PCR中设置ONESHOT位。如果是连续视频流设为0。4.2 每帧配置阶段以连续模式处理来自CCDC的视频流为例假设我们已经通过传感器驱动配置好CCDC并启动了数据流。计算参数根据当前需要的输入ROI (in_width,in_height,in_start_x,in_start_y) 和输出目标 (out_width,out_height)计算HRSZ、VRSZ、RSZ_IN_SIZE、RSZ_IN_START、RSZ_OUT_SIZE。重要检查确保out_width是偶数如果上采样VRSZ 255确保out_width * bytes_per_pixel是16的倍数。配置尺寸与地址写入RSZ_IN_SIZE和RSZ_IN_START。写入RSZ_OUT_SIZE。如果输出到SDRAM写入RSZ_SDR_OUTADD和RSZ_SDR_OUTOFF确保地址对齐。输入来自CCDCRSZ_SDR_INADD和RSZ_SDR_INOFF保持为0。更新缩放系数写入RSZ_CNT中的HRSZ、VRSZ、HSTPH、VSTPH。如果缩放方向改变如上采样变下采样可能需要更新CBILIN位并重新加载对应的滤波器系数尽管不常见。启动处理最后向RSZ_PCR寄存器写入ENABLE1。在连续模式下只需要在流开始的第一帧前做一次。模块会持续处理后续帧。状态监控可以通过轮询RSZ_PCR.BUSY位或配置相关中断来监控模块状态。在连续模式下通常使用帧结束中断来通知CPU一帧数据已就绪可以开始下一阶段处理如编码、显示。4.3 编程示例代码框架// 假设所有寄存器地址已宏定义 int rsz_configure_frame(uint32_t in_w, uint32_t in_h, uint32_t in_start_x, uint32_t in_start_y, uint32_t out_w, uint32_t out_h, uint32_t out_buf_addr) { // 1. 参数检查与计算 if (out_w 3312 || out_w % 2 ! 0) return -1; // 宽度超限或非偶 if (out_h 4095) return -1; // 检查上采样时的字节对齐YUV422为例每像素2字节 if ((256 * out_h / in_h) 256) { // 上采样判断简化VRSZ 255 if ((out_w * 2) % 16 ! 0) { // 需要填充或调整 out_w ((out_w * 2 15) / 16) * 16 / 2; // 向上对齐到满足16字节倍数 } } uint32_t hrsz (256 * out_w / in_w) - 1; uint32_t vrsz (256 * out_h / in_h) - 1; if (hrsz 64 || hrsz 1024 || vrsz 64 || vrsz 1024) return -1; // 缩放超限 uint32_t cbilin (hrsz 255) ? 1 : 0; // 上采样时色度用双线性 // 2. 配置尺寸和起始输入来自CCDC uint32_t horz_start_bytes in_start_x * 2; // YUV422 每像素2字节 // 根据手册可能需要调整最低位这里假设从完整像素开始 *RSZ_IN_START (in_start_y 16) | (horz_start_bytes ~0x1); // 确保字节地址偶数对齐 *RSZ_IN_SIZE (in_h 16) | (in_w); // 3. 配置输出 *RSZ_OUT_SIZE (out_h 16) | (out_w); // 确保输出地址32字节对齐这里假设调用者已保证 *RSZ_SDR_OUTADD out_buf_addr; uint32_t line_offset out_w * 2; // YUV422 *RSZ_SDR_OUTOFF line_offset; // 4. 更新缩放控制字 (保留其他已配置的位如INPTYP, YCPOS等) uint32_t cnt_val *RSZ_CNT; cnt_val ~((0x3FF 0) | (0x3FF 10) | (0x1 29)); // 清除HRSZ, VRSZ, CBILIN cnt_val | (hrsz 0) | (vrsz 10) | (cbilin 29); *RSZ_CNT cnt_val; // 5. 如果CBILIN改变可能需要重载系数这里简化处理实际可能不需要 // if (cbilin_changed) { rsz_load_coeff_for_upscale(); } return 0; // 配置成功 } void rsz_start_continuous_stream(void) { // 确保其他所有配置已完成 // 最后使能模块 uint32_t pcr_val *RSZ_PCR; pcr_val ~(1 2); // 确保ONESHOT0 (连续模式) pcr_val | (1 0); // ENABLE1 *RSZ_PCR pcr_val; }5. 常见问题排查与调试心得即使按照手册配置在实际项目中依然会遇到各种问题。下面是我总结的一些典型故障和排查思路。5.1 图像错乱、撕裂或颜色异常症状输出图像出现错位、部分数据错误、颜色通道混乱。排查检查YCPOS和INPTYP这是最常见的原因。确认输入数据是YUV422交织还是分离格式以及Y和C在16位字中的顺序。用逻辑分析仪或内存查看工具抓取输入到RSZ的数据与寄存器配置对比。检查内存地址对齐确认RSZ_SDR_INADD、RSZ_SDR_OUTADD、RSZ_SDR_INOFF、RSZ_SDR_OUTOFF的低5位是否为0。特别是输出检查是否满足“上采样时行字节数为16倍数”的约束。不对齐会导致DMA传输错位。检查RSZ_IN_START区分输入源是SDRAM还是CCDC单位是像素还是字节。配置错误会导致裁剪区域完全错误。检查输入/输出尺寸确认RSZ_IN_SIZE和RSZ_OUT_SIZE没有超过最大值且输出宽度为偶数。5.2 缩放比例不正确或图像扭曲症状输出图像尺寸不对或者图像被拉伸/压缩得不均匀。排查重新计算HRSZ/VRSZ使用公式HRSZ (256 * out_width / in_width) - 1进行精确计算并确保使用整数运算时没有溢出或精度损失。务必检查计算结果是否在64-1024范围内。验证RSZ_IN_SIZE和RSZ_OUT_SIZE确认你写入的宽度和高度值是正确的十进制数而不是十六进制或其他格式。检查相位累加器HSTPH和VSTPH通常设为0。非零值会在图像起始处引入一个微小的偏移可能导致边缘像素处理异常。5.3 图像模糊、有锯齿或振铃效应症状缩放后图像质量差细节丢失或边缘出现重影。排查确认滤波器系数已加载读取几个RSZ_HFILTxx寄存器的值确认不是全0。全0系数会导致输出为0。检查CBILIN设置下采样时必须设为0色度同亮度滤波上采样时建议设为1色度双线性。设反了会导致色度信息处理不当产生彩色锯齿或模糊。评估滤波器系数如果你使用的是自定义系数检查每个相位下8个抽头的系数和是否为0x1001.0。总和偏差会导致亮度增益或衰减。此外过于尖锐的滤波器系数会引起振铃效应边缘出现波纹过于平缓的则会导致模糊。RSZ_YENH是否过度增强尝试将RSZ_YENH.ALGO设为0禁用增强看是否改善。如果改善说明增强参数GAIN,SLOP,CORE设置过大。5.4 性能问题或数据丢失症状帧率下降或者部分帧数据丢失。排查检查BUSY状态和ENABLE时机在连续模式下确保你不是在每一帧都重复写ENABLE1。通常只需启动时写一次。重复写入可能导致状态机混乱。检查SDRAM带宽如果输出图像很大且SDRAM带宽紧张RSZ可能会停滞。确保输出内存地址和偏移是256字节对齐的以最大化突发传输效率。核对流水线时序如果RSZ的前端CCDC或后端DMA/显示模块配置不当导致数据生产或消费速率不匹配也会造成帧丢失。检查整个ISP流水线的时钟和时序配置。中断处理如果使用中断确保及时清除中断标志并且中断服务程序执行时间足够短避免错过下一帧。5.5 调试工具与方法寄存器打印在关键配置后将所有RSZ寄存器的值读出来打印到串口与预期值进行比对。内存数据快照在输入和输出缓冲区设置已知的测试图案如渐变色条、棋盘格处理后再读出输出缓冲区分析是否正确。使用TI的寄存器配置工具或脚本TI通常会提供一些参考软件或脚本可以生成正确的寄存器配置值。用这些工具生成的配置与你手算的进行交叉验证。分步测试先配置为1:1缩放HRSZVRSZ255验证数据通路是否正确。然后再逐步改为目标缩放比例。