
1. 全志R329开发板硬件概览R329-EVB5开发板作为全志科技推出的嵌入式开发平台搭载了双核Cortex-A53 HIFI4 DSP异构计算架构的R329芯片。这块120mm×126mm的2层PCB板上几乎引出了芯片所有功能引脚包括核心处理器主频1.5GHz的ARM Cortex-A53双核搭配400MHz的Cadence HIFI4 DSP适合音频处理场景存储配置板载128MB SPI NAND FlashSIP封装的128MB/256MB DDR3内存具体容量取决于R329-N3/N4版本扩展接口标准40pin GPIO排针兼容树莓派布局、MicroSD卡槽支持128GB、USB OTG接口特色外设XR829或RTL8723DS无线模块2.4G WiFiBT、千兆以太网PHY、3.5mm音频接口、SPDIF输入输出开发板右上角标注着LEDC和PWM字样的两个LED灯珠正是本教程要控制的对象。其中LEDC灯通过专用LED控制器驱动支持256级亮度调节PWM灯则连接在芯片的PWM0引脚上。2. 开发环境搭建与SDK获取2.1 工具链安装全志平台开发需要配置专用的交叉编译工具链。推荐使用Ubuntu 18.04/20.04系统执行以下步骤# 安装基础依赖 sudo apt update sudo apt install -y git make gcc g bison flex python3 swig \ device-tree-compiler u-boot-tools # 下载工具链约1.2GB wget https://github.com/YuzukiHD/Tina-Linux/releases/download/tina-v1.0/toolchain_linux.tar.gz tar -zxvf toolchain_linux.tar.gz -C /opt2.2 获取Tina Linux SDK全志官方基于OpenWRT定制的Tina Linux是开发的主要环境git clone --depth1 https://github.com/YuzukiHD/Tina-Linux.git cd Tina-Linux ./build.sh config # 选择方案R329-EVB5 ./build.sh -j$(nproc)编译完成后镜像文件输出在out/r329-evb5目录包含boot.img、rootfs.img等文件。2.3 烧录系统到开发板使用PhoenixSuit工具通过USB烧录开发板拨码开关设置为FEL模式1-4脚ON5-8脚OFF按住FEL按钮同时上电进入烧录模式选择编译生成的tina_r329-evb5_uart0.img文件串口调试连接使用USB转TTL模块连接开发板UART0TX-PA13, RX-PA14波特率设置为115200无流控上电后可在终端看到系统启动日志3. LED控制原理与寄存器配置3.1 硬件电路分析开发板上的两个LED连接方式不同PWM LED通过1K限流电阻连接到PA5引脚PWM0功能LEDC LED直接连接到专用LED控制器输出端查看原理图可知LED均为低电平有效输出0时点亮。需要特别注意全志芯片的GPIO电压域分为多个组BANK不同BANK的供电电压可能不同。3.2 寄存器级操作直接操作寄存器是最底层的控制方式。以PWM LED为例首先需要配置PA5的复用功能// 设置PA5为PWM0功能功能2 volatile uint32_t *pa_cfg (uint32_t *)0x0300B000; *pa_cfg (*pa_cfg ~(0x7 20)) | (0x2 20);然后配置PWM控制器// 使能PWM时钟 *(volatile uint32_t *)0x030010A0 | (1 6); // 设置PWM周期和占空比 *(volatile uint32_t *)0x0300A000 0xFF; // 周期 *(volatile uint32_t *)0x0300A004 0x7F; // 占空比50% // 使能PWM输出 *(volatile uint32_t *)0x0300A008 | 0x1;3.3 设备树配置Tina Linux中使用设备树描述硬件资源。在device/config/chips/r329/configs/evb5/board.dts中添加pwm: pwm300a000 { compatible allwinner,sunxi-pwm; reg 0x0300a000 0x400; #pwm-cells 3; pwm-number 1; status okay; }; pwm_led { compatible pwm-leds; led { label pwm_led; pwms pwm 0 50000 0; // PWM0, 50ms周期 max-brightness 255; }; };4. 用户空间控制实战4.1 通过sysfs控制PWM LEDLinux内核已集成PWM子系统加载驱动后会在/sys/class/pwm/生成控制接口# 导出PWM0 echo 0 /sys/class/pwm/pwmchip0/export # 设置周期单位纳秒 echo 50000000 /sys/class/pwm/pwmchip0/pwm0/period # 设置占空比 echo 25000000 /sys/class/pwm/pwmchip0/pwm0/duty_cycle # 使能输出 echo 1 /sys/class/pwm/pwmchip0/pwm0/enable4.2 使用LED子系统控制LEDC内核LED子系统提供了更简单的控制方式# 查看可用LED ls /sys/class/leds/ # 设置触发模式心跳效果 echo heartbeat /sys/class/leds/ledc/trigger # 手动控制亮度 echo 128 /sys/class/leds/ledc/brightness4.3 Python控制示例通过python-periphery库可以更方便地操作from periphery import PWM import time pwm PWM(0, 0) # PWM芯片0,通道0 pwm.frequency 100 # 100Hz pwm.duty_cycle 0.5 # 50%占空比 pwm.enable() try: while True: for duty in range(0, 100, 5): pwm.duty_cycle duty/100 time.sleep(0.1) except KeyboardInterrupt: pwm.close()5. 进阶应用与调试技巧5.1 实现呼吸灯效果结合内核定时器可以实现平滑的亮度变化#include linux/module.h #include linux/pwm.h static struct pwm_device *pwm; static int brightness 0; static int direction 1; static void breath_work(struct work_struct *work) { pwm_config(pwm, brightness * 100, 10000); brightness direction; if (brightness 100 || brightness 0) direction * -1; schedule_delayed_work(to_delayed_work(work), msecs_to_jiffies(50)); } static DECLARE_DELAYED_WORK(breath, breath_work); static int __init pwm_init(void) { pwm pwm_request(0, breath-led); pwm_config(pwm, 0, 10000); pwm_enable(pwm); schedule_delayed_work(breath, msecs_to_jiffies(100)); return 0; }5.2 使用LEDC的RGB控制LED控制器支持更复杂的灯光效果# 设置渐变效果 echo 1 /sys/class/leds/ledc/ramp_step_duration echo 50 /sys/class/leds/ledc/ramp_duty_step echo 1 /sys/class/leds/ledc/ramp_enable5.3 常见问题排查LED不亮检查/sys/class/gpio/下对应引脚是否已导出用万用表测量LED两端电压确认硬件连接正常执行dmesg | grep pwm查看驱动加载日志亮度调节不线性PWM频率过高可能导致LED闪烁建议保持在100Hz-1kHz对于LEDC检查/sys/class/leds/ledc/max_brightness值系统卡死可能是PWM时钟配置错误导致锁总线尝试降低PWM频率或检查设备树配置实际调试中发现R329的PWM时钟源需要保持稳定。当CPU频率变化时建议使用独立的24MHz OSC作为时钟源避免亮度随CPU负载波动。