/********************************************************************************************************************* * COPYRIGHT NOTICE * Copyright (c) 2020,逐飞科技 * All rights reserved. * 技术讨论QQ群:三群:824575535 * * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 * * @file gpio * @company 成都逐飞科技有限公司 * @author 逐飞科技(QQ3184284598) * @version 查看doc内version文件 版本说明 * @Software ADS v1.2.2 * @Target core TC264D * @Taobao https://seekfree.taobao.com/ * @date 2020-3-23 ********************************************************************************************************************/ #include "zf_gpio.h" //------------------------------------------------------------------------------------------------------------------- // @brief 获取GPIO基地址 // @param pin 选择的引脚 (可选择范围由 common.h 内PIN_enum枚举值确定) // @return void // Sample usage: 文件内部使用,用户无需关心 //------------------------------------------------------------------------------------------------------------------- volatile Ifx_P* get_port(PIN_enum pin) { volatile Ifx_P *port; switch(pin&0xffe0) { case P00_0: port = &MODULE_P00; break; case P02_0: port = &MODULE_P02; break; case P10_0: port = &MODULE_P10; break; case P11_0: port = &MODULE_P11; break; case P13_0: port = &MODULE_P13; break; case P14_0: port = &MODULE_P14; break; case P15_0: port = &MODULE_P15; break; case P20_0: port = &MODULE_P20; break; case P21_0: port = &MODULE_P21; break; case P22_0: port = &MODULE_P22; break; case P23_0: port = &MODULE_P23; break; case P32_0: port = &MODULE_P32; break; case P33_0: port = &MODULE_P33; break; default:break; } #pragma warning 507 return port; #pragma warning default } //------------------------------------------------------------------------------------------------------------------- // @brief GPIO初始化 // @param pin 选择的引脚 (可选择范围由 common.h 内PIN_enum枚举值确定) // @param dir 引脚的方向 输出:GPO 输入:GPI // @param dat 引脚初始化时设置的电平状态,输出时有效 0:低电平 1:高电平 // @param pinmode 引脚配置(可设置参数由zf_gpio.h文件内GPIOMODE_enum枚举值确定) // @return void // Sample usage: gpio_init(P00_0, GPO, 1, PUSHPULL);//P00_0初始化为GPIO功能、输出模式、输出高电平、推挽输出 // @note 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能 //------------------------------------------------------------------------------------------------------------------- void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, GPIOMODE_enum pinmode) { IfxPort_Mode port_mode; if(dir == GPI) { switch(pinmode) { case NO_PULL: port_mode = IfxPort_Mode_inputNoPullDevice; break; case PULLUP: port_mode = IfxPort_Mode_inputPullUp; break; case PULLDOWN: port_mode = IfxPort_Mode_inputPullDown; break; default: port_mode = IfxPort_Mode_inputPullUp; break; } } else { switch(pinmode) { case OPENDRAIN: port_mode = IfxPort_Mode_outputOpenDrainGeneral; break;//开漏输出 default: port_mode = IfxPort_Mode_outputPushPullGeneral; break;//默认为推挽输 } } IfxPort_setPinMode(get_port(pin), pin&0x1f, port_mode); IfxPort_setPinPadDriver(get_port(pin), pin&0x1f, IfxPort_PadDriver_cmosAutomotiveSpeed1); if(dir == GPO) { if(dat) IfxPort_setPinHigh(get_port(pin), pin&0x1f); else IfxPort_setPinLow(get_port(pin), pin&0x1f); } } //------------------------------------------------------------------------------------------------------------------- // @brief GPIO引脚驱动模式 // @param pin 选择的引脚 (可选择范围由 common.h 内PIN_enum枚举值确定) // @param pin_driver 引脚驱动模式设置 // @return void // Sample usage: gpio_pin_driver(P00_0, IfxPort_PadDriver_cmosAutomotiveSpeed1) //------------------------------------------------------------------------------------------------------------------- void gpio_pin_driver(PIN_enum pin, IfxPort_PadDriver pin_driver) { IfxPort_setPinPadDriver(get_port(pin), pin&0x1f, pin_driver); } //------------------------------------------------------------------------------------------------------------------- // @brief GPIO输出设置 // @param pin 选择的引脚 (可选择范围由 common.h 内PIN_enum枚举值确定) // @param dat 0:低电平 1:高电平 // @return void // Sample usage: gpio_set(P00_0, 1);//P00_0 输出高电平 //------------------------------------------------------------------------------------------------------------------- void gpio_set(PIN_enum pin, uint8 dat) { if(dat) IfxPort_setPinHigh(get_port(pin), pin&0x1f); else IfxPort_setPinLow(get_port(pin), pin&0x1f); } //------------------------------------------------------------------------------------------------------------------- // @brief GPIO状态获取 // @param pin 选择的引脚 (可选择范围由 common.h 内PIN_enum枚举值确定) // @return uint8 0:低电平 1:高电平 // Sample usage: uint8 status = gpio_get(P00_0);//获取P00_0引脚电平 //------------------------------------------------------------------------------------------------------------------- uint8 gpio_get(PIN_enum pin) { return IfxPort_getPinState(get_port(pin), pin&0x1f); } //------------------------------------------------------------------------------------------------------------------- // @brief GPIO方向设置 // @param pin 选择的引脚 (可选择范围由 common.h 内PIN_enum枚举值确定) // @param dir 引脚的方向 输出:GPO 输入:GPI // @param pinmode 引脚配置(可设置参数由zf_gpio.h文件内GPIOMODE_enum枚举值确定) // @return void // Sample usage: gpio_dir(P00_0, GPO, PUSHPULL);//设置P00_0为推挽输出模式 //------------------------------------------------------------------------------------------------------------------- void gpio_dir(PIN_enum pin, GPIODIR_enum dir, GPIOMODE_enum pinmode) { IfxPort_Mode port_mode; if(dir == GPI) { switch(pinmode) { case NO_PULL: port_mode = IfxPort_Mode_inputNoPullDevice; break; case PULLUP: port_mode = IfxPort_Mode_inputPullUp; break; case PULLDOWN: port_mode = IfxPort_Mode_inputPullDown; break; default: port_mode = IfxPort_Mode_inputPullUp; break; } } else { switch(pinmode) { case OPENDRAIN: port_mode = IfxPort_Mode_outputOpenDrainGeneral; break;//开漏输出 default: port_mode = IfxPort_Mode_outputPushPullGeneral; break;//默认为推挽输 } } IfxPort_setPinMode(get_port(pin), pin&0x1f, port_mode); } //------------------------------------------------------------------------------------------------------------------- // @brief GPIO 翻转 // @param pin 选择的引脚 (可选择范围由 common.h 内PIN_enum枚举值确定) // @return void // Sample usage: gpio_toggle(P00_0);//P00_0引脚电平翻转 //------------------------------------------------------------------------------------------------------------------- void gpio_toggle(PIN_enum pin) { IfxPort_togglePin(get_port(pin), pin&0x1f); }