嵌入式波形生成:时序控制与数据移位法对比

嵌入式波形生成:时序控制与数据移位法对比 嵌入式波形生成函数的两种实现方法对比1. 项目概述在嵌入式系统开发中通过GPIO输出特定波形是一个常见需求。本文分析两种不同的波形生成方法实现原理并比较其适用场景。目标波形为一个包含21个时钟周期的特定高低电平序列要求通过单个GPIO引脚准确输出。2. 波形要求分析目标波形具有以下特征总时长21个时间单位电平序列高2低1、高1低2、高3低1、高1低1、高2低1、高2低1、高3低0每个电平持续时间单位为1ms基于HAL_Delay实现3. 第一种实现方法时序控制法3.1 实现原理通过直接控制GPIO电平状态和持续时间来生成波形。该方法将波形分解为多个独立的时间段每个时间段对应特定的电平状态。3.2 关键代码实现static void plus(uint16_t h_times, uint16_t l_times) { IO_HIGH(); HAL_Delay(h_times); IO_LOW(); HAL_Delay(l_times); } static void outplus(void) { plus(2, 1); // 高2低1 plus(1, 2); // 高1低2 plus(3, 1); // 高3低1 plus(1, 1); // 高1低1 plus(2, 1); // 高2低1 plus(2, 1); // 高2低1 plus(3, 0); // 高3结束 }3.3 方法特点优点实现直观易于理解适合简单波形生成调试方便可单独测试每个时间段缺点代码冗余扩展性差波形修改需要重新编写函数不适合复杂波形生成4. 第二种实现方法数据移位法4.1 实现原理将整个波形编码为一个32位整数0x1A75B7通过移位操作逐位输出。这种方法模拟了常见串行通信协议的数据发送方式。4.2 关键代码实现uint32_t out_data 0x1A75B7; static void WaveOutput(uint32_t data) { int i; for(i 0; i 21; i) { if(data 0x100000) // 检查最高有效位 { IO_HIGH(); } else { IO_LOW(); } data 1; // 左移一位 HAL_Delay(1); // 每个电平持续1ms } }4.3 编码原理波形数据0x1A75B7对应的二进制表示为0001 1010 0111 0101 1011 0111取前21位000 1101 0011 1010 1101 101对应波形序列从最高位开始高2低1000高1低2110高3低1100高1低1111高2低1010高2低1110高3低01104.4 方法特点优点代码简洁扩展性强波形修改只需改变数据值与通信协议实现原理一致缺点需要预先计算波形编码调试时不如时序法直观5. 与通信协议实现的关联性5.1 软件I2C实现对比典型I2C数据发送函数同样采用数据移位方式void i2c_SendByte(uint8_t _ucByte) { uint8_t i; for(i 0; i 8; i) { if(_ucByte 0x80) // 检查最高位 { I2C_SDA_1(); } else { I2C_SDA_0(); } i2c_Delay(); I2C_SCL_1(); i2c_Delay(); I2C_SCL_0(); if(i 7) { I2C_SDA_1(); // 释放总线 } _ucByte 1; // 左移一位 i2c_Delay(); } }5.2 软件SPI实现对比SPI数据发送也采用类似模式void bsp_spiWrite0(uint8_t _ucByte) { uint8_t i; for(i 0; i 8; i) { if(_ucByte 0x80) // 检查最高位 { MOSI_1(); } else { MOSI_0(); } bsp_spiDelay(); SCK_1(); _ucByte 1; bsp_spiDelay(); SCK_0(); } bsp_spiDelay(); }6. 工程实践建议简单波形应用推荐使用时序控制法适合一次性波形或调试场景复杂波形或通信协议推荐使用数据移位法便于维护和扩展与标准通信协议实现方式一致性能优化方向使用定时器中断替代Delay函数采用DMA传输提高效率考虑使用硬件PWM生成基础波形可维护性建议为波形数据添加详细注释封装波形生成函数为独立模块提供波形可视化调试工具