rtthread stm32h743的使用(四)pin设备使用

我们要在rtthread studio 开发环境中建立stm32h743xih6芯片的工程。我们使用一块stm32h743及fpga的核心板完成相关实验,核心板如图:
在这里插入图片描述
在这里插入图片描述
1.首先建立rtthread工程
在这里插入图片描述
2.添加相关程序如下,我们在上一节的代码中添加相关代码:
#include <rtthread.h>
#include “rtdevice.h”
#define DBG_TAG “main”
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
#include “drv_common.h”
static int uart_sample(int argc);

#define SAMPLE_UART_NAME “uart2”
#define LED_PIN_NUM_BLUE GET_PIN(H,14) /* PH14 /
#define LED_PIN_NUM_GREEN GET_PIN(H,15) /
PH14 /
#define LED_PIN_NUM_RED GET_PIN(I,1) /
PH14 /
/
用于接收消息的信号量 */
static struct rt_semaphore rx_sem;
static rt_device_t serial;

int main(void)
{
int count = 1;
uart_sample(2);
while (count++)
{
LOG_D(“Hello RT-Thread743!”);
rt_kprintf(“LED_PIN_NUM_BLUE= %d !\n”, LED_PIN_NUM_BLUE);
rt_kprintf(“LED_PIN_NUM_GREEN= %d !\n”, LED_PIN_NUM_GREEN);
// rt_kprintf(“LED_PIN_NUM_RED= %d !\n”, LED_PIN_NUM_RED);

    rt_pin_write(LED_PIN_NUM_BLUE,  PIN_LOW);
    rt_thread_mdelay(500);
    rt_pin_write(LED_PIN_NUM_BLUE,  PIN_HIGH);
    rt_thread_mdelay(500);
    rt_pin_write(LED_PIN_NUM_GREEN, PIN_LOW);
    rt_thread_mdelay(500);
    rt_pin_write(LED_PIN_NUM_GREEN, PIN_HIGH);
    rt_thread_mdelay(500);

// rt_pin_write(LED_PIN_NUM_RED, PIN_LOW);
// rt_thread_mdelay(500);
// rt_pin_write(LED_PIN_NUM_RED, PIN_HIGH);
// rt_thread_mdelay(500);
}

return RT_EOK;

}

/* 接收数据回调函数 /
static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{
/
串口接收到数据后产生中断,调用此回调函数,然后发送接收信号量 */
rt_sem_release(&rx_sem);

return RT_EOK;

}

static void serial_thread_entry(void *parameter)
{
char ch;

while (1)
{
    /* 从串口读取一个字节的数据,没有读取到则等待接收信号量 */
    while (rt_device_read(serial, -1, &ch, 1) != 1)
    {
        /* 阻塞等待接收信号量,等到信号量后再次读取数据 */
        rt_sem_take(&rx_sem, RT_WAITING_FOREVER);
    }
    /* 读取到的数据通过串口错位输出 */
    ch = ch + 1;
    rt_device_write(serial, 0, &ch, 1);
}

}

static int uart_sample(int argc)
{
rt_err_t ret = RT_EOK;
char uart_name[RT_NAME_MAX];
char str[] = “hello RT-Thread!\r\n”;

if (argc == 2)
{
    rt_strncpy(uart_name, SAMPLE_UART_NAME, RT_NAME_MAX);
}
else
{
    rt_strncpy(uart_name, SAMPLE_UART_NAME, RT_NAME_MAX);
}

//PIN设备设置
rt_pin_mode(LED_PIN_NUM_BLUE, PIN_MODE_OUTPUT_OD);
rt_pin_write(LED_PIN_NUM_BLUE, PIN_HIGH);
rt_pin_mode(LED_PIN_NUM_GREEN, PIN_MODE_OUTPUT_OD);
rt_pin_write(LED_PIN_NUM_GREEN, PIN_HIGH);
// rt_pin_mode(LED_PIN_NUM_RED, PIN_MODE_OUTPUT_OD);
// rt_pin_write(LED_PIN_NUM_RED, PIN_HIGH);

//

/* 查找系统中的串口设备 */
serial = rt_device_find(uart_name);
if (!serial)
{
    rt_kprintf("find %s failed!\n", uart_name);
    return RT_ERROR;
}

/* 初始化信号量 */
rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);
/* 以中断接收及轮询发送模式打开串口设备 */
rt_device_open(serial, RT_DEVICE_FLAG_INT_RX|RT_DEVICE_OFLAG_RDWR);
/* 设置接收回调函数 */
rt_device_set_rx_indicate(serial, uart_input);
/* 发送字符串 */
rt_device_write(serial, 0, str, (sizeof(str) - 1));

/* 创建 serial 线程 */
rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 2048, 25, 10);
/* 创建成功则启动线程 */
if (thread != RT_NULL)
{
    rt_thread_startup(thread);
    rt_kprintf("线程启动成功!\n");
}
else
{
    ret = RT_ERROR;
}

return ret;

}

我们的硬件原理图如图:
在这里插入图片描述
所以我们先获得管脚的引脚编号如下:
#define LED_PIN_NUM_BLUE GET_PIN(H,14) /* PH14 /
#define LED_PIN_NUM_GREEN GET_PIN(H,15) /
PH15 /
#define LED_PIN_NUM_RED GET_PIN(I,1) /
PI1 */
这样我们就获得了引脚编号,在如下程序中打印下,看看对不对
rt_kprintf(“LED_PIN_NUM_BLUE= %d !\n”, LED_PIN_NUM_BLUE);
rt_kprintf(“LED_PIN_NUM_GREEN= %d !\n”, LED_PIN_NUM_GREEN);
3.我们在使用pin设备前都要进行模式设置及初始化工作,我们将引脚设为开漏输出,并将引脚初始化为高,这样按照原理图,初始化完成后,led灯会熄灭,如下:
rt_pin_mode(LED_PIN_NUM_BLUE, PIN_MODE_OUTPUT_OD);
rt_pin_write(LED_PIN_NUM_BLUE, PIN_HIGH);
rt_pin_mode(LED_PIN_NUM_GREEN, PIN_MODE_OUTPUT_OD);
rt_pin_write(LED_PIN_NUM_GREEN, PIN_HIGH);
4.编译下载
在这里插入图片描述
我们可以看到打印的引脚编号分别为126和127.我们下载到芯片后就会看到led灯珠闪烁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/415742.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分享一点PDF中获取表格的探索过程

版面分析&#xff1a;如何得到标题、如何的得到段落&#xff08;正确的段落&#xff09;、如何得到表格、如何得到图片&#xff0c;图和得到图片上的文字&#xff1f; 还有细节问题&#xff1a;双栏和多栏的问题、公式问题 扫描件&#xff1a;扫描件本质上是图片&#xff0c;如…

oracle with check option 学习

with check option保证了通过视图进行的修改&#xff0c;必须也能通过该视图看到修改后的结果&#xff1b; 你插入&#xff0c;那么插入这条记录在刷新视图后必须可以看到&#xff1b; 如果修改&#xff0c;修改完的结果也必须能通过该视图看到&#xff1b; scott登录了以后创…

React中使用useActive

1.引入 import { useActivate } from "react-activation";2.React Activation 在React中使用react-activation,其实就是类似于Vue中的keep-alive&#xff0c;实现数据的缓存&#xff1b; 源码&#xff1a; import { ReactNode, ReactNodeArray, Context, Component…

YOLOv8改进,添加GSConv+Slim Neck,有效提升目标检测效果,代码改进(超详细)

目录 摘要 主要想法 GSConv GSConv代码实现 slim-neck slim-neck代码实现 yaml文件 完整代码分享 总结 摘要 目标检测是计算机视觉中重要的下游任务。对于车载边缘计算平台来说&#xff0c;巨大的模型很难达到实时检测的要求。而且&#xff0c;由大量深度可分离卷积层构…

2024-02-28(Kafka,Oozie,Flink)

1.Kafka的数据存储形式 一个主题由多个分区组成 一个分区由多个segment段组成 一个segment段由多个文件组成&#xff08;log&#xff0c;index&#xff08;稀疏索引&#xff09;&#xff0c;timeindex&#xff08;根据时间做的索引&#xff09;&#xff09; 2.读数据的流程 …

Laravel - API 项目适用的图片验证码

1. 安装 gregwar/captcha 图片验证码接口的流程是&#xff1a; 生成图片验证码 生成随机的 key&#xff0c;将验证码文本存入缓存。 返回随机的 key&#xff0c;以及验证码图片 # 不限于 laravel 普通 php 项目也可以使用额 $ composer require gregwar/captcha2. 开发接口 …

51单片机(6)-----直流电机的介绍与使用(通过独立按键控制电机的运行)

前言&#xff1a;感谢您的关注哦&#xff0c;我会持续更新编程相关知识&#xff0c;愿您在这里有所收获。如果有任何问题&#xff0c;欢迎沟通交流&#xff01;期待与您在学习编程的道路上共同进步。 目录 一. 直流电机模块介绍 1.直流电机介绍 2.电机参数 二. 程序设计…

Oracle 直接路径插入(Direct-Path Insert)

直接路径插入&#xff08;Direct Path Insert&#xff09;是Oracle一种数据加载提速技术&#xff0c;可以在使用insert语句或SQL*Loader工具大批量加载数据时使用。直接路径插入处理策略与普通insert语句完全不同&#xff0c;Oracle会通过牺牲空间&#xff0c;安全性&#xff0…

防御保护:防火墙内容安全

一、IAE&#xff08;Intelligent Awareness Engine&#xff09;引擎 二、深度检测技术(DFI和DPI&#xff09; 1.DPI – 深度包检测技术 DPI主要针对完整的数据包&#xff08;数据包分片&#xff0c;分段需要重组&#xff09;&#xff0c;之后对数据包的内容进行识别。&#x…

2024年阿里云2核4G云服务器性能如何?价格便宜有点担心

阿里云2核4G服务器多少钱一年&#xff1f;2核4G服务器1个月费用多少&#xff1f;2核4G服务器30元3个月、85元一年&#xff0c;轻量应用服务器2核4G4M带宽165元一年&#xff0c;企业用户2核4G5M带宽199元一年。本文阿里云服务器网整理的2核4G参加活动的主机是ECS经济型e实例和u1…

第三节-docker-cs架构分析

一、组成 docker engine&#xff1a;docker-client、rest-api、dockerd containerd&#xff1a; 1、管理容器生命周期 2、拉取/推送镜像 3、存储管理 4、调用runc 5、管理网络 containerd-shim&#xff1a;相当于一个驱动&#xff0c;containerd通过containerd-shim驱使…

SpringCloudNacos配置管理及热更新

文章目录 统一配置管理在nacos中添加配置文件从微服务拉取配置配置热更新方式1方式2 配置优先级 之前对 Nacos注册中心入门 已经做了演示. 这篇文章对 Nacos 的服务分级存储模型做理论与实践. 本篇文章阐述 Nacos 做配置中心的理论和实践. 统一配置管理 当微服务部署的实例越…

Vue NextTick工作原理及使用场景

$nextTick的定义及理解&#xff1a; 定义&#xff1a;在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法&#xff0c;获取更新后的 DOM。 所以就衍生出了这个获取更新后的DOM的Vue方法。所以放在Vue.nextTick()回调函数中的执行的应该是会对DOM进行操…

热点参数流控(Sentinel)

热点参数流控 热点流控 资源必须使用注解 SentinelResource 编写接口 以及 热点参数流控处理器 /*** 热点流控 必须使用注解 SentinelResource* param id* return*/ RequestMapping("/getById/{id}") SentinelResource(value "getById", blockHandler …

Media Encoder 2024 for Mac v24.2.1中文激活版

Adobe Media Encoder 2024 for Mac 是一款专业的视频和音频编码工具&#xff0c;专为 Mac 用户打造。它可以将原始素材转换为各种流行格式&#xff0c;以满足不同的播放和发布需求。借助其先进的编码技术和预设设置&#xff0c;用户可以轻松优化输出质量&#xff0c;同时保持文…

森林监测VR虚拟情景再现系统更便利

AI人工智能技术已经逐渐渗透到各个领域&#xff0c;为我们的生活带来了诸多便利。在虚拟仿真教学领域&#xff0c;AI技术的应用也日益丰富&#xff0c;为虚拟情景交互体验带来了前所未有的好处。 提高VR虚拟情景的逼真度 通过深度学习和计算机视觉等技术&#xff0c;AI/VR虚拟现…

[unity]lua热更新——个人复习笔记【侵删/有不足之处欢迎斧正】

一、AssetBundle AB包是特定于平台的资产压缩包&#xff0c;类似于压缩文件 相对于RESOURCES下的资源&#xff0c;AB包更加灵活轻量化&#xff0c;用于减小包体大小和热更新 可以在unity2019环境中直接下载Asset Bundle Browser 可以在其中设置关联 AB包生成的文件 AB包文件…

2024.02.28作业

模拟面试 1. 什么是回调函数 将函数作为另一函数的参数 实现&#xff1a;通过函数指针&#xff0c;如线程的创建函数 2. 结构体和共用体的区别 结构体的每个成员都会分配内存&#xff0c;大小为各个成员所占内存之和&#xff0c;内存对齐 共用体的内存以最大成员为主 3. 赋…

MATLAB练习题:投骰子经过100格的概率

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 有一个人从原点&#xff08;第0格&#xff09;开始扔一个六面…

【Ansys Fluent Web 】全新用户界面支持访问大规模多GPU CFD仿真

基于Web的技术将释放云计算的强大功能&#xff0c;加速CFD仿真&#xff0c;从而减少对硬件资源的依赖。 主要亮点 ✔ 使用Ansys Fluent Web用户界面™&#xff08;UI&#xff09;&#xff0c;用户可通过任何设备与云端运行的仿真进行远程交互 ✔ 该界面通过利用多GPU和云计算功…