K210开发板学习笔记-点亮LED灯
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 可以看到,总共有如下步骤:
- 硬件引脚初始化;
- 使能 GPIO 时钟;
- 设置LED0和LED1的GPIO模式为输出
- 循环控制 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_GPIONUM 和 GPIO口的功能 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灯的更多相关文章
- NodeMCU手把手入门:配置NodeMCU ESP8266开发板环境及点亮LED灯
之前一直在玩树莓派,最近实验室买了些NodeMCU就想着玩一玩,没想到挺有意思的.其实树莓派能实现的功能,它大部分也可以,价格比派也便宜不少,舍不得买派的同学可以先买这个开发板玩一玩. 本文主要介绍了 ...
- STM32学习笔记——点亮LED
STM32学习笔记——点亮LED 本人学习STM32是直接通过操作stm32的寄存器,使用的开发板是野火ISO-V2版本: 先简单的介绍一下stm32的GPIO: stm32的GPIO有多种模式: 1 ...
- FPGA学习笔记——点亮LED
软件平台:win7(64bit) + Quartus II 9.1 (64-Bit) 硬件平台:东理电子Easy-FPGA Cyclone II EP2C5T114C8N 这个开发板买了很长时间了,买 ...
- CC2540开发板学习笔记(一)——LED点亮
一.实验内容: 点亮LDE1.2 二.实验原理: 1.电路原理图: 就一个发光二极管串联一个电阻.电阻是为了防止电流过大.利用发光二极管的单向导电性,在P1为高电平是点亮LED,在低电平是熄灭LED. ...
- 【转帖】4412ARM开发板学习笔记(一)
本文转自迅为论坛:http://www.topeetboard.com 新手在进行开发学习前,建议先看01-迅为电子开发板入门视频.对开发板和开发环境有一定的了解后,不要盲目接线开机.以下是个人的一点 ...
- CC2540开发板学习笔记(五)——串口通信
(一)串口发送 一.实验现象: 开发板实现功能发送 二.实验过程 1.PL2303 USB转串口电路图 2.串口发送 (1)查看用户手册有: UART0 对应的外部设备 IO 引脚关系为: P0_2 ...
- CC2540开发板学习笔记(三)——外部中断
一.实验内容 通过外部中断方式依次按下按键S1控制LED1的亮灭 二.实验过程 1.电路原理图同上 2.中断的概念 比如说我们在执行main函数时,突然来了个指令.优先级比现在执行的main还高,那我 ...
- CC2540开发板学习笔记(二)——按键
一.实验内容 用按键S1控制LED1的亮和灭 二.实验过程 1.电路原理: 可以看出,当S按下P0.0和P0.1接地,反之则接高电压. 2.寄存器使用: 依旧应该首先进行3个基本寄存器的设定,对LED ...
- 【4412嵌入式开发板学习笔记】认识uboot
转自迅为讨论群:http://www.topeetboard.com 重要说明:这份笔记不是4412开发配套的,是我在网上看视频的时候下载上课老师的笔记后修改的.所以我试了一下笔记上的uboot命令, ...
- CC2540开发板学习笔记(八)—— 看门狗
一.功能: 防止程序跑飞,使得系统重新进入工作状态,即一种复位操作吧. 但需要不停地喂狗= =(就是不断的执行某种操作),假如说你的程序跑到了不知道哪里去的错误时,即不会实现喂狗,就会发生复位,程序就 ...
随机推荐
- 02 Xpath Helper介绍
目录 参考文档 下载地址 安装 使用 参考文档 xpath helper https://www.cnblogs.com/ChevisZhang/p/12869582.html http://c.bi ...
- 05. C语言数组
数组用于将多个数据集中存储,方便管理,此文将任何集中存储一组数据的语句都称为数组,数组根据存储数据的类型和方式分为以下类型:数组.结构体.共用体.枚举. [数组] 数组用于存储多个类型相同的数据,可以 ...
- Spring 面向切面编程AOP 详细讲解
1. Spring 面向切面编程AOP 详细讲解 @ 目录 1. Spring 面向切面编程AOP 详细讲解 每博一文案 2. AOP介绍说明 2.1 AOP的七大术语 2.2 AOP 当中的 切点表 ...
- mybatis-puls解决多数据源事务的问题
直接上代码: pom: <!--JTA组件核心依赖--> <dependency> <groupId>org.springframework.boot</gr ...
- Django - 在后台上传文章封面图 - 并在前端页面展示
需要用到 models.ImageField(), 它继承自 models.FileField(), 用ImageField的时候需要安装pillow pip install pillow -i h ...
- 用 Sentence Transformers v3 训练和微调嵌入模型
Sentence Transformers 是一个 Python 库,用于使用和训练各种应用的嵌入模型,例如检索增强生成 (RAG).语义搜索.语义文本相似度.释义挖掘 (paraphrase min ...
- 使用 eBPF 在云中实现网络可观测性
可观测性是一种了解和解释应用当前状态的能力,也是一种知道何时出现问题的方法.随着在 Kubernetes 和 OpenShift 上以微服务形式进行云部署的应用程序越来越多,可观察性受到了广泛关注.许 ...
- java开发规范 RestController Apollo logger params T data NPE page
java开发规范 1.@Valid @RequestBody MyAppWorkOrderRequestVO orderRemarkListRequestVO 缺少 @RequestBody 注解,否 ...
- NumPy 差分、最小公倍数、最大公约数、三角函数详解
NumPy 差分 离散差分意味着相邻元素之间的减法. 例如,对于 [1, 2, 3, 4],离散差分将是 [2-1, 3-2, 4-3] = [1, 1, 1] 要找到离散差分,使用 diff() 函 ...
- 有点儿神奇,原来vue3的setup语法糖中组件无需注册因为这个
前言 众所周知,在vue2的时候使用一个vue组件要么全局注册,要么局部注册.但是在setup语法糖中直接将组件import导入无需注册就可以使用,你知道这是为什么呢?注:本文中使用的vue版本为3. ...