前言
学习K210开发板的独立按键和中断功能
一、涉及到的外设资源是K210开发板上的BOOT按键和RGB灯
二、BOOT按键按下,MCU上连接BOOT的IO口变为低电平,松开后为高电平
三、引脚对应关系
BOOT :
IO16
RGB灯:
R:IO6
G:IO7
B:IO8
四、在src目录下新建文件夹,名字叫做button_my
五、在button_my目录下新建两个文件,分别是main.c和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 按键控制RGB灯
* @details
* @par History 见如下说明
*
* version: V1.0: 每次按下按键RGB灯亮红色,松开则熄灭。
*/
#include "pin_config.h"
#include "sleep.h"
#include "gpiohs.h"
#include "sysctl.h"
#include "plic.h"
uint32_t g_count;
/**
* 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映射
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);
fpioa_set_function(PIN_KEY, FUNC_KEY);
}
/**
* Function hardware_init
* @author Gengyue
* @date 2020.05.27
* @brief RGB灯灭
* @param[in] void
* @param[out] void
* @retval void
* @par History 无
*/
void rgb_all_off(void)
{
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);
}
/**
* Function init_rgb
* @author Gengyue
* @date 2020.05.27
* @brief 初始化RGB灯
* @param[in] void
* @param[out] void
* @retval void
* @par History 无
*/
void init_rgb(void)
{
/* 设置RGB灯的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);
/* 关闭RGB灯 */
rgb_all_off();
}
/**
* Function key_irq_cb
* @author Gengyue
* @date 2020.05.27
* @brief 按键key中断回调函数
* @param[in] ctx 回调参数
* @param[out] void
* @retval 0
* @par History 无
*/
int key_irq_cb(void* ctx)
{
gpio_pin_value_t key_state = gpiohs_get_pin(KEY_GPIONUM);
/* 这里只是为了测试才在中断回调打印数据,正常情况下是不建议这么做的。*/
printf("IRQ The PIN is %d\n", key_state);
uint32_t *tmp = (uint32_t *)(ctx);
printf("count is %d\n", (*tmp)++);
if (!key_state)
gpiohs_set_pin(RGB_R_GPIONUM, GPIO_PV_LOW);
else
gpiohs_set_pin(RGB_R_GPIONUM, GPIO_PV_HIGH);
return 0;
}
/**
* Function init_key
* @author Gengyue
* @date 2020.05.27
* @brief 初始化按键key
* @param[in] void
* @param[out] void
* @retval void
* @par History 无
*/
void init_key(void)
{
/* 设置按键的GPIO模式为上拉输入 */
gpiohs_set_drive_mode(KEY_GPIONUM, GPIO_DM_INPUT_PULL_UP);
/* 设置按键的GPIO电平触发模式为上升沿和下降沿 */
gpiohs_set_pin_edge(KEY_GPIONUM, GPIO_PE_BOTH);
/* 设置按键GPIO口的中断回调 */
gpiohs_irq_register(KEY_GPIONUM, 1, key_irq_cb, &g_count);
}
/**
* Function main
* @author Gengyue
* @date 2020.05.27
* @brief 主函数,程序的入口
* @param[in] void
* @param[out] void
* @retval 0
* @par History 无
*/
int main(void)
{
// 硬件引脚初始化
hardware_init();
/* 外部中断初始化 */
plic_init();
/* 使能全局中断 */
sysctl_enable_irq();
// 初始化RGB灯
init_rgb();
// 初始化按键key
init_key();
while (1);
return 0;
}
七、在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_RGB_R (6)
#define PIN_RGB_G (7)
#define PIN_RGB_B (8)
#define PIN_KEY (16)
/*****************************SOFTWARE-GPIO********************************/
// 软件GPIO口,与程序对应
#define RGB_R_GPIONUM (0)
#define RGB_G_GPIONUM (1)
#define RGB_B_GPIONUM (2)
#define KEY_GPIONUM (3)
/*****************************FUNC-GPIO************************************/
// GPIO口的功能,绑定到硬件IO口
#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)
#define FUNC_KEY (FUNC_GPIOHS0 + KEY_GPIONUM)
#endif /* _PIN_CONFIG_H_ */
八、在build路径下输入cmake … -DPROJ=button_my -G “MinGW Makefiles” 后回车
九、再输入make进行编译,编译之前记得Ctrl+S进行保存,不然会编译不成功
十、编译成功
十一、编译成功后会在build目录下生成.bin文件
十二、连接好开发板,使用K210官方提供的烧录软件进行烧录
十三、实验现象,按下BOOT按键,亮红灯。在串口助手中可以查看到按键按下的次数以及IO引脚中断状态