文章目录
- 开发板
- 实验目的
- 实验准备
- 查看原理图
- 软件对应SDK
- GPIO配置函数
- 什么是 FPIOA 呢
- 实验代码
- LED/RGB驱动
- 主程序控制
- 实验结果
开发板
实验目的
实现开发板上LED0、LED1以及RGB灯的点亮
实验准备
查看原理图
K210 开发板出厂默认已经焊接好 LED0 和 LED1。LED0 连接的是 IO0,LED1
连接的是 IO17,LED0 为红灯,LED1 为绿灯。两颗 LED 灯都是低电平点亮,高电平熄灭。
软件对应SDK
对应的头文件 gpio.h
GPIO配置函数
通用 gpio 共 8 个,使用同一个中断源,可配置输入输出信号,可配置触发
IO 口总中断,边沿触发和电平触发。每隔 IO 可以分配到 FPIOA 上 48 个管脚之
一。
• gpio_init:GPIO 口初始化
• gpio_set_drive_mode:设置 GPIO 口输入或输出模式
• gpio_set_pin:设置 GPIO 引脚电平高/低
• gpio_get_pin:读取 GPIO 引脚电平
什么是 FPIOA 呢
FPIOA (现场可编程 IO 阵列)允许用户将 255 个内部功能映射到芯片外围的 48 个自由
IO 上:
• 支持IO 的可编程功能选择
• 支持IO 输出的8 种驱动能力选择
• 支持IO 的内部上拉电阻选择
• 支持IO 的内部下拉电阻选择
• 支持IO 输入的内部施密特触发器设置
• 支持IO 输出的斜率控制
• 支持内部输入逻辑的电平设置
实验代码
LED/RGB驱动
bsp_led_rgb.h
#ifndef __BSP_LED_RGB_H_
#define __BSP_LED_RGB_H_
/*****************************HEAR-FILE************************************/
#include "fpioa.h"
#include "gpiohs.h"
#include "gpio.h"
#include "fpioa.h"
#include "sleep.h"
/*****************************HARDWARE-PIN*********************************/
#define IS_HIGH_GPIO 1
// 硬件IO口,与原理图对应
//led
#define PIN_LED_0 (0)
#define PIN_LED_1 (17)
//rgb
#define PIN_RGB_R (6)
#define PIN_RGB_G (7)
#define PIN_RGB_B (8)
/*****************************SOFTWARE-GPIO********************************/
// 软件GPIO口,与程序对应
//led
#define LED0_GPIONUM (3)
#define LED1_GPIONUM (4)
//rgb
#define RGB_R_GPIONUM (0)
#define RGB_G_GPIONUM (1)
#define RGB_B_GPIONUM (2)
/*****************************FUNC-GPIO************************************/
// GPIO口的功能,绑定到硬件IO口
//led
#define FUNC_LED0 (FUNC_GPIO0 + LED0_GPIONUM)
#define FUNC_LED1 (FUNC_GPIO0 + LED1_GPIONUM)
//rgb
#if IS_HIGH_GPIO
#define FUNC_RGB_R (FUNC_GPIOHS0 + RGB_R_GPIONUM)
#define FUNC_RGB_G (FUNC_GPIOHS0 + RGB_G_GPIONUM)
#define FUNC_RGB_B (FUNC_GPIOHS0 + RGB_B_GPIONUM)
#else
#define FUNC_RGB_R (FUNC_GPIO0 + RGB_R_GPIONUM)
#define FUNC_RGB_G (FUNC_GPIO0 + RGB_G_GPIONUM)
#define FUNC_RGB_B (FUNC_GPIO0 + RGB_B_GPIONUM)
#endif
void rgbInit(void);
void ledInit(void);
void rgbClose(void);
void ledClose(void);
void ledFlash(int ms);
void rgbFlash(int ms);
#endif /* __BSP_LED_RGB_H_ */
bsp_led_rgb.c
#include "bsp_led_rgb.h"
/**
* Function hardware_init
* @author Gengyue
* @date 2020.05.27
* @brief 硬件初始化,绑定GPIO口
* @param[in] void
* @param[out] void
* @retval void
* @par History 无
*/
void hardware_init(void)
{
fpioa_set_function(PIN_LED_0, FUNC_LED0);
fpioa_set_function(PIN_LED_1, FUNC_LED1);
fpioa_set_function(PIN_RGB_R, FUNC_RGB_R);
fpioa_set_function(PIN_RGB_G, FUNC_RGB_G);
fpioa_set_function(PIN_RGB_B, FUNC_RGB_B);
}
void rgbInit()
{
gpio_init();
//硬件初始化,绑定GPIO口
fpioa_set_function(PIN_RGB_R, FUNC_RGB_R);
fpioa_set_function(PIN_RGB_G, FUNC_RGB_G);
fpioa_set_function(PIN_RGB_B, FUNC_RGB_B);
//设置模式为输出
#if IS_HIGH_GPIO
gpiohs_set_drive_mode(RGB_R_GPIONUM, GPIO_DM_OUTPUT);
gpiohs_set_drive_mode(RGB_G_GPIONUM, GPIO_DM_OUTPUT);
gpiohs_set_drive_mode(RGB_B_GPIONUM, GPIO_DM_OUTPUT);
#else
gpio_set_drive_mode(RGB_R_GPIONUM, GPIO_DM_OUTPUT);
gpio_set_drive_mode(RGB_G_GPIONUM, GPIO_DM_OUTPUT);
gpio_set_drive_mode(RGB_B_GPIONUM, GPIO_DM_OUTPUT);
#endif
}
void ledInit()
{
gpio_init();
//硬件初始化,绑定GPIO口
fpioa_set_function(PIN_LED_0, FUNC_LED0);
fpioa_set_function(PIN_LED_1, FUNC_LED1);
//设置LED0和LED1的GPIO模式为输出
gpio_set_drive_mode(LED0_GPIONUM, GPIO_DM_OUTPUT);
gpio_set_drive_mode(LED1_GPIONUM, GPIO_DM_OUTPUT);
}
void rgbClose()
{
#if IS_HIGH_GPIO
gpiohs_set_pin(RGB_R_GPIONUM, GPIO_PV_HIGH);
gpiohs_set_pin(RGB_G_GPIONUM, GPIO_PV_HIGH);
gpiohs_set_pin(RGB_B_GPIONUM, GPIO_PV_HIGH);
#else
gpio_set_pin(RGB_R_GPIONUM, GPIO_PV_HIGH);
gpio_set_pin(RGB_G_GPIONUM, GPIO_PV_HIGH);
gpio_set_pin(RGB_B_GPIONUM, GPIO_PV_HIGH);
#endif
}
void ledClose()
{
// 先关闭LED0和LED1
gpio_pin_value_t value = GPIO_PV_HIGH;
gpio_set_pin(LED0_GPIONUM, value);
gpio_set_pin(LED1_GPIONUM, value);
}
void ledFlash(int ms)
{
static gpio_pin_value_t value = GPIO_PV_HIGH;
msleep(ms);
gpio_set_pin(LED0_GPIONUM, value);
gpio_set_pin(LED1_GPIONUM, value = !value);
}
void rgbFlash(int ms)
{
static uint8_t rgbIndex = 0;
rgbIndex %= 3;
rgbClose();
gpiohs_set_pin(rgbIndex, GPIO_PV_LOW);
rgbIndex++;
msleep(ms);
}
主程序控制
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include "bsp.h"
#include "bsp_led_rgb.h"
#include "bsp_usart.h"
int main(void)
{
ledInit();
rgbInit();
while (1){
ledFlash(1000);
sleep(1);
rgbFlash(300);
}
return 0;
}
实验结果
LED0 和 LED1 两个灯交替点亮,RGB等也会红绿蓝依次切换