TI MSP430 ADC12_B_init函数返回bool的作用及代码疑问
关于MSP430 DriverLib中ADC12_B_init函数返回值的疑问
我在查看TI为MSP430器件提供的DriverLib代码时,对ADC初始化函数ADC12_B_init(其他初始化函数也存在类似情况)产生了疑惑。
头文件声明代码
/***************************************************************************** // //! \brief Initializes the ADC12B Module. //! //! This function initializes the ADC module to allow for analog-to-digital //! conversions. Specifically this function sets up the sample-and-hold signal //! and clock sources for the ADC core to use for conversions. Upon successful //! completion of the initialization all of the ADC control registers will be //! reset, excluding the memory controls and reference module bits, the given //! parameters will be set, and the ADC core will be turned on (Note, that the //! ADC core only draws power during conversions and remains off when not //! converting).Note that sample/hold signal sources are device dependent. Note //! that if re-initializing the ADC after starting a conversion with the //! startConversion() function, the disableConversion() must be called BEFORE //! this function can be called. //! //! \param baseAddress is the base address of the ADC12B module. //! \param param is the pointer to struct for initialization. //! //! \return STATUS_SUCCESS or STATUS_FAILURE of the initialization process. // //***************************************************************************** extern bool ADC12_B_init(uint16_t baseAddress, ADC12_B_initParam *param);
对应实现代码
bool ADC12_B_init(uint16_t baseAddress, ADC12_B_initParam *param) { //Make sure the ENC bit is cleared before initializing the ADC12 HWREG8(baseAddress + OFS_ADC12CTL0_L) &= ~ADC12ENC; bool retVal = STATUS_SUCCESS; //Turn OFF ADC12B Module & Clear Interrupt Registers HWREG16(baseAddress + OFS_ADC12CTL0) &= ~(ADC12ON + ADC12ENC + ADC12SC); HWREG16(baseAddress + OFS_ADC12IER0) &= 0x0000; //Reset ALL interrupt enables HWREG16(baseAddress + OFS_ADC12IER1) &= 0x0000; HWREG16(baseAddress + OFS_ADC12IER2) &= 0x0000; HWREG16(baseAddress + OFS_ADC12IFGR0) &= 0x0000; //Reset ALL interrupt flags HWREG16(baseAddress + OFS_ADC12IFGR1) &= 0x0000; HWREG16(baseAddress + OFS_ADC12IFGR2) &= 0x0000; //Set ADC12B Control 1 HWREG16(baseAddress + OFS_ADC12CTL1) = param->sampleHoldSignalSourceSelect //Setup the Sample-and-Hold Source + (param->clockSourceDivider & ADC12DIV_7) //Set Clock Divider + (param->clockSourcePredivider & ADC12PDIV__64) + param->clockSourceSelect; //Setup Clock Source //Set ADC12B Control 2 HWREG16(baseAddress + OFS_ADC12CTL2) = ADC12RES_2; //Default resolution to 12-bits //Set ADC12B Control 3 HWREG16(baseAddress + OFS_ADC12CTL3) = param->internalChannelMap; // Map internal channels return (retVal) ; }
根据头文件文档描述,该函数应通过检查判断初始化是否成功,但实际实现中未做任何有效性检查,直接返回STATUS_SUCCESS。我有以下疑问:
- 为何要将该初始化函数定义为返回bool类型?这属于劣质代码、未完成的代码,还是我遗漏了某些细节?
- 初始化函数通常可以执行哪些检查?比如对初始化参数的前置条件校验,或是检查输入引脚是否配置为模拟输入(I2C、SPI等外设也存在类似情况),不过这类检查可能会降低库的可移植性。
关于返回值设计的可能原因
- API一致性考量:DriverLib中多数外设初始化函数统一采用bool返回值设计,即便当前函数未实现失败分支,也为后续版本扩展错误检查逻辑预留了接口,无需修改函数签名。
- 文档与实现脱节:文档撰写时规划了错误检查逻辑,但实际开发中因硬件特性(MSP430的ADC寄存器写入几乎不会失败)、开发周期限制等原因,未完成对应检查代码。
- 硬件特性限制:MSP430的ADC寄存器写入操作在正常硬件环境下不会出错,只要
baseAddress合法、param指针有效,配置就能成功。而指针有效性、地址合法性的检查通常依赖编译器或运行时环境,库本身未额外处理。
初始化函数可实现的常见检查
- 参数合法性校验:
- 检查
baseAddress是否为当前器件有效的ADC外设基地址 - 验证
param指针是否非空 - 检查
param中的配置值是否在硬件允许范围内(比如时钟分频值、采样保持源是否符合当前器件的硬件支持)
- 检查
- 外设状态检查:
- 初始化前确认ADC处于可配置状态(比如是否已调用
disableConversion()关闭转换,避免ENC位置位时配置失效)
- 初始化前确认ADC处于可配置状态(比如是否已调用
- 相关资源检查:
- 对于需要引脚配合的外设(如ADC输入引脚、I2C/SPI的IO口),可检查引脚是否已配置为对应功能模式,但这类检查依赖器件特定的引脚定义,确实会降低库的可移植性,因此多数通用库会省略此类检查,交由应用层处理。
内容的提问来源于stack exchange,提问作者Marco81
相关产品推荐
相关产品推荐

