【平头哥RVB2601创意应用开发】+GPIO的使用
本帖最后由 jinglixixi 于 2022-5-10 19:19 编辑<p align="left" style="text-align:left">在解决了开发环境的构建后,首要学习的就是GPIO口的使用。其实,如果没有过高的设计要求,在通常的情况下基本上用GPIO口与延时函数相配合就能解决大部分的问题,因此掌握GPIO口的使用是十分重要的。</p>
<p>那如何来学习GPIO口的使用呢?</p>
<p>在没有相关学习教程的情况下,学习例程的程序设计是最简捷的途径。</p>
<p>作为GPIO口学习的硬件支持则是开发板上的现有资源,即LED和KEY,其电路原理图见图1所示。</p>
<p align="left" style="text-align:left"> </p>
<p> </p>
<p>图1原理图</p>
<p align="left" style="text-align:left"> </p>
<p align="left" style="text-align:left">1.点亮LED</p>
<p>由图2可知LED的引脚连接关系为:</p>
<p>红色 -- PA7</p>
<p>绿色 -- PA25</p>
<p>蓝色 -- PA4</p>
<p>当然在使用时,是需要用短接子来连接的,否则是影响效果观察的。</p>
<p align="left" style="text-align:left"> </p>
<p align="left" style="text-align:left">图2接口的原理图</p>
<p> </p>
<p>要点亮LED就必须对所用的引脚进行功能设置,即设置为输出模式,然后再通过高低电平的输出来控制LED的亮灭。</p>
<p>将相关引脚设为输出模式的函数为:</p>
<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:Calibri,sans-serif"><span lang="EN-US" style="font-family:"Microsoft yahei","serif""><span style="color:#333333">s</span></span></span></span>tatic uint32_t g_ctr = 0;</p>
<p>staticcsi_gpio_pin_t r;</p>
<p>staticcsi_gpio_pin_t g;</p>
<p>staticcsi_gpio_pin_t b;</p>
<pre>
<code class="language-cpp">voidled_pinmux_init()
{
csi_pin_set_mux(PA7, PIN_FUNC_GPIO);
csi_pin_set_mux(PA25, PIN_FUNC_GPIO);
csi_pin_set_mux(PA4, PIN_FUNC_GPIO);
csi_gpio_pin_init(&r, PA7);
csi_gpio_pin_dir(&r, GPIO_DIRECTION_OUTPUT);
csi_gpio_pin_init(&g, PA25);
csi_gpio_pin_dir(&g, GPIO_DIRECTION_OUTPUT);
csi_gpio_pin_init(&b, PA4);
csi_gpio_pin_dir(&b, GPIO_DIRECTION_OUTPUT);
g_ctr = 0;
}
</code></pre>
<p>实现LED灯依次点亮的函数为:</p>
<pre>
<code class="language-cpp">voidled_refresh()
{
g_ctr++;
if (g_ctr % 3 == 0)
{
csi_gpio_pin_write(&r, GPIO_PIN_LOW);
csi_gpio_pin_write(&g, GPIO_PIN_HIGH);
csi_gpio_pin_write(&b, GPIO_PIN_HIGH);
}
else if (g_ctr % 3 == 1)
{
csi_gpio_pin_write(&r, GPIO_PIN_HIGH);
csi_gpio_pin_write(&g, GPIO_PIN_LOW);
csi_gpio_pin_write(&b, GPIO_PIN_HIGH);
}
else
{
csi_gpio_pin_write(&r, GPIO_PIN_HIGH);
csi_gpio_pin_write(&g, GPIO_PIN_HIGH);
csi_gpio_pin_write(&b, GPIO_PIN_LOW);
}
}</code></pre>
<p> </p>
<p>也就是说,通过计数值的变化就可以控制LED工作状态的转换。由原理图可知,LED灯是低高电平点亮,高电平熄灭。</p>
<p>程序下载后,其效果如图3所示。</p>
<p> </p>
<p>图3运行效果</p>
<p> </p>
<p>2.按键判别</p>
<p>由图1可知KEY的引脚连接关系为:</p>
<p>K1 -- PA11</p>
<p>K2 -- PA12</p>
<p> </p>
<p>要判别按键所处的状态,就必须将引脚设置为输入模式,并通过读取位状态来识别电位的高与低。</p>
<p>将相关引脚设为输入模式的函数为:</p>
<p>staticcsi_gpio_pin_t key1;</p>
<p>staticcsi_gpio_pin_t key2;</p>
<pre>
<code class="language-cpp">static void key_init(void)
{
csi_pin_set_mux(PA11, PIN_FUNC_GPIO);
csi_pin_set_mux(PA12, PIN_FUNC_GPIO);
csi_gpio_pin_init(&key1, PA11);
csi_gpio_pin_dir(&key1, GPIO_DIRECTION_INPUT);
csi_gpio_pin_init(&key2, PA12);
csi_gpio_pin_dir(&key2, GPIO_DIRECTION_INPUT);
}</code></pre>
<p>由原理图可知,按键在常规状态是处于高电平状态,当按下按键时则处于低电平状态。</p>
<p> </p>
<p>读取按键状态的语句为:</p>
<p>csi_gpio_pin_read(&key1)</p>
<p>和</p>
<p>csi_gpio_pin_read(&key2)</p>
<p> </p>
<p>3.按键控制LED</p>
<p>若按键K1,则点亮红色LED; 按键K2,则点亮绿色LED,则其控制程序为:</p>
<pre>
<code class="language-cpp">static void key_Lgc(void)
{
// 按下Key1红灯亮
if(GPIO_PIN_LOW == csi_gpio_pin_read(&key1))
{
csi_gpio_pin_write(&r, GPIO_PIN_LOW);
csi_gpio_pin_write(&g, GPIO_PIN_HIGH);
csi_gpio_pin_write(&b, GPIO_PIN_HIGH);
}
// 按下Key2绿灯亮
if(GPIO_PIN_LOW == csi_gpio_pin_read(&key2))
{
csi_gpio_pin_write(&r, GPIO_PIN_HIGH);
csi_gpio_pin_write(&g, GPIO_PIN_LOW);
csi_gpio_pin_write(&b, GPIO_PIN_HIGH);
}
}</code></pre>
<p> </p>
<p>这样就以开发板的作用为基础,掌握了GPIO口的使用,后面就可以利用GPIO来设计自己的程序了。</p>
<p>在设计使用过程中,一个比较讨厌的现象是关机后再次使用就只能编译而无法下载了不知为何?</p>
藏了不少文章呀! <p>关机后再次使用就只能编译而无法下载了</p>
<p>这个好像不应该</p>
本帖最后由 jinglixixi 于 2022-5-11 11:20 编辑
<div class="quote">
<blockquote><font size="2"><a href="forum.php?mod=redirect&goto=findpost&pid=3141896&ptid=1202611" target="_blank"><font color="#999999">Jacktang 发表于 2022-5-11 08:31</font></a></font> 关机后再次使用就只能编译而无法下载了 这个好像不应该</blockquote>
</div>
<p>就是这么怪,十分麻烦。</p>
页:
[1]