例程-GPIO¶
GPIO初始化¶
void gpio_init (gpio_pin_enum pin, gpio_dir_enum dir, uint8 dat, gpio_mode_enum pinmode)
// 函数简介 gpio 初始化
// 参数说明 pin 选择的引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
// 参数说明 mode 引脚的方向 [GPI/GPIO]
// 这里应该是[GPI/GPO]吧
// 参数说明 dat 引脚初始化时设置的电平状态,输出时有效 0:低电平 1:高电平 仅在设置为输出模式时有效
// 参数说明 mode 引脚的模式 (可选择范围由 zf_driver_gpio.h 内 gpio_mode_enum 枚举值确定)
// 返回参数 void
// 使用示例 gpio_init(P00_0, GPO, 1, GPO_PUSH_PULL); // P00_0初始化为GPIO功能、输出模式、输出高电平、推挽输出
// 备注信息 需要特别注意P20_2是不能用于输出的,仅仅只有输入的功能
typedef enum // 枚举端口方向 此枚举定义不允许用户修改
{
GPI = 0, // 定义管脚输入方向
GPO = 1, // 定义管脚输出方向
}gpio_dir_enum;
typedef enum // 枚举端口模式 此枚举定义不允许用户修改
{
GPI_FLOATING_IN, // 定义管脚浮空输入
GPI_PULL_UP , // 定义管脚上拉输入
GPI_PULL_DOWN , // 定义管脚下拉输入
GPO_PUSH_PULL , // 定义管脚推挽输出
GPO_OPEN_DTAIN , // 定义管脚开漏输出
}gpio_mode_enum;
GPIO引脚模式¶
好的,这是它们的简练说明:
-
GPI_FLOATING_IN
(浮空输入):- 状态: 引脚电平完全由外部决定,内部无上拉或下拉。
- 特点: 外部未连接时,电平不确定,易受干扰。
-
GPI_PULL_UP
(上拉输入):- 状态: 内部接一电阻到电源 (VCC)。
- 特点: 外部未拉低时,默认为高电平。
-
GPI_PULL_DOWN
(下拉输入):- 状态: 内部接一电阻到地 (GND)。
- 特点: 外部未拉高时,默认为低电平。
-
GPO_PUSH_PULL
(推挽输出):- 状态: 能主动输出高电平 (连接到VCC) 和低电平 (连接到GND)。
- 特点: 驱动能力强,高低电平都确定。
-
GPO_OPEN_DRAIN
(开漏输出) (假设OPEN_DTAIN
是OPEN_DRAIN
的笔误):- 状态: 只能主动输出低电平 (连接到GND) 或呈高阻态 (开路)。
- 特点: 输出高电平需外部上拉电阻。允许多个开漏输出并联(线与)。
GPIO电平获取¶
uint8 gpio_get_level (gpio_pin_enum pin){
return IfxPort_getPinState(get_port(pin), pin&0x1f);
}
// 函数简介 gpio 电平获取
// 参数说明 pin 选择的引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
// 返回参数 uint8 引脚当前电平
// 使用示例 uint8 status = gpio_get_level(P00_0);// 获取P00_0引脚电平
GPIO输出设置¶
void gpio_set_level (gpio_pin_enum pin, uint8 dat)
{
if(dat)
{
IfxPort_setPinHigh(get_port(pin), pin&0x1f);
}
else
{
IfxPort_setPinLow(get_port(pin), pin&0x1f);
}
}
// 函数简介 gpio 输出设置
// 参数说明 pin 选择的引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
// 参数说明 dat 0:低电平 1:高电平
// 返回参数 void
// 使用示例 gpio_set_level(P00_0, 1);// P00_0 输出高电平
GPIO方向设置¶
void gpio_set_dir (gpio_pin_enum pin, gpio_dir_enum dir, gpio_mode_enum pinmode)
{
IfxPort_Mode port_mode;
if(dir == GPI)
{
switch(pinmode)
{
case GPI_FLOATING_IN:port_mode = IfxPort_Mode_inputNoPullDevice ; break; // 浮空输入
case GPI_PULL_DOWN :port_mode = IfxPort_Mode_inputPullDown ; break; // 下拉输入
default: port_mode = IfxPort_Mode_inputPullUp ; break; // 默认为上拉输入
}
}
else
{
switch(pinmode)
{
case GPO_OPEN_DTAIN :port_mode = IfxPort_Mode_outputOpenDrainGeneral; break;// 开漏输出
default: port_mode = IfxPort_Mode_outputPushPullGeneral ; break;// 默认为推挽输出
}
}
IfxPort_setPinMode(get_port(pin), pin&0x1f, port_mode);
}
// 函数简介 gpio 方向设置
// 参数说明 pin 选择的引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
// 参数说明 dir 引脚的方向 输出:GPO 输入:GPI
// 参数说明 mode 引脚的模式 (可选择范围由 zf_driver_gpio.h 内 gpio_mode_enum 枚举值确定)
// 返回参数 void
// 使用示例 gpio_dir(P00_0, GPO, GPO_PUSH_PULL);// 设置P00_0为推挽输出模式
GPIO翻转电平¶
void gpio_toggle_level (gpio_pin_enum pin)
{
IfxPort_togglePin(get_port(pin), pin&0x1f);
}
// 函数简介 gpio 翻转电平
// 参数说明 pin 选择的引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
// 返回参数 void
// 使用示例 gpio_toggle_level(P00_0);// P00_0引脚电平翻转
延时函数¶
void system_delay_ms (uint32 time)
{
if(time > 40000)
{
while(time > 40000)
{
system_delay_10ns(4000000000);
time = time - 40000;
}
system_delay_10ns(time * 100000);
}
else
{
system_delay_10ns(time * 100000);
}
}
// 函数简介 system 毫秒 延时函数
// 参数说明 time 延时时间 单位:ms
// 返回参数 void
// 使用示例 system_delay_ms(100); // 延时100毫秒
案例¶
#include "zf_common_headfile.h"
#pragma section all "cpu0_dsram"
#define LED1 (P20_9)
#define LED2 (P20_8)
#define LED3 (P21_5)
#define LED4 (P21_4)
#define KEY1 (P20_6)
#define KEY2 (P20_7)
#define KEY3 (P11_2)
#define KEY4 (P11_3)
#define SWITCH1 (P33_11)
#define SWITCH2 (P33_12)
uint16 delay_time = 0;
uint8 led_state = 0;
int core0_main(void)
{
clock_init(); // 获取时钟频率<务必保留>
debug_init(); // 初始化默认调试串口
// 此处编写用户代码 例如外设初始化代码等
gpio_init(LED1, GPO, GPIO_LOW, GPO_PUSH_PULL); // 初始化 LED1 输出 默认高电平 推挽输出模式
gpio_init(LED2, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 初始化 LED2 输出 默认高电平 推挽输出模式
gpio_init(LED3, GPO, GPIO_LOW, GPO_PUSH_PULL); // 初始化 LED3 输出 默认高电平 推挽输出模式
gpio_init(LED4, GPO, GPIO_HIGH, GPO_PUSH_PULL); // 初始化 LED4 输出 默认高电平 推挽输出模式
gpio_init(KEY1, GPI, GPIO_HIGH, GPI_PULL_UP); // 初始化 KEY1 输入 默认高电平 上拉输入
gpio_init(KEY2, GPI, GPIO_HIGH, GPI_PULL_UP); // 初始化 KEY2 输入 默认高电平 上拉输入
gpio_init(KEY3, GPI, GPIO_HIGH, GPI_PULL_UP); // 初始化 KEY3 输入 默认高电平 上拉输入
gpio_init(KEY4, GPI, GPIO_HIGH, GPI_PULL_UP); // 初始化 KEY4 输入 默认高电平 上拉输入
gpio_init(SWITCH1, GPI, GPIO_HIGH, GPI_PULL_UP); // 初始化 SWITCH1 输入 默认高电平 上拉输入
gpio_init(SWITCH2, GPI, GPIO_HIGH, GPI_PULL_UP); // 初始化 SWITCH2 输入 默认高电平 上拉输入
// 此处编写用户代码 例如外设初始化代码等
cpu_wait_event_ready(); // 等待所有核心初始化完毕
while (TRUE)
{
// 此处编写需要循环执行的代码
delay_time = 300;
if(gpio_get_level(SWITCH1)) delay_time /= 2;
if(gpio_get_level(SWITCH2)) delay_time /= 2;
if( !gpio_get_level(KEY1) || !gpio_get_level(KEY2) || !gpio_get_level(KEY3) || !gpio_get_level(KEY4) ) // 获取 KEYx 电平为低
{
gpio_set_level(LED1, led_state);
gpio_set_level(LED2, led_state);
gpio_set_level(LED3, led_state);
gpio_set_level(LED4, led_state);
}
else
{
gpio_set_level(LED1, led_state);
gpio_set_level(LED2, !led_state);
gpio_set_level(LED3, led_state);
gpio_set_level(LED4, !led_state);
}
led_state = !led_state;
system_delay_ms(delay_time);
// 此处编写需要循环执行的代码
}
}
#pragma section all restore