当前位置:网站首页>Pandora IOT development board learning (RT thread) - Experiment 3 button experiment (learning notes)
Pandora IOT development board learning (RT thread) - Experiment 3 button experiment (learning notes)
2022-07-04 14:26:00 【Xiaohui_ Super】
This article code reference RT-Thread official BSP
List of articles
Experimental function
Routine source code :(main.c)
Functions realized by this experiment : Press down KEY0,LED_R Lighten up , Release KEY0,LED_R Extinguish .
/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2018-08-23 balanceTWK first implementation */
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
int main(void)
{
unsigned int count = 1;
/* Set up RGB The mode of red light pin is output mode */
rt_pin_mode(PIN_LED_R, PIN_MODE_OUTPUT);
/* Set up KEY0 The mode of the pin is input mode */
rt_pin_mode(PIN_KEY0, PIN_MODE_INPUT);
while (count > 0)
{
/* Read button KEY0 Pin status of */
if (rt_pin_read(PIN_KEY0) == PIN_LOW)
{
rt_thread_mdelay(50); // Eliminate jitter
if (rt_pin_read(PIN_KEY0) == PIN_LOW)
{
/* The key has been pressed , Output log, Lighten up LED The lamp */
LOG_D("KEY0 pressed!");
rt_pin_write(PIN_LED_R, PIN_LOW);
}
}
else
{
/* Key not pressed , Extinguish LED The lamp */
rt_pin_write(PIN_LED_R, PIN_HIGH);
}
rt_thread_mdelay(10);
count++;
}
return 0;
}
Code analysis
rt_pin_mode()
The function is to GPIO Pin The initialization , Defined as
/* RT-Thread Hardware PIN APIs */
void rt_pin_mode(rt_base_t pin, rt_base_t mode)
{
RT_ASSERT(_hw_pin.ops != RT_NULL);
_hw_pin.ops->pin_mode(&_hw_pin.parent, pin, mode);
}
Parameters pin It's a rt_base_t Variable (long), Below GET_PIN() yes STM32 Of pin Value macro definition , Fill in capital letters for the first parameter , The second parameter is filled with numbers .
#define GET_PIN(PORTx,PIN) (rt_base_t)((16 * ( ((rt_base_t)__STM32_PORT(PORTx) - (rt_base_t)GPIOA)/(0x0400UL) )) + PIN)
#define __STM32_PORT(port) GPIO##port // ## Is a character connector , If port by A, said GPIOA
For example, in the experiment
#define PIN_LED_R GET_PIN(E, 7), Express GPIOE GPIO_Pin7
at present RT-Thread Supported pin operating modes include :
#define PIN_MODE_OUTPUT 0x00 /* Output */
#define PIN_MODE_INPUT 0x01 /* Input */
#define PIN_MODE_INPUT_PULLUP 0x02 /* Pull up input */
#define PIN_MODE_INPUT_PULLDOWN 0x03 /* Drop down input */
#define PIN_MODE_OUTPUT_OD 0x04 /* Open drain output */
stay bsp Of drv_gpio.c In file , There is a bottom layer GPIO drive , Here is STM32 Of GPIO Driver function of mode setting ( You should be familiar with , Just use HAL Library written GPIO Initialization code )
static void stm32_pin_mode(rt_device_t dev, rt_base_t pin, rt_base_t mode)
{
const struct pin_index *index;
GPIO_InitTypeDef GPIO_InitStruct;
index = get_pin(pin);
if (index == RT_NULL)
{
return;
}
/* Configure GPIO_InitStructure */
GPIO_InitStruct.Pin = index->pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
if (mode == PIN_MODE_OUTPUT)
{
/* output setting */
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
}
else if (mode == PIN_MODE_INPUT)
{
/* input setting: not pull. */
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
}
else if (mode == PIN_MODE_INPUT_PULLUP)
{
/* input setting: pull up. */
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
}
else if (mode == PIN_MODE_INPUT_PULLDOWN)
{
/* input setting: pull down. */
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
}
else if (mode == PIN_MODE_OUTPUT_OD)
{
/* output setting: od. */
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
GPIO_InitStruct.Pull = GPIO_NOPULL;
}
HAL_GPIO_Init(index->gpio, &GPIO_InitStruct);
}
rt_pin_read()
GPIO Read function , Here is the definition of the function :
int rt_pin_read(rt_base_t pin)
{
RT_ASSERT(_hw_pin.ops != RT_NULL);
return _hw_pin.ops->pin_read(&_hw_pin.parent, pin);
}
and GPIO The mode configuration function is similar , It will call the corresponding function in the underlying driver , The underlying function is through HAL_GPIO_ReadPin() To get GPIO The level of .
static int stm32_pin_read(rt_device_t dev, rt_base_t pin)
{
int value;
const struct pin_index *index;
value = PIN_LOW;
index = get_pin(pin);
if (index == RT_NULL)
{
return value;
}
value = HAL_GPIO_ReadPin(index->gpio, index->pin);
return value;
}
rt_thread_mdelay()
This is a RT-Thread Millisecond delay function , The definition is as follows :
rt_err_t rt_thread_mdelay(rt_int32_t ms)
{
rt_tick_t tick;
// Get the required clock beat
tick = rt_tick_from_millisecond(ms);
// Block the corresponding beat time
return rt_thread_sleep(tick);
}
rt_tick_from_millisecond()
/** * Work out ms The number of corresponding clock beats * * * @param ms the specified millisecond * - Negative Number wait forever * - Zero not wait * - Max 0x7fffffff * * @return the calculated tick */
rt_tick_t rt_tick_from_millisecond(rt_int32_t ms)
{
rt_tick_t tick;
if (ms < 0)
{
tick = (rt_tick_t)RT_WAITING_FOREVER; // -1
}
else
{
// take “ Beats per second ” / 1000 * ms, Calculate the corresponding second beats
tick = RT_TICK_PER_SECOND * (ms / 1000);
// Plus less than 1000ms Part of the beat number
tick += (RT_TICK_PER_SECOND * (ms % 1000) + 999) / 1000;
}
/* return the calculated tick */
return tick;
}
rt_thread_sleep()
Thread sleep ( Hang up ) function , The parameter is the number of system beats :
/** * This function can make the current thread hang for a period of time ( from tick decision ) * * @param tick the sleep ticks * * @return RT_EOK */
rt_err_t rt_thread_sleep(rt_tick_t tick)
{
register rt_base_t temp;
struct rt_thread *thread;
/* set to current thread */
thread = rt_thread_self();
RT_ASSERT(thread != RT_NULL);
RT_ASSERT(rt_object_get_type((rt_object_t)thread) == RT_Object_Class_Thread);
/* disable interrupt */
temp = rt_hw_interrupt_disable();
/* suspend thread */
rt_thread_suspend(thread);
/* reset the timeout of thread timer and start it */
rt_timer_control(&(thread->thread_timer), RT_TIMER_CTRL_SET_TIME, &tick);
rt_timer_start(&(thread->thread_timer));
/* enable interrupt */
rt_hw_interrupt_enable(temp);
rt_schedule();
/* clear error number of this thread to RT_EOK */
if (thread->error == -RT_ETIMEOUT)
thread->error = RT_EOK;
return RT_EOK;
}
LOG_D()
In this study , We can LOG_D() As rt_kprintf(),
#define dbg_log_line(lvl, color_n, fmt, ...) \ do \ {
\ _DBG_LOG_HDR(lvl, color_n); \ rt_kprintf(fmt, ##__VA_ARGS__); \ _DBG_LOG_X_END; \ } \ while (0)
LOG_D yes RT-Thread A log printing function in the kernel , Details visible :《RT-Thread Document center ——ulog journal 》
RT-Thread Log API Include :

rt_pin_write()
GPIO Write function , Here is the definition of the function ,
void rt_pin_write(rt_base_t pin, rt_base_t value)
{
RT_ASSERT(_hw_pin.ops != RT_NULL);
_hw_pin.ops->pin_write(&_hw_pin.parent, pin, value);
}
and GPIO The mode configuration function is similar , It will call the corresponding function in the underlying driver , The underlying function is through HAL_GPIO_WritePin() To complete GPIO Pin Modification of .
static void stm32_pin_write(rt_device_t dev, rt_base_t pin, rt_base_t value)
{
const struct pin_index *index;
index = get_pin(pin);
if (index == RT_NULL)
{
return;
}
HAL_GPIO_WritePin(index->gpio, index->pin, (GPIO_PinState)value);
}
边栏推荐
- Detailed index of MySQL
- Visual Studio调试方式详解
- Common content type correspondence table
- RK1126平台OSD的实现支持颜色半透明度多通道支持中文
- opencv3.2 和opencv2.4安装
- 流行框架:Glide的使用
- Supprimer les lettres dupliquées [avidité + pile monotone (maintenir la séquence monotone avec un tableau + Len)]
- Gorm read / write separation (rotation)
- STM32F1与STM32CubeIDE编程实例-MAX7219驱动8位7段数码管(基于GPIO)
- R语言dplyr包summarise_if函数计算dataframe数据中所有数值数据列的均值和中位数、基于条件进行数据汇总分析(Summarize all Numeric Variables)
猜你喜欢

92.(cesium篇)cesium楼栋分层

Leetcode 61: rotating linked list

富文本编辑:wangEditor使用教程

RK1126平台OSD的实现支持颜色半透明度多通道支持中文

C # WPF realizes the real-time screen capture function of screen capture box

按照功能对Boost库进行分类
![Remove duplicate letters [greedy + monotonic stack (maintain monotonic sequence with array +len)]](/img/af/a1dcba6f45eb4ccc668cd04a662e9c.png)
Remove duplicate letters [greedy + monotonic stack (maintain monotonic sequence with array +len)]

NowCoder 反转链表

Map of mL: Based on Boston house price regression prediction data set, an interpretable case of xgboost model using map value

Use of tiledlayout function in MATLAB
随机推荐
codeforce:C. Sum of Substrings【边界处理 + 贡献思维 + 灵光一现】
Redis daily notes
Golang uses JSON unmarshal number to interface{} number to become float64 type (turn)
潘多拉 IOT 开发板学习(RT-Thread)—— 实验3 按键实验(学习笔记)
Nowcoder reverse linked list
Error in find command: paths must precede expression (turn)
關於miui12.5 紅米k20pro用au或者povo2出現問題的解决辦法
Leetcode t49: grouping of alphabetic words
聊聊保证线程安全的 10 个小技巧
2022 game going to sea practical release strategy
Supprimer les lettres dupliquées [avidité + pile monotone (maintenir la séquence monotone avec un tableau + Len)]
The failure rate is as high as 80%. What are the challenges on the way of enterprise digital transformation?
LifeCycle
Leetcode 61: rotating linked list
Fs4059c is a 5V input boost charging 12.6v1.2a. Inputting a small current to three lithium battery charging chips will not pull it dead. The temperature is 60 ° and 1000-1100ma is recommended
nowcoder重排链表
AI与生命科学
Excel快速合并多行数据
Popular framework: the use of glide
富文本编辑:wangEditor使用教程