1. 介绍

和 51 单片机非常像,实验的2个LED灯都是一头接了 +3.3v 电源,控制 LED灯亮的话需要 K210芯片 对应的管脚提供一个低电平。

管脚:

  • 低电平-LED亮
  • 高电平-LED灭

GPIO 连接为:

  • K210-io0  -> LED0 ->+3.3v
  • K210-io17 -> LED1 ->+3.3v

2. 代码

  • pin_config.h
/**
* @par Copyright (C): 2016-2022, Shenzhen Yahboom Tech
* @file pin_config.c
* @author Gengyue
* @version V1.0
* @date 2020.05.27
* @brief 硬件引脚与软件GPIO的宏定义
* @details
* @par History 见如下说明
*
* version: 由于K210使用fpioa现场可编程IO阵列,允许用户将255个内部功能映射到芯片外围的48个自由IO上
* 所以把硬件IO和软件GPIO功能抽出来单独设置,这样更容易理解。
*/
#ifndef _PIN_CONFIG_H_
#define _PIN_CONFIG_H_
/*****************************HEAR-FILE************************************/
#include "fpioa.h" /*****************************HARDWARE-PIN*********************************/
// 硬件IO口,与原理图对应
#define PIN_LED_0 (0)
#define PIN_LED_1 (17) /*****************************SOFTWARE-GPIO********************************/
// 软件GPIO口,与程序对应
#define LED0_GPIONUM (0)
#define LED1_GPIONUM (1) /*****************************FUNC-GPIO************************************/
// GPIO口的功能,绑定到硬件IO口
//通用gpio共8个,使用同一个中断源,可配置输入输出信号,可配置触发IO口总中断,边沿触发和电平触发。每隔IO可以分配到FPIOA上48个管脚之一
//也就是说,可用的通用 gpio 一共有 8 个, 从 FUNC_GPIO0 可知, 对应功能编号为 FUNC_GPIO0(56) ~ FUNC_GPIO7(63)
//在此处采用了 在 基准 FUNC_GPIO0 基础上 +0、+1 来确定对应的 通用 gpio 编号
#define FUNC_LED0 (FUNC_GPIO0 + LED0_GPIONUM)
#define FUNC_LED1 (FUNC_GPIO0 + LED1_GPIONUM) #endif /* _PIN_CONFIG_H_ */
  • main.c
/**
* @par Copyright (C): 2016-2022, Shenzhen Yahboom Tech
* @file main.c
* @author Gengyue
* @version V1.0
* @date 2020.05.27
* @brief FPIOA映射和GPIO驱动LED灯
* @details
* @par History 见如下说明
*
* version: V1.0: LED0与LED1交替点亮,时间间隔为1秒。
*/
#include <stdio.h>
#include <unistd.h>
#include "gpio.h"
#include "pin_config.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)
{
//绑定 K210芯片实际管脚与其对应的fpioa函数编号
fpioa_set_function(PIN_LED_0, FUNC_LED0);
fpioa_set_function(PIN_LED_1, FUNC_LED1);
} /**
* Function main
* @author Gengyue
* @date 2020.05.27
* @brief 主函数,程序的入口
* @param[in] void
* @param[out] void
* @retval 0
* @par History 无
*/
int main(void)
{
hardware_init();// 硬件引脚初始化 gpio_init(); // 使能GPIO的时钟 // 设置LED0和LED1的GPIO模式为输出
gpio_set_drive_mode(LED0_GPIONUM, GPIO_DM_OUTPUT);
gpio_set_drive_mode(LED1_GPIONUM, GPIO_DM_OUTPUT); // 先关闭LED0和LED1
gpio_pin_value_t value = GPIO_PV_HIGH;
gpio_set_pin(LED0_GPIONUM, value);
gpio_set_pin(LED1_GPIONUM, value); while (1)
{
sleep(1);
gpio_set_pin(LED0_GPIONUM, value);
gpio_set_pin(LED1_GPIONUM, value = !value);
}
return 0;
}

通过 main.c 可以看到,总共有如下步骤:

  1. 硬件引脚初始化;
  2. 使能 GPIO 时钟;
  3. 设置LED0和LED1的GPIO模式为输出
  4. 循环控制 LED0 和 LED1 亮灭交替
1. 硬件引脚初始化
void hardware_init(void)
{
//绑定 K210芯片实际管脚与其对应的fpioa函数编号
fpioa_set_function(PIN_LED_0, FUNC_LED0);
fpioa_set_function(PIN_LED_1, FUNC_LED1);
}

PIN_LED_0 是 K210 实际引脚编号,FUNC_LED0 (FUNC_GPIO0 + LED0_GPIONUM)是映射的 fpioa 函数编号

在fpioa_set_function(int number, fpioa_function_t function)中

int fpioa_set_function(int number, fpioa_function_t function)
{
uint8_t index = 0;
/* Check parameters */
// 检查参数
//1. 0<引脚编号number<FPIOA_NUM_IO(48)
//2. 0<函数编号<FUNC_MAX(256)
if(number < 0 || number >= FPIOA_NUM_IO || function < 0 || function >= FUNC_MAX)
return -1;
//如果引脚绑定的函数为 保留功能FUNC_RESV0(120),直接设置并返回
if(function == FUNC_RESV0)
{
fpioa_set_function_raw(number, FUNC_RESV0);
return 0;
}
/* Compare all IO */
//在48个IO FPIOA_NUM_IO 查询
//如果待绑定的函数 function 已被其他 管脚io占用,设置占用的管脚io绑定保留功能
for(index = 0; index < FPIOA_NUM_IO; index++)
{
if((fpioa->io[index].ch_sel == function) && (index != number))
fpioa_set_function_raw(index, FUNC_RESV0);
}
//绑定 K210 实际管脚 number 与 内置函数编号 function
//注意,在点亮LED例程,传入的 function:
// (FUNC_GPIO0 + LED0_GPIONUM) 和 (FUNC_GPIO0 + LED0_GPIONUM) (56+0, 56+1)
fpioa_set_function_raw(number, function);
return 0;
}
2. 设置LED0和LED1的GPIO模式为输出

使能 GPIO 时钟 就是字面意思,不再加以分析

    // 设置LED0和LED1的GPIO模式为输出
// 传参分别为:
// LED0_GPIONUM(0), GPIO_DM_OUTPUT(3)
// LED1_GPIONUM(1), GPIO_DM_OUTPUT(3)
gpio_set_drive_mode(LED0_GPIONUM, GPIO_DM_OUTPUT);
gpio_set_drive_mode(LED1_GPIONUM, GPIO_DM_OUTPUT);
void gpio_set_drive_mode(uint8_t pin, gpio_drive_mode_t mode)
{
// 确保 GPIO pin < GPIO_MAX_PINNO(8,最大通用gpio)
configASSERT(pin < GPIO_MAX_PINNO);
//根据功能号获取 IO 管脚号
//大于等于 0 IO 管脚号
//小于 0 失败
int io_number = fpioa_get_io_by_function(FUNC_GPIO0 + pin);
//确保获取通用管脚号成功
configASSERT(io_number >= 0); fpioa_pull_t pull;
uint32_t dir; switch(mode)
{
case GPIO_DM_INPUT:
pull = FPIOA_PULL_NONE;
dir = 0;
break;
case GPIO_DM_INPUT_PULL_DOWN:
pull = FPIOA_PULL_DOWN;
dir = 0;
break;
case GPIO_DM_INPUT_PULL_UP:
pull = FPIOA_PULL_UP;
dir = 0;
break;
case GPIO_DM_OUTPUT:
pull = FPIOA_PULL_DOWN;
dir = 1;
break;
default:
configASSERT(!"GPIO drive mode is not supported.") break;
}
//设置 IO 的上拉下拉
fpioa_set_io_pull(io_number, pull);
set_gpio_bit(gpio->direction.u32, pin, dir);
}

在这个函数中,就可以看出之前明明绑定 k210实际管脚时用的是:

//FUNC_LED0 (FUNC_GPIO0 + LED0_GPIONUM)
fpioa_set_function(PIN_LED_0, FUNC_LED0);

但是设置 GPIO模式为输出 时用的是:

gpio_set_drive_mode(LED0_GPIONUM, GPIO_DM_OUTPUT);

原理就在于 在传入到 gpio_set_drive_mode 函数后,找 函数对应的管脚号用的是:

int io_number = fpioa_get_io_by_function(FUNC_GPIO0 + pin);

其中 pin=LED0_GPIONUM

可能考虑到函数的简洁,函数fpioa_get_io_by_function(uint8_t pin, gpio_drive_mode_t mode)软件GPIO口 LED0_GPIONUMGPIO口的功能 FUNC_LED0的对应关系封装起来了;

结果就导致虽然在 pin_config.h 中定义了

/*****************************SOFTWARE-GPIO********************************/
// 软件GPIO口,与程序对应
#define LED0_GPIONUM (0)
#define LED1_GPIONUM (1) /*****************************FUNC-GPIO************************************/
// GPIO口的功能,绑定到硬件IO口
//通用gpio共8个,使用同一个中断源,可配置输入输出信号,可配置触发IO口总中断,边沿触发和电平触发。每隔IO可以分配到FPIOA上48个管脚之一
//也就是说,可用的通用 gpio 一共有 8 个, 从 FUNC_GPIO0 可知, 对应功能编号为 FUNC_GPIO0(56) ~ FUNC_GPIO7(63)
//在此处采用了 在 基准 FUNC_GPIO0 基础上 +0、+1 来确定对应的 通用 gpio 编号
#define FUNC_LED0 (FUNC_GPIO0 + LED0_GPIONUM)
#define FUNC_LED1 (FUNC_GPIO0 + LED1_GPIONUM)

但在 main.c 中不知道为什么可以通过 LED0_GPIONUM 设置 FUNC_LED0 绑定的 K210 实际管脚的工作方式

K210开发板学习笔记-点亮LED灯的更多相关文章

  1. NodeMCU手把手入门:配置NodeMCU ESP8266开发板环境及点亮LED灯

    之前一直在玩树莓派,最近实验室买了些NodeMCU就想着玩一玩,没想到挺有意思的.其实树莓派能实现的功能,它大部分也可以,价格比派也便宜不少,舍不得买派的同学可以先买这个开发板玩一玩. 本文主要介绍了 ...

  2. STM32学习笔记——点亮LED

    STM32学习笔记——点亮LED 本人学习STM32是直接通过操作stm32的寄存器,使用的开发板是野火ISO-V2版本: 先简单的介绍一下stm32的GPIO: stm32的GPIO有多种模式: 1 ...

  3. FPGA学习笔记——点亮LED

    软件平台:win7(64bit) + Quartus II 9.1 (64-Bit) 硬件平台:东理电子Easy-FPGA Cyclone II EP2C5T114C8N 这个开发板买了很长时间了,买 ...

  4. CC2540开发板学习笔记(一)——LED点亮

    一.实验内容: 点亮LDE1.2 二.实验原理: 1.电路原理图: 就一个发光二极管串联一个电阻.电阻是为了防止电流过大.利用发光二极管的单向导电性,在P1为高电平是点亮LED,在低电平是熄灭LED. ...

  5. 【转帖】4412ARM开发板学习笔记(一)

    本文转自迅为论坛:http://www.topeetboard.com 新手在进行开发学习前,建议先看01-迅为电子开发板入门视频.对开发板和开发环境有一定的了解后,不要盲目接线开机.以下是个人的一点 ...

  6. CC2540开发板学习笔记(五)——串口通信

    (一)串口发送 一.实验现象: 开发板实现功能发送 二.实验过程 1.PL2303 USB转串口电路图 2.串口发送 (1)查看用户手册有: UART0 对应的外部设备 IO 引脚关系为: P0_2 ...

  7. CC2540开发板学习笔记(三)——外部中断

    一.实验内容 通过外部中断方式依次按下按键S1控制LED1的亮灭 二.实验过程 1.电路原理图同上 2.中断的概念 比如说我们在执行main函数时,突然来了个指令.优先级比现在执行的main还高,那我 ...

  8. CC2540开发板学习笔记(二)——按键

    一.实验内容 用按键S1控制LED1的亮和灭 二.实验过程 1.电路原理: 可以看出,当S按下P0.0和P0.1接地,反之则接高电压. 2.寄存器使用: 依旧应该首先进行3个基本寄存器的设定,对LED ...

  9. 【4412嵌入式开发板学习笔记】认识uboot

    转自迅为讨论群:http://www.topeetboard.com 重要说明:这份笔记不是4412开发配套的,是我在网上看视频的时候下载上课老师的笔记后修改的.所以我试了一下笔记上的uboot命令, ...

  10. CC2540开发板学习笔记(八)—— 看门狗

    一.功能: 防止程序跑飞,使得系统重新进入工作状态,即一种复位操作吧. 但需要不停地喂狗= =(就是不断的执行某种操作),假如说你的程序跑到了不知道哪里去的错误时,即不会实现喂狗,就会发生复位,程序就 ...

随机推荐

  1. python教程8-页面爬虫

    python爬虫常用requests和beautifulSoup这2个第三方模块.需要先进行手动安装. requests负责下载页面数据,beautifulSoup负责解析页面标签. 关于beauti ...

  2. C语言:约瑟夫问题——使用循环链表解决

    传说有30个乘客同乘一条船,因为严重超载,加上风浪水作,危险万分.船长告诉乘客,只有将全船一半的乘客投入海 中,其余人才能幸免于难.他们约定了一个规则:30个人围成一圈,由第一个人数起,依次报数,数到 ...

  3. 组合数学:Burnside引理和Polya定理解决染色置换问题

    例题 给3x3的格子上色,4种颜色,可以重复.排除旋转后相同的情况,请问有多少种不同的上色方法? 解答 设格子编号如下: | 1 | 2 | 3 | | 4 | 5 | 6 | | 7 | 8 | 9 ...

  4. 怀念中的java

    学了这门语言后一直没能做成项目,倒是安装环境,用记事本编辑的话,除了js最好做的就是java了. 以前学java的时候是一帮很有朝气的同学,在一个培训班,每天苦哈哈.从c开始学的语言,学完基础部分转入 ...

  5. redis三主三从集群快速搭建

    redis集群快速搭建 1 本文以redis6.2.6版本为例,快速搭建一套三主三从的redis集群,已经提前将脚本写好,只需要在节点上面进行执行即可安装 #!/bin/bash install_re ...

  6. MFC之多字节和宽字节的总结

    ANSI字符集  所支持的就是多字节的也叫窄字节,类型来说就对应char类型.Unicode字符集 也叫宽字符集 所支持的就是宽字符集,从类型上来说就是 wchar_t类型.gb2312是中国的编码, ...

  7. Android 11(R) MultiMedia(十五)MediaCodec同步模式实现一个简易播放器

    这一节是实践,学习android原生SimplePlayer并自己码一遍,果然学到很多. MyPlayer.h #include <media/stagefright/foundation/AH ...

  8. Qt添加资源文件

    参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=27 以添加图片为例进行说明: 1)点击工程名,选择"添加新文件": 2)选择 ...

  9. react兄弟之间通信

    写入组件 import React, { Component } from 'react'//下面二个就是兄弟关系的组件 import Cmp1 from '../Child/Cmp1' import ...

  10. monaco-editor 实现SQL编辑器

    原文链接:https://www.yuque.com/sxd_panda/antv/editor 安装 yarn add monaco-editor 或 npm install monaco-edit ...