TMS320C5515 DSP外设实战:LCDC、ADC、SPI、USB与定时器配置详解

📅 2026/7/27 7:25:26
TMS320C5515 DSP外设实战:LCDC、ADC、SPI、USB与定时器配置详解
1. 项目概述与核心价值在嵌入式DSP系统开发中外设接口的掌握程度直接决定了项目的成败。很多开发者拿到像TMS320C5515这样的芯片面对厚厚的数据手册往往感到无从下手特别是那些密密麻麻的寄存器表和时序图。今天我就结合自己多年在工业控制和便携式设备开发中的实战经验来为大家深度拆解C5515的几个核心外设LCDC、ADC、SPI、USB和定时器。这不仅仅是读手册而是要把手册上冰冷的参数变成你手头可以“抄作业”的配置代码和避坑指南。TMS320C5515作为一款低功耗、高性能的定点DSP其价值不仅在于强大的数字信号处理内核更在于其丰富且灵活的外设集成。这些外设就像是DSP的“手脚”和“感官”让它能够驱动显示屏、采集模拟信号、与各类传感器或主控通信并精准地管理时间。理解并熟练配置这些外设意味着你能让DSP从一台强大的计算引擎转变为一个完整的、可独立工作的嵌入式系统核心。无论是做手持医疗设备、工业HMI界面还是音频处理前端这些外设都是你绕不开的坎。接下来我将抛开教科书式的罗列直接切入每个外设在工程实践中的核心要点、配置逻辑和那些容易踩坑的细节。2. 外设整体架构与设计思路在深入每个外设之前我们必须先建立一个大图景。C5515的外设并非孤立存在它们通过芯片内部的总线结构与DSP内核、内存以及DMA控制器紧密相连。这种架构设计的核心思路是解放CPU。以LCDC为例它自带DMA引擎。这意味着一旦你初始化好帧缓冲区和显示时序DMA就能自动、不间断地将图像数据从内存搬运到LCD控制器无需CPU干预。CPU只需要在需要更新画面时修改帧缓冲区的内容即可。这种设计对于维持流畅的UI刷新率至关重要否则CPU光搬运数据就够忙了根本无力进行核心的信号处理算法。SPI和USB的设计也遵循类似原则。SPI虽然不支持DMA这是C5515 SPI模块的一个限制需要注意但其硬件移位寄存器和时钟生成逻辑能极大简化软件模拟串行通信的负担。而USB 2.0模块则集成了完整的PHY和复杂的DMA调度器CPPI DMA专门用于高效处理USB批量数据传输将CPU从繁琐的包管理和数据搬运中解脱出来。10位SAR ADC和通用定时器则更偏向于“传感”与“节奏”。ADC负责将模拟世界如电池电压、传感器信号数字化其多通道和可编程参考电压特性提供了灵活性。定时器则是系统的心跳用于产生精确的周期性中断调度任务、测量时间或作为看门狗守护系统。因此配置这些外设的通用思路是先理解其工作模式与硬件能力再通过配置寄存器设定具体参数如时钟、时序、中断最后利用DMA或中断机制实现高效的数据流管理让CPU专注于核心算法。下面我们就逐个击破。3. Liquid Crystal Display Controller (LCDC) 详解与驱动实战LCDC是连接DSP与显示模块的桥梁。C5515的LCDC是一个LIDD控制器仅支持异步接口模式不支持Raster光栅模式这一点非常重要它决定了你只能驱动字符型LCD如HD44780或采用6800/8080并行接口的图形LCD而不能直接驱动RGB接口的TFT屏。3.1 核心寄存器功能解析手册里的寄存器表看起来吓人其实我们可以分组理解状态与控制组LCDCR控制寄存器和LCDSR状态寄存器是总开关。LCDCR用于全局使能LCDC、选择工作模式等LCDSR则用于查询当前状态比如DMA传输是否完成。LIDD配置组LCDLIDDCR、LCDLIDDCS0/CONFIG0/1等。这是核心配置区。你需要在这里设置访问时序的关键参数W_SU,R_SU建立时间。指地址/数据线有效到读/写使能信号有效之间的延迟CLK周期数。W_STROBE,R_STROBE选通时间。使能信号保持有效的CLK周期数决定了读写脉冲的宽度。W_HOLD,R_HOLD保持时间。读写使能信号无效后地址/数据线还需要保持有效的CLK周期数。CS_DELAY片选延迟。在两个连续的片选访问之间的空闲CLK周期数。DMA与帧缓冲区组LCDDMACR,LCDDMAFB0BAR0/1,LCDDMAFB0CAR0/1等。这是数据通道的配置。你需要告诉DMA帧缓冲区在内存的什么位置Base Address它有多大Ceiling Address。C5515支持双帧缓冲区可以用于实现无闪烁的动画切换Ping-Pong Buffer。3.2 时序配置实战与计算手册中的时序图Figure 5-31 至 5-38是配置的黄金标准。我们以驱动一个常见的8080并行接口16位色TFT屏为例。步骤一确定LCD芯片时序要求。假设你的LCD手册要求如下时序名称可能不同需对应t_{AS}(地址建立时间): 最小15nst_{DS}(数据建立时间): 最小20nst_{WH}(写使能低电平宽度): 最小30nst_{AH}(地址保持时间): 最小10nst_{DH}(数据保持时间): 最小10ns步骤二根据DSP时钟计算CLK周期。假设你的LCDC模块时钟LCD_CLK CPU时钟 / 分频 100MHz / 2 50MHz周期T_{CLK} 20ns。步骤三将时间要求转换为寄存器值CLK周期数。寄存器值必须是整数且满足最小要求。我们通常取满足最小值的最小整数并留一点余量。W_SU(对应t_{AS}和t_{DS}): 需要覆盖建立时间。t_{AS}要求15nsT_{CLK}20ns 15/200.75所以至少需要1个周期。我们设置为1。W_STROBE(对应t_{WH}): 30ns / 20ns 1.5取整为2个周期。W_HOLD(对应t_{AH}和t_{DH}): 10ns / 20ns 0.5取整为1个周期。CS_DELAY: 如果不需连续访问可设为0。如果需要根据屏的t_{cycle}读写周期时间计算。步骤四编写配置代码示例// 假设寄存器地址已映射到指针 volatile uint16_t *lcd_lidd_cs0_config0 (uint16_t*)0x2E10; volatile uint16_t *lcd_lidd_cs0_config1 (uint16_t*)0x2E11; volatile uint16_t *lcd_dma_fb0_bar0 (uint16_t*)0x2E44; // 配置CS0时序 (假设16位数据总线8080写模式) // CONFIG0 和 CONFIG1 的具体位域需参考手册详细定义此处为示意 // 通常包含W_SU, W_STROBE, W_HOLD, 访问模式(8080写)数据宽度等 *lcd_lidd_cs0_config0 (1 12) | (2 8) | (1 4) | (0x3); // 示例组合模式、选通时间等 *lcd_lidd_cs0_config1 (1 8) | (0 4) | (0x0); // 示例建立时间、延迟等 // 配置帧缓冲区0基地址假设缓冲区位于0x8000 *lcd_dma_fb0_bar0 0x8000; // 低16位 *(lcd_dma_fb0_bar0 1) 0x0000; // 高16位 (C5515为16位总线但地址可能是20位或以上) // 使能LCDC和DMA // ... 配置LCDCR, LCDDMACR关键提示时序配置是调试LCD最耗时的部分。如果屏幕无显示或显示乱码首先用逻辑分析仪或示波器抓取LCD_CS,LCD_WR,LCD_DATA等关键信号对照时序图和你计算的参数检查建立、保持、脉宽时间是否满足LCD芯片要求。一个常见的坑是忽略了地址线LCD_RS和数据线共用同一组GPIO在读写切换时方向寄存器配置不当导致数据冲突。3.3 DMA帧缓冲区管理心得双帧缓冲区是实现流畅显示的关键。基本工作流程如下初始化时将两个帧缓冲区FB0和FB1都填充为初始画面并指向FB0。LCDC的DMA持续从当前活动缓冲区比如FB0读取数据并发送到屏幕。当CPU需要更新画面时它向非活动缓冲区FB1写入新的图像数据。数据写入完成后通过修改LCDDMACR中的缓冲区切换位将活动缓冲区瞬间切换到FB1。此后DMA从FB1读取数据CPU则可以开始渲染下一帧到FB0。这种机制避免了在DMA读取过程中修改缓冲区内容导致的屏幕撕裂。需要注意的是缓冲区的大小必须根据屏幕分辨率如320x240和色深如16位色2字节/像素精确计算并且缓冲区地址必须与DMA访问要求对齐通常是字对齐或长字对齐。4. 10-Bit SAR ADC 配置与精度优化SAR逐次逼近寄存器型ADC是嵌入式系统中最常见的ADC类型之一平衡了速度、精度和成本。C5515的10位SAR ADC最大采样率为62.5 kSPS对于音频前端、电池电压监测、多路传感器采样等应用绰绰有余。4.1 寄存器配置与采样流程核心寄存器就5个非常清晰SARCTRL控制寄存器。用于启动/停止转换、选择通道GPAIN[3:0]、选择参考电压内部0.8V/1V或外部VDDA_ANA、选择工作模式单次/连续、使能中断等。SARDATA数据寄存器。转换完成后10位结果就放在这里通常位于低10位或高10位需查手册确认。SARCLKCTRL时钟控制寄存器。ADC内核需要一个转换时钟最大2MHz这个寄存器用于配置分频系数从系统时钟得到ADC时钟。转换时间固定为32个ADC时钟周期。例如ADC时钟为2MHz时单次转换时间为32 * (1/2MHz) 16μs对应最高约62.5kSPS。SARPINCTRL引脚与参考控制寄存器。更细粒度地控制模拟引脚和参考源。SARGPOCTRL通用输出控制寄存器。ADC的四个模拟输入引脚GPAIN[3:0]也可以配置为数字输出这个寄存器就是用来控制这个功能的。一个典型的单通道轮询式采样流程如下// 1. 初始化ADC时钟 (假设系统时钟100MHz目标ADC时钟2MHz) // 分频系数 系统时钟频率 / (2 * ADC时钟频率) - 1 这里需要根据手册公式计算 // 假设公式为 DIV (SYSCLK / (2 * ADCCLK)) - 1 则 DIV (100 / (2*2)) -1 24 *SARCLKCTRL 24; // 2. 配置参考电压和引脚 (选择内部1V参考采样通道0) *SARPINCTRL (0x1 参考电压选择位) | (0x0 通道选择位); // 3. 启动单次转换 *SARCTRL (1 单次转换启动位); // 4. 等待转换完成 (轮询状态位) while(!(*SARCTRL (1 转换完成状态位))) { // 空循环或执行其他低优先级任务 } // 5. 读取转换结果 uint16_t adc_value *SARDATA 0x03FF; // 取低10位4.2 精度影响因素与校准技巧手册中给出了静态性能参数DNL差分非线性±0.6 LSBINL积分非线性±1 LSB零点误差和满量程误差各±2 LSB。对于10位ADC1024个码值这些误差在大多数应用中是可接受的但追求高精度时仍需处理。1. 参考电压噪声这是影响精度的首要因素。即使你选择了稳定的内部1V参考其噪声也会直接叠加到转换结果上。对于高精度测量强烈建议使用外部低噪声、高稳定性的基准电压源并通过SARPINCTRL寄存器选择外部参考VDDA_ANA。同时确保模拟电源VDDA_ANA干净最好通过LC滤波器或磁珠与数字电源隔离。2. 模拟输入信号调理ADC的输入阻抗约为1MΩ对于高输出阻抗的传感器需要添加电压跟随器运放进行缓冲防止信号因负载效应而衰减。同时在ADC输入引脚处添加一个小的去耦电容如100pF到地可以滤除高频噪声但注意电容太大会影响建立时间降低有效采样率。3. 软件过采样与滤波对于直流或低频信号可以通过软件大幅提高有效分辨率。例如进行64次连续采样并取平均理论上可以将信噪比提高10*log10(64) ≈ 18dB相当于增加约3位有效分辨率从10位到13位左右。C5515的ADC支持连续转换模式配合DMA可以轻松实现这种批量采样。4. 通道切换与建立时间当在多个模拟通道间切换时ADC内部的采样保持电容需要时间充电到新电压。如果切换后立即启动转换结果会不准确。一个实用的做法是在切换通道后先丢弃第一次转换的结果从第二次开始再使用。或者在连续模式下切换通道后等待足够的时间远大于RC常数再读取。避坑指南GPAIN0通道具有内部分压功能可测3.6V用于电池电压检测很方便。但请注意启用分压后实际测量范围是Vbat / 3。例如输入3.3VADC看到的是1.1V。计算实际电压时别忘记乘以3。另外ADC的模拟地和数字地AGND, DGND在芯片内部可能已连接但在PCB布局时仍应确保模拟部分有独立、干净的地平面并通过单点与数字地相连。5. Serial Port Interface (SPI) 主模式驱动与通信实战SPI是一种简单高效的全双工同步串行总线C5515的SPI仅支持主模式这意味着它只能作为主机去控制从设备如Flash、ADC、传感器、显示屏驱动等。5.1 SPI模式与时钟极性/相位SPI有4种模式由时钟极性CKP和时钟相位CKPH决定。这是SPI配置中最容易混淆的地方。Mode 0 (CKP0, CKPH0): 时钟空闲为低数据在时钟的第一个边沿上升沿采样。Mode 1 (CKP0, CKPH1): 时钟空闲为低数据在时钟的第二个边沿下降沿采样。Mode 2 (CKP1, CKPH0): 时钟空闲为高数据在时钟的第一个边沿下降沿采样。Mode 3 (CKP1, CKPH1): 时钟空闲为高数据在时钟的第二个边沿上升沿采样。如何选择完全取决于你的从设备你必须查阅从设备的数据手册确定它支持哪种模式。例如很多SPI Flash芯片支持Mode 0和Mode 3。5.2 寄存器配置与数据传输示例SPI寄存器组相对紧凑。关键寄存器包括SPICDR时钟分频寄存器。决定SPI_SCLK的频率。SPI_SCLK 系统时钟 / (2 * (SPICDR 1))。SPICCR时钟控制寄存器。设置CKP和CKPH即SPI模式。SPIDCR1/2设备配置寄存器。设置数据长度1-32位、传输字符数1-4096、片选信号极性、片选到数据延迟等。SPIDAT1/2数据寄存器。写入数据启动发送读取数据获取接收值。SPICMD1/2和SPISTAT1/2命令和状态寄存器用于控制传输和查询状态。配置一个8位数据、Mode 0、频率1MHz的SPI主设备示例假设系统时钟为100MHz。计算SPICDR: 所需SPI_SCLK 1MHz。公式SPICDR (系统时钟 / (2 * SPI_SCLK)) - 1 (100e6 / (2*1e6)) - 1 49。配置寄存器*SPICDR 49; // 设置时钟分频 *SPICCR 0x0000; // CKP0, CKPH0, 即Mode 0 *SPIDCR1 (0x7 数据长度位) | (0x0 字符数位); // 8位数据1个字符 // 假设SPI_CS0低有效其他配置默认 *SPIDCR2 (0x0 片选极性位);进行一次简单的数据收发查询方式void spi_transfer(uint16_t tx_data, uint16_t *rx_data) { // 1. 等待发送缓冲区空如果支持该状态位 while(!(*SPISTAT1 (1 发送空标志位))) {}; // 2. 写入数据启动传输 *SPIDAT1 tx_data; // 3. 等待接收完成/传输完成 while(!(*SPISTAT1 (1 接收就绪标志位))) {}; // 4. 读取接收到的数据 *rx_data *SPIDAT1; }5.3 时序分析与性能优化手册中的时序参数表5-465-47是保证通信可靠性的关键。你需要关注两个核心参数tsu(SRXV-SCLK): SPI_RXMISO数据在SPI_CLK有效边沿之前的建立时间。最小值在13.9ns1.3V或16.1ns1.05V。td(SCLK-STXV): SPI_CLK有效边沿到SPI_TXMOSI数据有效的延迟时间。最大值为5.3ns1.3V或8.9ns1.05V。这些参数决定了SPI总线的最高理论速度。从设备的数据输出延迟T_{V}必须满足DSP的建立时间要求。假设从设备T_{V}最大为20nsDSP要求建立时间最小13.9ns那么从设备数据有效到DSP采样时钟边沿的时间至少为20ns 13.9ns 33.9ns。这限制了SPI_CLK的高电平或低电平宽度不能小于这个值从而限制了时钟频率。优化建议使用中断而非轮询对于连续或大数据量传输轮询会浪费大量CPU周期。配置SPI在字符传输完成时产生中断在中断服务程序中进行下一数据的发送或接收缓冲区的处理。注意DMA不支持C5515的SPI模块不支持DMA这是一个重要的限制。所有数据搬运必须由CPU通过中断或轮询完成。在设计高吞吐量应用如高速读取SPI Flash时必须评估CPU处理SPI中断的开销是否会影响主任务。片选管理SPIDCR2可以配置片选信号SPI_CSn与数据输出SPI_TX之间的延迟0-3个SPI_CLK周期。这对于某些需要更宽片选建立时间的从设备非常有用。如果通信不可靠可以尝试增加这个延迟。6. USB 2.0 Peripheral 设备模式开发要点C5515集成了一个USB 2.0设备控制器不支持主机模式支持全速12 Mbps和高速480 Mbps。对于需要与PC或嵌入式主机进行高速数据交换的应用如数据采集卡、音频接口、大容量存储设备这是极其重要的外设。6.1 USB模块架构与核心概念其架构比SPI、ADC复杂得多核心分为几层USB核心与PHY处理底层的USB协议包编码、CRC、握手、速度协商。集成PHY简化了硬件设计。端点EndpointUSB通信的逻辑通道。C5515支持控制端点0EP0和4个额外的双向端点EP1-EP4。每个端点有独立的FIFO。FIFO RAM4KB的共享缓冲区用于端点数据的临时存储。其大小可以动态分配给各个端点。CPPI DMA这是性能的关键。一个专用于USB的DMA控制器可以自动将FIFO中的数据搬运到系统内存或反向搬运极大减轻CPU负担。队列管理器QMGR管理DMA传输描述符的队列实现复杂的传输调度。6.2 设备枚举与端点配置流程开发一个USB设备第一步是让主机如PC识别它这个过程叫枚举。1. 硬件与时钟初始化确保USB的模拟电源VDDA_USB和时钟正确提供。配置USB模块的时钟源和引脚复用。2. 软件初始化与描述符准备编写一组USB描述符设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符等。这些描述符告诉主机“我是什么设备如HID、CDC、大容量存储、我需要什么资源端点、带宽”。在代码中将这些描述符定义为常量数组。3. 端点与FIFO配置根据你的传输需求控制、中断、批量、同步配置端点类型。例如做高速数据采集可能将EP1配置为批量输入IN端点EP2配置为批量输出OUT端点。通过TXMAXP/RXMAXP寄存器设置端点最大包大小高速批量端点最大为512字节。通过TXFIFOSZ/RXFIFOSZ和TXFIFOADDR/RXFIFOADDR寄存器动态划分那4KB的FIFO RAM给各个端点。这是一个精细活分配不足会导致FIFO溢出分配过多则浪费。通常要为控制端点EP0预留一定空间然后根据其他端点的最大包大小和预期流量来分配。4. 中断与DMA配置使能USB核心中断复位、挂起、恢复等和端点中断传输完成。配置CPPI DMA描述符。描述符是一个数据结构定义了数据在内存中的位置、长度、下一个描述符地址等。将描述符放入队列管理器管理的队列中。当主机发起一次传输例如向IN端点请求数据USB核心会触发DMADMA根据描述符自动从指定内存地址搬运数据到端点的FIFO然后由USB核心发送出去。整个过程无需CPU干预数据搬运。6.3 实战心得与调试技巧1. 描述符是重中之重90%的枚举失败问题都出在描述符。务必确保描述符的格式完全符合USB规范。可以使用USB协议分析仪如Beagle USB或PC端的软件工具如USBlyzer来抓取枚举过程的数据包对比你的设备返回的描述符与主机请求是否匹配。2. 理解传输类型控制传输EP0用于枚举和配置。必须实现。通常是小的、突发性的数据。批量传输用于大量、对时间不敏感的数据。保证交付但不保证带宽。适合文件传输、数据采集。中断传输用于周期性的、小量数据如HID鼠标键盘。保证最大延迟。同步传输用于实时流数据如音频、视频。保证带宽但不保证交付无重试。3. 善用RNDIS模式C5515的USB模块支持RNDISRemote Network Driver Interface Specification。这是一种通过USB模拟网络设备的协议。如果你的应用是让DSP通过USB与PC交换网络数据包例如实现一个简单的USB网卡启用RNDIS模式可以借助硬件加速大幅提升效率。4. 电源管理USB设备需要响应主机的挂起Suspend和恢复Resume请求。在挂起时DSP应进入低功耗模式以节省电能。代码中需要正确处理这些事件的中断。深度避坑FIFO配置错误是导致数据丢失的常见原因。例如你为某个批量IN端点分配了1024字节的FIFO但设置的最大包大小是512字节。USB核心会在FIFO有512字节时就触发一次发送如果主机已请求这是正确的。但如果你在DMA描述符中设置了一次传输2000字节DMA会分4次512512512464填满FIFO并触发发送。关键在于要确保在DMA填充下一次数据之前FIFO中的数据已被主机取走即上一次传输完成中断已发生。否则会发生覆盖。最佳实践是使用“Ping-Pong”缓冲准备两个DMA描述符交替使用。当第一个描述符对应的传输完成中断到来时CPU处理数据并重新挂接该描述符到队列尾部同时DMA已经在使用第二个描述符传输数据了。这需要仔细设计中断服务程序和描述符链表。7. 通用定时器与看门狗定时器应用定时器是嵌入式系统的“心跳”。C5515提供3个32位通用定时器其中Timer2可配置为看门狗。7.1 通用定时器精准的节奏大师每个通用定时器核心是一个32位递减计数器。它由一个13位预分频器驱动预分频器的时钟源是CPU时钟。这意味着你可以获得非常宽的定时范围。定时器周期计算公式定时周期 (TIMPRD 1) * (预分频值 1) / CPU时钟频率TIMPRD周期寄存器值32位。预分频值TCR寄存器中的13位预分频系数。CPU时钟频率系统主频。例如需要产生一个10ms的中断CPU时钟为100MHz。先确定预分频值以减小TIMPRD的值。如果我们选择预分频为99则预分频后时钟 100MHz / (991) 1MHz周期1μs。10ms / 1μs 10000个计数。所以TIMPRD 10000 - 1 9999。配置代码示例// 配置Timer0产生10ms中断 volatile uint16_t *timer0_tcr (uint16_t*)0x1810; volatile uint16_t *timer0_prd1 (uint16_t*)0x1812; // 周期低16位 volatile uint16_t *timer0_prd2 (uint16_t*)0x1813; // 周期高16位 volatile uint16_t *timer0_cnt1 (uint16_t*)0x1814; // 计数器低16位 volatile uint16_t *timer0_cnt2 (uint16_t*)0x1815; // 计数器高16位 // 1. 停止定时器 *timer0_tcr ~(1 定时器使能位); // 2. 设置预分频 (假设TCR的[12:0]是预分频位) *timer0_tcr (*timer0_tcr ~0x1FFF) | 99; // 设置预分频值为99 // 3. 设置周期值 (9999 0x270F) *timer0_prd1 0x270F; // 低16位 *timer0_prd2 0x0000; // 高16位 // 4. 设置计数器初值通常等于周期值或0 *timer0_cnt1 0x270F; *timer0_cnt2 0x0000; // 5. 配置TCR自动重载、使能中断、选择时钟源、启动定时器 *timer0_tcr | (1 自动重载位) | (1 中断使能位) | (1 定时器使能位);应用场景任务调度器在定时器中断服务程序中更新系统时钟节拍检查哪些任务需要运行。PWM生成虽然C5515有ePWM模块但用GPIO配合定时器中断也能模拟简单的PWM通过改变中断内翻转电平的计数值来调整占空比。输入捕获配合GPIO中断可以测量脉冲宽度。在上升沿中断时读取定时器计数器值并清零在下降沿中断时再次读取差值即为高电平时间。7.2 看门狗定时器系统的最后防线看门狗用于在软件跑飞或陷入死循环时复位系统。Timer2可以配置为看门狗。其原理是一个独立的计数器不断递减如果减到0就会触发系统复位。正常的软件必须在计数器减到0之前“喂狗”重新加载计数器以此证明软件还在正常运行。看门狗配置关键点解锁序列看门狗的关键寄存器如使能寄存器WDEN、起始值寄存器WDSVR是写保护的。需要先向WDKICK寄存器写入特定的解锁序列如0xAAAA然后0x5555具体值需查手册才能在一个很短的时间窗口内修改它们。超时时间计算看门狗时钟由独立的预分频器16位和16位计数器组成。超时时间 (WDPS 1) * (WDSVR 1) / WDT_CLK频率。WDT_CLK通常来源于一个低速时钟源如32.768kHz RTC时钟。喂狗操作在程序的主循环或关键任务中定期执行解锁序列并向WDKICK写入喂狗值。配置示例// 配置看门狗超时时间约为1秒 (假设WDT_CLK 32.768kHz) // 设置预分频 WDPS 0x0FFF (4095) // 设置重载值 WDSVR 0x007F (127) // 超时时间 ≈ (4096 * 128) / 32768 ≈ 16.0秒 这里需要重新计算。 // 更合理的设置WDPS31, WDSVR1023 时间 (32*1024)/32768 1秒。 // 1. 解锁并配置 kick_watchdog(); // 先执行一次解锁喂狗序列进入配置窗口 *WDPS 31; // 设置预分频 *WDSVR 1023; // 设置重载值 *WDEN 0x0001; // 使能看门狗 // 2. 在主循环中喂狗 while(1) { // ... 执行主要任务 ... kick_watchdog(); // 定期喂狗 } void kick_watchdog(void) { *WDKICK 0xAAAA; // 解锁序列第一部分 *WDKICK 0x5555; // 解锁序列第二部分 (具体值需查手册确认) *WDKICK 0xCAFE; // 喂狗值 (示例) }重要警告看门狗的喂狗点必须仔细设计。切忌在中断服务程序中喂狗除非你能绝对保证即使主程序卡死某个定时中断依然能正常运行。否则可能出现主程序卡死在某个循环但中断依然正常喂狗导致看门狗失效的情况。最安全的做法是在主循环的多个关键点以及任务执行完毕的位置进行喂狗。同时超时时间要设置得比正常的任务循环周期长但又不能太长以至于无法及时检测到故障。