void GPIO_setAsOutputPin(uint8_t selectedPort, uint16_t selectedPins) { uint16_t baseAddress = GPIO_PORT_TO_BASE[selectedPort]; #ifndef NDEBUG if(baseAddress == 0xFFFF) { return; } #endif // Shift by 8 if port is even (upper 8-bits) if((selectedPort & 1) ^ 1) { selectedPins <<= 8; } HWREG16(baseAddress + OFS_PASEL0) &= ~selectedPins; HWREG16(baseAddress + OFS_PASEL1) &= ~selectedPins; HWREG16(baseAddress + OFS_PADIR) |= selectedPins; return; }
时间: 2024-04-01 12:31:57 浏览: 80
这段代码的作用是将选定的GPIO端口的选定的引脚设置为输出模式。其中,selectedPort是选定的GPIO端口号,selectedPins是选定的引脚号。该函数首先根据选定的端口号获取对应的基地址,并进行错误检查。接着,如果该端口号为偶数,则将选定的引脚号左移8位。最后,通过修改对应的寄存器,将选定的引脚设置为输出模式。
相关问题
void GPIO_toggleOutputOnPin (uint8_t selectedPort, uint16_t selectedPins) { uint16_t baseAddress = GPIO_PORT_TO_BASE[selectedPort]; #ifndef NDEBUG if(baseAddress == 0xFFFF) { return; } #endif // Shift by 8 if port is even (upper 8-bits) if((selectedPort & 1) ^ 1) { selectedPins <<= 8; } HWREG16(baseAddress + OFS_PAOUT) ^= selectedPins; }
这段代码是什么意思?
这段代码实现了一个函数,名为GPIO_toggleOutputOnPin,用于切换指定端口(selectedPort)上指定GPIO引脚(selectedPins)的输出状态(从高变低或从低变高)。具体实现过程为:获取端口基地址,根据端口号判断是否需要将选定的GPIO引脚左移8位(因为偶数端口的GPIO引脚寄存器在端口基地址上的偏移量为0x02,而奇数端口的GPIO引脚寄存器在端口基地址上的偏移量为0x00),然后通过对端口的PAOUT寄存器进行异或操作,实现GPIO引脚状态的切换。需要注意的是,代码中对端口基地址的判断是为了避免使用无效的端口号(例如,传入的端口号超出了数组GPIO_PORT_TO_BASE的范围),如果传入的端口号无效,函数直接返回,不执行后续操作。
void GPIO_setAsPeripheralModuleFunctionOutputPin(uint8_t selectedPort, uint16_t selectedPins ,uint8_t mode) { uint16_t baseAddress = GPIO_PORT_TO_BASE[selectedPort]; #ifndef NDEBUG if(baseAddress == 0xFFFF) { return; } #endif // Shift by 8 if port is even (upper 8-bits) if((selectedPort & 1) ^ 1) { selectedPins <<= 8; } HWREG16(baseAddress + OFS_PADIR) |= selectedPins; switch (mode){ case GPIO_PRIMARY_MODULE_FUNCTION: HWREG16(baseAddress + OFS_PASEL0) |= selectedPins; HWREG16(baseAddress + OFS_PASEL1) &= ~selectedPins; break; case GPIO_SECONDARY_MODULE_FUNCTION: HWREG16(baseAddress + OFS_PASEL0) &= ~selectedPins; HWREG16(baseAddress + OFS_PASEL1) |= selectedPins; break; case GPIO_TERNARY_MODULE_FUNCTION: HWREG16(baseAddress + OFS_PASEL0) |= selectedPins; HWREG16(baseAddress + OFS_PASEL1) |= selectedPins; break; } }
这段代码的作用是将选定的GPIO端口的选定的引脚设置为外设模块功能输出引脚。其中,selectedPort是选定的GPIO端口号,selectedPins是选定的引脚号,mode是指定的外设模块功能。该函数首先根据选定的端口号获取对应的基地址,并进行错误检查。接着,如果该端口号为偶数,则将选定的引脚号左移8位。然后,通过修改对应的寄存器,将选定的引脚设置为输出模式。根据mode的不同取值,将选定的引脚设置为相应的外设模块功能输出引脚。具体来说,如果mode为GPIO_PRIMARY_MODULE_FUNCTION,则对应的引脚设置为主功能模块输出引脚;如果mode为GPIO_SECONDARY_MODULE_FUNCTION,则对应的引脚设置为辅助功能模块输出引脚;如果mode为GPIO_TERNARY_MODULE_FUNCTION,则对应的引脚设置为第三功能模块输出引脚。
阅读全文