<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[【R128】外设模块配置——ADC按键配置方法]]></title><description><![CDATA[<p dir="auto">基于R128-S2设计的全套开发板已上线淘宝百问网韦东山老师个人店进行售卖，包含黑色的DshanMCU-R128s2-R16N16模组和全套的DshanMCU-R128s2-DEVKIT。</p>
<ul>
<li><strong>DshanMCU-R128s2-R16N16模组：39.9元</strong></li>
<li><strong>DshanMCU-R128s2-DEVKIT开发板：59.9元</strong></li>
</ul>
<p dir="auto"><strong>R128开发板购买链接：<a href="https://item.taobao.com/item.htm?spm=a21n57.1.0.0.46b0523cMfarLo&amp;id=736154682975&amp;ns=1&amp;abbucket=5#detail" target="_blank" rel="noopener noreferrer nofollow ugc">https://item.taobao.com/item.htm?spm=a21n57.1.0.0.46b0523cMfarLo&amp;id=736154682975&amp;ns=1&amp;abbucket=5#detail</a></strong></p>
<p dir="auto"><img src="/assets/uploads/files/1696746474623-%E4%B8%BB%E5%9B%BE_01-%E4%B8%BA%E6%99%BA%E8%83%BD%E5%AF%B9%E8%B1%A1-1.jpg" alt="“主图_01”为智能对象-1.jpg" class=" img-responsive img-markdown" /></p>
<h1>ADC 按键配置方法</h1>
<p dir="auto">FreeRTOS平台上使用的按键为ADC-KEY，采用的ADC模块为GPADC。</p>
<p dir="auto">按键功能驱动的实现是通过ADC分压，使每个按键检测的电压值不同，从而实现区分不同的按键。按下或者弹起中断之后，通过中断触发，主动检测当前电压识别出对应的按键。最后再通过input子系统将获取按键的键值并上报给应用层。</p>
<h3>GPADC-Key配置方法</h3>
<p dir="auto">按键结构体定义key_config的成员：</p>
<pre><code>struct sunxikbd_config{
    unsigned int measure;    // 电压阈值
    char *name;				 // 功能名
    unsigned int key_num;    // 按键数量
    unsigned int scankeycodes[KEY_MAX_CNT];    // 按键的键值
    unsigned int key_vol[KEY_MAX_CNT];         // 按键的电压值
};

不同平台的配置可能不同，以r128为例，下面是r128的成员config：

static struct sunxikbd_config key_config = {
    .measure = 2500,
    .name = "gpadc-key",
    .key_num = 5,
    .key_vol = {164,415,646,900,1157},
    .scankeycodes = {115,114,139,164,116}
};
</code></pre>
<p dir="auto">当前按键驱动的配置都是以hardcode的方式写入驱动代码中，也就是说按键的数量，不同按键对应的电压值，不同按键对应的KeyCode等等配置如果要修改的话，需要对源码进行修改。</p>
<p dir="auto">如上述按键结构体的定义，以下两配置按照默认配置即可。</p>
<ul>
<li>
<p dir="auto">measure：GPADC最大能够识别的电压值，需要根据UserMaual来设置。默认为2.5V。</p>
</li>
<li>
<p dir="auto">name：注册的按键驱动名称，会注册到input子系统中。</p>
</li>
</ul>
<p dir="auto">可以自定义的配置为：key_num，key_vol，scankeycodes。</p>
<ul>
<li>
<p dir="auto">key_num: 按照实际硬件设计来设置。</p>
</li>
<li>
<p dir="auto">key_vol: 按照硬件，实际每个按键分压的情况来设置。</p>
</li>
<li>
<p dir="auto">scankeycodes：每个按键对应的KeyCode，方便应用通过input获得按下的按键时，能够识别是哪个按键按下了。</p>
</li>
</ul>
<p dir="auto">key_vol的配置方法，可以参考下图的GPADC-KEY的硬件设置。</p>
<p dir="auto"><img src="/assets/uploads/files/1697769930504-key_hardware-16976822125112.png" alt="key_hardware-16976822125112.png" class=" img-responsive img-markdown" width="987" height="520" /></p>
<p dir="auto">在图中，VCC输入的电压为3.3V，通过分压关系，第一个按键的电压为0.21V，因此key_vol可以设置为210，以此类推。</p>
<h2>驱动初始化方法</h2>
<p dir="auto">默认系统启动时，不会加载GPADC驱动以及按键驱动。</p>
<p dir="auto">如果需要加载GPADC-Key驱动，需要调用以下函数：</p>
<pre><code class="language-c">int sunxi_gpadc_key_init(void);
</code></pre>
<p dir="auto">调用sunxi_gpadc_key_init()该函数即可完成GPADC驱动以及按键驱动的加载了，即可开始使用按键驱动。</p>
<h2>应用调用方法</h2>
<p dir="auto">接下来继续介绍一下，应用中该如何获取按键按下的事件。</p>
<p dir="auto">在FreeRTOS系统中，也移植了 Linux 的 input 子系统。GPADC-Key 中也是调用了 input 的接口，进行注册 input 设置，上报事件等动作。</p>
<p dir="auto">在调用 <code>sunxi_gpadc_key_init()</code> 时，通过 <code>input_set_capability()</code> 去设置了事件的属性；通过<code>sunxi_input_register_device()</code> 注册了 <code>input</code> 设备；在按键按下触发中断时，也是通过 <code>input_report_key()</code> 和 <code>input_sync()</code> 上报 <code>input</code> 事件。</p>
<p dir="auto">因此，在应用层想要获取input事件，可以直接通过input接口去获取，使用示例可如下例程：</p>
<pre><code class="language-c">int input_func(void)
{
	int fd = -1;
	struct sunxi_input_event event;

	sunxi_gpadc_key_init(); // 驱动初始化

	fd = sunxi_input_open(DEVICE_NAME);
	if (fd &lt; 0)
		return -1;

	while (1) {
		sunxi_input_readb(fd, &amp;event, sizeof(struct sunxi_input_event));
		if (event.type != EV_KEY)
			continue;

		if (event.value == 0) {
			printf("key up\n");
			continue;
		}
		printf("key press: KeyCode:%d\n", event.code);
	}

	return 0;
}
</code></pre>
]]></description><link>https://bbs.aw-ol.com/topic/4456/r128-外设模块配置-adc按键配置方法</link><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Apr 2026 09:07:41 GMT</lastBuildDate><atom:link href="https://bbs.aw-ol.com/topic/4456.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 20 Oct 2023 02:47:29 GMT</pubDate><ttl>60</ttl></channel></rss>