尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
RH850/F1L例程开发参考:从启动时钟到CAN外设调试
简介面向汽车电子嵌入式开发者的RH850/F1L例程参考包围绕瑞萨CS集成开发环境整理了一套可直接编译调试的工程样例适合已具备一定MCU基础、希望快速上手车身控制与车载网络开发的技术人员。压缩包共29个文件、约110KB以ud与obj等工程编译中间文件、c与h源码头文件、asm启动及向量表、clnk链接脚本、map映射文件和mtpj工程配置为主完整保留了CAN通信、时钟、主程序等模块的构建痕迹与目录组织。该资源已有5750人学习说明其在RH850入门与工程复现中具备较高参考价值。读者可据此了解CS工程的文件构成、编译链接选项与CAN驱动分层方式对照iodefine寄存器定义和r_can、r_clock等源码梳理外设初始化流程并借助调试配置与映射文件排查启动、中断向量及内存布局问题从而缩短从环境搭建到功能验证的摸索周期为后续车身控制与车载总线项目开发积累可复用的工程模板。1. 从一份 RH850/F1L 例程包说起先点灯还是先测时钟接手一块别人画完、程序只跑过一半的车身控制板最磨人的不是控制逻辑而是上电之后连时钟都没起来。我拿到这颗 RH850/F1L 时手上只有一个例程压缩包和两页引脚说明里面每个外设都能单独编译却没有一条从头到尾的上电顺序。把这份 RH850/F1L 例程按最小闭环重新排了一遍才做到当天点灯、第二天串口出字、第三天 CAN 收到第一帧。这份例程开发参考的价值不在于代码写得多漂亮而在于它把启动、时钟、端口、定时器、串口、CAN、中断这些模块拆成了可以单独验证的小单元每个单元都能独立编译、独立下载、独立观测。适合两类人刚接手 F1L 平台、需要在短时间内把板子跑起来的工程师以及手里已经有产品代码、但想把初始化顺序重新梳理一遍的老手。下面按我实际的调试顺序展开先讲工程骨架再逐个拆外设最后落在几个真会让人翻车的地方。2. 工程骨架与时钟把压缩包改成能单步调试的工程2.1 目录、编译器与链接脚本三件先对齐的事例程包解压之后不要急着编译先看目录。常见的组织是 startup、driver、sample、linker、doc 五层sample 里每个外设一个 maindriver 里放寄存器封装。我一般会先把 sample 拆掉只保留一个空的 main 和一个 board 目录把外设驱动留在 driver 里按需加这样编译产物从一开始就是自己的工程不用在别人的 main 里改来改去。编译器这边有三个选项必须先对齐内核类型、字节序、浮点 ABI。内核填错链接能过跑起来第一条跳转就飞字节序和浮点 ABI 跟库文件不一致表现是浮点运算结果莫名其妙。优化等级也要注意例程里的软件延时函数在 -O0 下是准的开到 -O2 可能被整段优化掉我见过用 for 循环做 10ms 延时、结果上电直接把继电器抖成蜂鸣的现场。# 先只编译不链接确认每个源文件在当前选项下都能过 ccrh -c -cpug3k -O2 -Iinc src/clock.c src/gpio.c driver/tauj.c # 链接时显式指定链接脚本入口符号和向量表段都在里面 ccrh -cpug3k -T linker/f1l_512k.ld -o build/demo.abs objs/*.obj上面两条命令里的-cpu参数必须和芯片内核匹配选项拼写以编译器手册为准-T指向的链接脚本决定了 ROM 起始、RAM 大小和向量表落点。逻辑很简单编译阶段只验证语法和头文件路径链接阶段才校验内存布局。参数上重点看三个地方Flash 容量、RAM 容量、栈顶地址任何一个和实际型号对不上都会出现“下载成功但不运行”。链接脚本里要盯住四个段向量表段固定在 ROM 起始.text 紧随其后.data 的加载地址在 Flash、运行地址在 RAM.bss 只占 RAM 不占 Flash。栈大小别照抄例程中断嵌套深一点、加一个 printf 就可能把 1KB 的栈打穿我通常先给 2KB跑稳之后再往下压。段存放内容常见错法后果.vectors复位与中断向量起始地址不是 ROM 基址复位后取不到入口.text代码与常量超出 Flash 容量链接报错或运行错乱.data有初值的全局变量只设运行地址不设加载地址初值全是随机数.bss无初值的全局变量忘记清零全局状态从脏值开始2.2 启动代码复位后到 main 之间的四个动作复位之后到 main 之前芯片只做了最少的事取栈指针、取复位入口。剩下全得自己写。顺序错了后面的初始化再对也没用。我习惯把这段拆成四个动作关全局中断、设栈指针、搬 .data、清 .bss然后尽早关看门狗最后才进 main。/* crt0.c —— 复位到 main 之间的最小运行时 */ extern unsigned long __data_load, __data_start, __data_end; extern unsigned long __bss_start, __bss_end; extern int main(void); void _crt0(void) { unsigned long *src __data_load; unsigned long *dst __data_start; /* 1) 有初值的全局变量从 Flash 搬到 RAM长度由链接脚本符号给出 */ while (dst __data_end) { *dst *src; } /* 2) 无初值的全局变量清零否则 main 里的状态机从脏值开始 */ for (dst __bss_start; dst __bss_end; ) { *dst 0UL; } /* 3) 看门狗必须在这里关放到 clock_init 里已经晚了 */ wdt_disable_early(); (void)main(); /* 4) main 不允许返回返回就复位方便定位 */ for (;;) { ; } }这段代码的逻辑说明三个符号不是变量是链接脚本里定义的地址标签__data_load是 Flash 中的加载地址__data_start和__data_end是 RAM 中的起止地址。搬运循环用指针走不要用 memcpy因为 memcpy 本身可能依赖已经初始化好的数据。参数说明栈顶地址不在这里设放在汇编启动文件里用链接脚本符号直接赋给栈指针寄存器比在 C 里改更稳。看门狗那行是血泪经验。很多例程把看门狗关闭放在时钟初始化之后理由是“等时钟稳定再操作外设”但看门狗的超时时钟往往是独立时钟源上电就开始计数时钟初始化稍微久一点就复位现象是调试器一连上就断、程序永远停在复位入口。2.3 时钟初始化PLL 的启动顺序比参数更关键时钟这部分参数抄错还能改顺序写反就是玄学。正确顺序是解锁写保护、停 PLL、设分频、设倍频、启动 PLL、等锁定、切主时钟源、确认切换完成、重新上锁。中间任何一步提前都可能出现瞬时超频芯片不一定立刻死但会在某个外设上表现得不稳定。/* clock_init.c —— 8MHz 外部晶振PLL x10ICLK 80MHz / PCLK 40MHz */ #define XTAL_HZ 8000000UL #define PLL_MUL 10U #define ICLK_DIV 1U #define PCLK_DIV 2U #define PLL_LOCK_TIMEOUT 100000UL int clock_init(void) { volatile unsigned long timeout; CLK_PROTECT_UNLOCK(); /* 1) 这类寄存器默认写保护 */ CLK-PLLCTL ~PLL_ENABLE; /* 2) 先停 PLL再改分频 */ CLK-ICLK_DIV ICLK_DIV - 1U; /* 3) 分频字段多为“值减一” */ CLK-PCLK_DIV PCLK_DIV - 1U; CLK-PLLCTL (CLK-PLLCTL ~PLL_MUL_MASK) | ((PLL_MUL - 1U) PLL_MUL_SHIFT); CLK-PLLCTL | PLL_ENABLE; /* 4) 启动 PLL */ for (timeout 0; timeout PLL_LOCK_TIMEOUT; timeout) { if (CLK-PLLSTAT PLL_LOCKED) { break; /* 5) 等锁定必须带超时 */ } } if (timeout PLL_LOCK_TIMEOUT) { CLK_PROTECT_LOCK(); return -1; /* 晶振不起振交给上层处理 */ } CLK-MAIN_SEL MAIN_SEL_PLL; /* 6) 切主时钟源 */ while ((CLK-MAIN_STAT MAIN_STAT_MASK) ! MAIN_STAT_PLL) { ; /* 7) 等状态位真正切换过去 */ } CLK_PROTECT_LOCK(); return 0; }逻辑说明第 2 步先停 PLL 是为了避免改分频的瞬间PLL 仍以旧倍频输出出现一段超标时钟。第 5 步的超时不能省外部晶振虚焊、负载电容不匹配时锁定位永远不置起没有超时就是死循环调试器看起来像“程序卡在时钟初始化”实际是硬件没起振。第 7 步读状态位而不是相信写入值因为切换是异步的。参数说明PLL_MUL和两个分频系数决定最终频率改之前先算一遍上限ICLK 不能超过型号允许的最高主频PCLK 通常不超过 ICLK 的一半。PLL_LOCK_TIMEOUT按循环指令周期估算8MHz 晶振一般几十微秒就锁定给到毫秒级足够。结构体CLK的基址和位域定义要按具体型号手册补例程里的封装只能当模板不能当权威。2.4 最小可观测闭环点灯加一行串口时钟起来之后不要急着上 CAN先做两件事点一个灯、从串口打一行字把当前主频一起打出来。这一步的意义是把“程序能不能跑”变成“跑得对不对”后面所有外设出问题都可以回到这里判断是时钟偏了还是外设配错了。/* board_smoke_test.c —— 上电自检先给一个肉眼可见的信号 */ void board_smoke_test(void) { gpio_init(); uart_init(115200U); led_on(LED_RUN); uart_puts(boot ok, iclk); uart_put_u32(clock_get_iclk_hz()); uart_puts( pclk); uart_put_u32(clock_get_pclk_hz()); uart_puts(\r\n); }逻辑说明gpio_init和uart_init都依赖时钟已经配好所以调用顺序放在clock_init成功返回之后。串口打印的频率值不是给人看的装饰是给你核对分频有没有生效的凭据写进去的 80MHz 和实际跑出来的可能不是一回事后面串口乱码、定时器周期不对第一嫌疑就是这里。参数说明LED_RUN选一个不参与复用的普通 IO115200只是初值等串口验证通过再改成产品需要的波特率。3. 外设例程拆解GPIO、TAUJ、RLIN3 与 CAN 的落地顺序3.1 端口三层配置PMC、PFC、PIBC 的先后RH850 的端口不是一个寄存器说了算至少要过三层功能选择、方向控制、输入缓冲。顺序上我固定为“先关输入缓冲、再选功能、最后定方向”原因是切换过程中引脚可能处于悬空或两个驱动源对着拉的状态输入缓冲开着就会灌电流长时间跑会发热。例程里往往只写方向和电平功能选择那一层被省略接到复用脚上就不工作。/* gpio.c —— 一个输出脚的三层配置顺序不要调 */ void gpio_init(void) { /* 1) 先关输入缓冲切换过程中不读这个脚 */ PORT-PIBC0 ~(1U LED_RUN_PIN); /* 2) 功能选择0通用 IO1外设复用 */ PORT-PFC0 ~(1U LED_RUN_PIN); /* 3) 方向1输出 */ PORT-PBDC0 | (1U LED_RUN_PIN); /* 4) 先写电平再开输出避免上电瞬间闪一下 */ PORT-P0 | (1U LED_RUN_PIN); }逻辑说明第 1 步和第 2 步的先后在多数场景下可以互换但在引脚已经接了外部上拉的板子上先关输入缓冲能避免切换瞬间的电流尖峰。第 4 步的顺序是给执行机构用的驱动继电器或 MOS 管时先写电平再开输出能避免一个几毫秒的误动作。参数说明PIBC、PFC、PBDC的位定义要对着手册的端口寄存器表核不同封装的引脚编号和端口号不是一一对应例程里按端口号写实际板子要按引脚名反查。寄存器作用写错的表现PFC通用 IO 还是外设复用复用脚当 IO 用读回值不变PBDC输入还是输出输出脚配置成输入驱动不了负载PIBC输入缓冲开关悬空脚耗流、模拟量串扰Pn输出电平上电瞬间抖动3.2 TAUJ主从通道配对做 PWMTAUJ 是通道阵列结构做 PWM 时通常一个通道当主通道定周期另一个当从通道定占空比。这里最容易翻车的是计数时钟和周期寄存器的位宽PCLK 40MHz、目标 1kHz周期值是 4000016 位计数器放得下但目标改成 100Hz周期值 400000直接溢出表现是输出频率莫名其妙跳到另一个值。所以预分频不是可选项是必须按目标频率算的。/* tauj_pwm.c —— 1kHz PWM占空比按千分比传入 */ int tauj_pwm_init(unsigned int duty_permille) { unsigned long pclk clock_get_pclk_hz(); unsigned long period pclk / 1000UL; /* 1kHz */ if (period 0xFFFFUL) { return -1; /* 16 位放不下先改预分频 */ } TAUJ0-TPS0 0U; /* 预分频 1计数时钟PCLK */ TAUJ0-CDR0 (unsigned short)period; /* 主通道周期 */ TAUJ0-CDR1 (unsigned short)((period * duty_permille) / 1000UL); TAUJ0-CTL0 TAUJ_CTL_MASTER | TAUJ_CTL_START; TAUJ0-CTL1 TAUJ_CTL_SLAVE | TAUJ_CTL_START; TAUJ0-TOE0 TAUJ_TOE_CH0 | TAUJ_TOE_CH1; /* 打开引脚输出 */ return 0; }逻辑说明先算周期再判断位宽超了就返回错误让上层改预分频不要静默截断截断之后现象很难查。主从通道的启动顺序是先主后从反过来的话从通道可能错过第一个比较事件输出会有一个周期的异常占空比。参数说明duty_permille用千分比而不是百分比是为了在小占空比时还有分辨率TPS0的预分频档位按手册查表不同档位对应的计数时钟不一样算周期时要用分频后的频率。采样和更新时机也要注意。有些型号支持缓冲寄存器写入新占空比后在周期边界生效不支持缓冲的运行中直接改比较值可能出现一个窄脉冲。我的做法是能停就停、不能停就等到中断里改别在主循环里随手写。3.3 RLIN3波特率误差要自己算串口看着最简单实际是外设里最容易“看起来通了但不可靠”的一个。RLIN3 配异步 UART关键不是填个波特率宏而是自己把分频值和误差算出来。PCLK 40MHz、115200 波特率、16 倍过采样分频值是 21.7取整 21实际波特率 119047误差约 3.3%已经偏大分频值取 22实际 113636误差 -1.4%反而更稳。这种账不算换一批板子就会出现有的能通有的不能通。/* rlin3_uart.c —— 返回实际误差ppm超过阈值直接拒绝 */ int uart_init(unsigned int baud) { unsigned long pclk clock_get_pclk_hz(); unsigned long div pclk / (16UL * baud); /* 16 倍过采样 */ unsigned long real, err_ppm; if (div 0UL || div 255UL) { return -1000000; /* 分频超范围 */ } real pclk / (16UL * div); err_ppm (long)((real - baud) * 1000000L / baud); if (err_ppm 20000L || err_ppm -20000L) { return (int)err_ppm; /* 超过 2% 不接受 */ } RLIN3-BRG (unsigned char)(div - 1U); RLIN3-CTL RLIN3_CTL_UART | RLIN3_CTL_8N1; RLIN3-EN 1U; return (int)err_ppm; }逻辑说明先算分频再算实际波特率最后用 ppm 表示误差比百分比直观。2% 这个阈值是保守值UART 本身能容忍到 3% 左右但要留出晶振温漂和对端误差的余量。参数说明div的位宽按手册核示例按 8 位处理RLIN3_CTL_8N1是封装出来的位组合实际要拆成数据位、停止位、校验位三个字段分别写。接收侧建议一开始就上中断加环形缓冲轮询接收在 115200 下丢字节是常态不是偶发。3.4 CAN位时序、验收滤波和发送邮箱CAN 初始化要过三关位时序、验收滤波、邮箱使能。位时序决定能不能通验收滤波决定收不收得到邮箱使能决定发不发得出去。三关里最容易漏的是验收滤波例程里经常全 0 或者全 1全 0 表示只收 ID 为 0 的帧现象是“能发不能收”很多人第一反应是硬件收发器坏了其实是滤波器把帧全挡了。/* can_init.c —— 500kbpsPCLK 40MHz采样点约 81% */ int can_init(void) { unsigned int tq_total 16U; /* 一个位时间 16 个 tq */ unsigned int brp clock_get_pclk_hz() / (500000UL * tq_total); if (brp 0U || brp 1024U) { return -1; } CAN-CTRL 0U; /* 进初始化模式才能改时序 */ CAN-BRP brp - 1U; CAN-TSEG1 12U; /* 同步段 传播段 相位段1 */ CAN-TSEG2 3U; /* 相位段2 */ CAN-SJW 1U; can_set_accept_filter(0x100U, 0x700U); /* 只收 0x1xx 的标准帧 */ CAN-CTRL CAN_CTRL_EXIT_INIT; while ((CAN-STAT CAN_STAT_NORMAL) 0U) { ; /* 等进入正常模式超时要处理 */ } return 0; }逻辑说明位时间由同步段、TSEG1、TSEG2 组成三者之和乘以 BRP 就是一个位的实际时间。采样点算的是(1 TSEG1) / 总 tq这里 (112)/16 约 81%工程上 75% 到 87.5% 都常见总线长、节点多时往 80% 以上调。参数说明brp在写寄存器时通常要减一验收滤波用 ID 加掩码的方式表达掩码位为 1 表示该位必须匹配。发送邮箱初始化之后要先置使能位再写数据顺序反了第一帧会丢。4. 中断与低功耗两处最容易断链的初始化4.1 INTC向量号、优先级与 EI 级中断的登记中断这块新手最容易把向量号和中断源编号混为一谈。向量号是向量表里的下标中断源编号是外设手册里给的那个数字两者不一定相等例程里通常用宏包了一层改外设时如果直接改数字就会对不上。登记顺序我固定为先写向量表基址、再填处理函数、再配优先级、最后开使能任何一步提前开中断都可能跑进一个空向量。/* intc.c —— 登记一个中断源顺序固定 */ void intc_register(unsigned int vec_no, isr_t handler, unsigned int prio) { /* 1) 向量表基址必须在任何中断使能之前写 */ INTC-INTBP (unsigned long)vector_table; /* 2) 向量表里填处理函数地址 */ vector_table[vec_no] handler; /* 3) 优先级0 表示屏蔽1~15 有效数值越大优先级越高 */ INTC-PRI[vec_no] (unsigned char)(prio 0x0FU); /* 4) 先开外设侧使能最后开 CPU 全局中断 */ INTC-ENABLE | (1UL vec_no); ei(); }逻辑说明第 1 步的向量表基址只写一次就够放在每次登记里是为了防止有人中途改过。第 3 步的方向必须确认RH850 这类内核的优先级是数值越大越高和某些架构相反照抄别的平台代码会把关键中断配成最低优先级。参数说明prio传 0 不是“最低优先级”是屏蔽调试时中断进不去先看这里是不是 0。ei()放在函数末尾只适合初始化阶段运行中动态登记要把这一步拆出去。4.2 中断上下文栈预算和环形缓冲中断处理函数里做什么决定了系统稳不稳。我的底线是不在中断里调用 printf、不在中断里等标志位、不在中断里做超过 200 个周期的运算。原因很实在printf 内部有锁和缓冲重入一次就把栈和堆一起打穿等标志位则可能把中断响应时间拉到毫秒级别的中断全被拖住。/* uart_irq.c —— 接收中断只做搬运解析放到主循环 */ static volatile unsigned char rx_buf[256]; static volatile unsigned int rx_head, rx_tail; void uart_rx_isr(void) { unsigned char data (unsigned char)RLIN3-RXD; unsigned int next (rx_head 1U) 0xFFU; if (next ! rx_tail) { /* 留一个空位区分满和空 */ rx_buf[rx_head] data; rx_head next; } else { rx_overflow; /* 溢出计数主循环里报错 */ } RLIN3-STAT RLIN3_STAT_RX_CLR; }逻辑说明环形缓冲用头尾指针留一个空位是为了不用额外变量区分“满”和“空”。溢出时只累加计数不阻塞保证中断能及时返回。参数说明缓冲长度取 2 的幂取模用位与代替除法rx_head和rx_tail必须加 volatile否则优化之后主循环读到的永远是旧值。主循环侧按帧解析解析失败就丢不要把半帧留在缓冲里等下一帧拼。4.3 STOP 与 HALT唤醒后的恢复顺序低功耗模式本身不难进难在醒来之后。STOP 模式下外设时钟停了醒来第一件事不是继续跑主循环而是把时钟和外设按依赖顺序恢复。顺序反了串口会丢第一个字节CAN 会错过第一帧现象是“偶尔丢数据”很难复现。/* lowpower.c —— 进 STOP 之前保存醒来按依赖恢复 */ void enter_stop_mode(void) { uart_flush(); /* 1) 等最后一个字节发完 */ clock_save_state(); /* 2) 记录当前分频和时钟源 */ port_hold_config(); /* 3) 锁存端口状态 */ irq_clear_all_pending(); /* 4) 清挂起标志否则立刻被唤醒 */ enable_wakeup_source(WAKEUP_CAN_RX | WAKEUP_EXT_INT0); enter_stop(); /* 5) 执行后时钟停止 */ clock_restore_state(); /* 6) 先恢复时钟 */ uart_reinit(); /* 7) 再恢复依赖时钟的外设 */ can_reinit(); }逻辑说明第 4 步最容易被忽略进低功耗前如果还有挂起的中断标志芯片会在进入后立刻被唤醒看起来像“没睡下去”。第 6、7 步的顺序不能反串口和 CAN 的初始化都要读时钟频率算分频时钟没恢复就初始化算出来的波特率是错的。参数说明唤醒源按板子实际接线选CAN 唤醒要求收发器支持唤醒功能硬件上没接的话软件配了也没用。注意调试器连接状态下进 STOP很多片上调试器会直接断连看起来像程序跑飞。判断方法是看电流或者用 GPIO 在进入前后翻转不要只信调试器的状态。5. 避坑排查五个把例程跑成砖的现场现象一编译通过、下载成功但程序反复复位调试器停在入口。原因多半是看门狗在时钟初始化完成之前就超时。例程把关闭看门狗放在clock_init里而看门狗用的是独立时钟上电即计数。解决是把关闭动作提前到启动代码里紧跟 .bss 清零之后等系统稳定再决定是否重新使能。排查时可以先全片擦除再下载排除旧程序里开了看门狗又被新程序覆盖一半的情况。现象二串口输出乱码换几个波特率都一样。先别怀疑串口模块去查实际 PCLK。分频写了但主时钟源没切过去、或者切换后没等状态位都会让外设跑在一个和配置表不符的频率上。解决方法是在初始化末尾把clock_get_pclk_hz()的返回值从另一个脚输出或者用调试器读回来和预期值对一遍。对不上就回到时钟初始化重点看 PLL 锁定和切换确认两步。现象三CAN 能发不能收示波器上看总线有波形。十有八九是验收滤波配错。全 0 的滤波器只放行 ID 为 0 的帧全 1 的掩码等于全放行但有些实现里会被当成无效配置。解决是先配成完全放行确认能收到再逐步收紧掩码。另外确认终端电阻单节点短线上不加电阻也能通一接上第二个节点就开始丢帧这种现场很常见。现象四定时器中断死活进不去标志位却置起来了。三个检查点向量号和中断源编号是否对应、优先级是不是 0、CPU 全局中断是否打开。前两个占九成。向量表基址写错的表现本文还有配套的精品资源点击获取
RELATED

相关推荐

MySQL函数实战:从基础操作到性能优化

MySQL函数实战:从基础操作到性能优化

1. MySQL函数全景解析:从基础到高阶实战 MySQL作为最流行的关系型数据库之一,其内置函数体系是数据处理的核心工具。根据我十年数据库优化经验,合理使用函数能使查询效率提升30%以上,但错误的使用方式也可能导致性能灾难。本文将深…

📅 2026/10/26 11:36:19
CSS伪类实战指南:从基础到高级应用

CSS伪类实战指南:从基础到高级应用

1. CSS伪类基础概念与核心价值 CSS伪类(Pseudo-classes)是选择器家族中极具特色的成员,它们不像常规类选择器那样直接对应HTML元素的class属性,而是基于元素在特定状态或文档结构中的位置进行匹配。这种机制让开发者能够精确控制元…

📅 2026/10/26 11:31:15
iphone的HEIC格式与JPG格式设置与转换及电脑的第三方软件使用识别HEIC

iphone的HEIC格式与JPG格式设置与转换及电脑的第三方软件使用识别HEIC

iphone的HEIC格式与JPG格式设置与转换及电脑的第三方软件使用识别HEIC主要问题:iphone的HEIC格式与JPG格式设置与转换:问题列表:我的iphone17pro的HEIC照片格式如何设置成JPG拍照格式?如何传输可以把HEIC传成JPG格式?几…

📅 2026/10/26 11:31:15
MORE NEWS

更多资讯

📰

实测Claude中文能力跃升:从翻译腔到地道中文的技术解析

最近圈子里聊得最多的一个话题,就是Claude突然就会说中文了。这个"突然"当然不是毫无来由,但对普通用户来说,体感确实很直接:以前拿它处理中文内容,总带着一股"翻译腔",语法挑不出毛病…

📰

如何对LLM大型语言模型进行评估与基准测试:从性能指标到推理能力的落地实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

DeepSeek-R1模型选型与提示语工程实践指南

简介:这份PDF文档围绕国产开源通用人工智能推理模型DeepSeek展开,面向AI研发工程师、学者及希望提升效率的个人开发者,帮助读者建立从基础认知到进阶应用的完整路径。内容从DeepSeek与开源推理模型DeepSeek-R1的定位切入,梳理智能…

📰

AI赋能知识产权运营:四类智能体破解科技成果转化供需匹配难题

简介:围绕AI赋能的精准知识产权运营供需匹配平台,这份Word文档面向高校科研机构、技术转移从业者、企业创新负责人及政府科技管理部门,聚焦成果转化中信息不对称、资源分散、合作不畅等痛点。全文以单份docx交付,压缩包约38KB&…

📰

UG/NX二次开发实战弹药库:从环境搭建到UF函数调试

简介:本资源是面向UG(Unigraphics)初学者与进阶开发者的系统性二次开发学习合集,聚焦C API与GRIP脚本双路径实践,助力工程师在航空航天、汽车制造等工业领域实现定制化建模、自动化任务与界面扩展。压缩包共620个文件&…

📰

STP、RSTP、MSTP演进与实战:从环路告警到负载分担

1. 从一次环路告警说起:为什么需要MSTP很多刚接触交换网络的朋友,第一次看到机房里所有交换机的指示灯同时疯狂闪烁、CPU占用率飙到百分之百、业务大面积中断的场景,大概率是遇到了二层环路。我印象很深的一次,某办公区临时加了一…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬