RT thread studio 您所在的位置:网站首页 stm32f407按键控制跑马灯 RT thread studio

RT thread studio

2023-11-03 13:07| 来源: 网络整理| 查看: 265

目录

1、前言

2、普通点灯

3、通过按键点灯

轮询:

中断:

4、输出结果

1、前言

本文目的:在RT Thread Studio中通过按键点灯

RT Thread Studio 版本:2.1.0 

原理图:

2、普通点灯

实现点灯功能,之前老版本的RT Thread studio中main函数就默认写的有点灯,不过现在新的版本中换成了输出"Hello World"。

这里需要用到RT-Thread文档设备中https://www.rt-thread.org/document/site/programming-manual/device/pin/pin/的PIN设备。

1、设置引脚输出模式为PIN_MODE_OUTPUT,其中需要定义输出引脚  #define   LED0_PIN    GET_PIN(A, 5) 或 (#define   LED0_PIN    5 )这里的 5 和GET_PIN(A, 5)是等价的,详细可以看drv_gpio.c函数;

2、控制引脚输出电平的高低。

#include #include "board.h" #include #define DBG_TAG "main" #define DBG_LVL DBG_LOG #include #define LED0_PIN 5 //引脚标号 int main(void) { int count = 1; rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); //输出模式 while (count++) { rt_pin_write(LED0_PIN, count % 2); //使能灯闪烁 rt_thread_mdelay(500); } return RT_EOK; } 3、通过按键点灯

添加按键有两种方式:1、采用按键中断的形式;2、采用轮询的方式。

轮询:

这里有两种方法:1、自己写的;2、调用RT Thread软件包

1、自己写的:在while(1)中读取按键电平的高低,进而判断按键是否按下,根据原理图可以得知,电平默认为1,因此读到为0就表示按下。先设置按键引脚为输入模式,再通过调用下列函数来实现:

#include #include "board.h" #include #define DBG_TAG "main" #define DBG_LVL DBG_LOG #include #define LED0_PIN 5 #define LED1_PIN 6 #define KEY1_PIN GET_PIN(C, 13) //按键引脚定义 #define KEY2_PIN GET_PIN(C, 14) int main(void) { rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); //输出模式 rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT); rt_pin_mode(KEY1_PIN, PIN_MODE_INPUT_PULLUP); rt_pin_mode(KEY2_PIN, PIN_MODE_INPUT_PULLUP); while (1) { if(rt_pin_read(KEY1_PIN) == PIN_LOW) { rt_thread_mdelay(1); //消抖 if(rt_pin_read(KEY1_PIN) == PIN_LOW) { rt_pin_write(LED1_PIN, PIN_HIGH);//点灯1 } } if(rt_pin_read(KEY2_PIN) == PIN_LOW) { rt_thread_mdelay(1); //消抖 if(rt_pin_read(KEY2_PIN) == PIN_LOW) { rt_pin_write(LED1_PIN, PIN_LOW);//灭灯1 } } } return RT_EOK; }

 

2、调用的软件包

                             

添加成功之后,Ctrl+S保存一下,可以看见工程中多了packages一个文件夹,里面就是存放自己添加的软件包。

点开里面的button.c文件,发现这个软件包是基于按键中断写的,大部分功能都已经封装好了,会用就行了。

#include #include "board.h" #include #include "button.h" #define DBG_TAG "main" #define DBG_LVL DBG_LOG #include #define LED0_PIN 5 #define LED1_PIN 6 #define KEY1_PIN GET_PIN(C, 13) //按键引脚定义 #define KEY2_PIN GET_PIN(C, 14) Button_t Button1; Button_t Button2; /*****按键检测接口****/ uint8_t Read_Button1_Level(void) { return rt_pin_read(KEY1_PIN); } uint8_t Read_Button2_Level(void) { return rt_pin_read(KEY2_PIN); } /*******按键回调函数*******/ void Btn1_Dowm_CallBack(void *btn) { rt_pin_write(LED1_PIN, PIN_HIGH); //点灯1 } void Btn2_Dowm_CallBack(void *btn) { rt_pin_write(LED1_PIN, PIN_LOW); //灭灯1 } int main(void) { rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT); //LED输出模式 Button_Create("Button1", //按键名字 &Button1, //按键句柄 Read_Button1_Level, //按键电平检测函数接口 0); //触发电平 Button_Create("Button2", //按键名字 &Button2, //按键句柄 Read_Button2_Level, //按键电平检测函数接口 0); //触发电平 Button_Attach(&Button1, BUTTON_DOWM, Btn1_Dowm_CallBack); //按键单击 Button_Attach(&Button2, BUTTON_DOWM, Btn2_Dowm_CallBack); //按键单击 while (1) { Button_Process(); //按键轮询函数 rt_thread_mdelay(20); //20ms-50ms } return RT_EOK; } 中断:

采用中断的方式,以引脚下降沿为中断触发条件进入中断服务函数,需要用到以下两个函数:

                   

#include #include "board.h" #include #define DBG_TAG "main" #define DBG_LVL DBG_LOG #include #define LED0_PIN 5 #define LED1_PIN 6 #define KEY1_PIN GET_PIN(C, 13) //按键引脚定义 #define KEY2_PIN GET_PIN(C, 14) /******按键1中断*******/ void led_on(void *args) { rt_pin_write(LED1_PIN, PIN_HIGH); //点灯1 } /******按键2中断*******/ void led_off(void *args) { rt_pin_write(LED1_PIN, PIN_LOW); //灭灯1 } int main(void) { rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); //输出模式 rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT); rt_pin_mode(KEY1_PIN, PIN_MODE_INPUT_PULLUP); rt_pin_attach_irq(KEY1_PIN, PIN_IRQ_MODE_FALLING, led_on, RT_NULL); //设置下降沿中断 rt_pin_irq_enable(KEY1_PIN, PIN_IRQ_ENABLE); rt_pin_mode(KEY2_PIN, PIN_MODE_INPUT_PULLUP); rt_pin_attach_irq(KEY2_PIN, PIN_IRQ_MODE_FALLING, led_off, RT_NULL); //设置下降沿中断 rt_pin_irq_enable(KEY2_PIN, PIN_IRQ_ENABLE); while (1) { rt_thread_mdelay(100); } return RT_EOK; }

 

4、输出结果

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有