龙芯2K500开发板上实现的呼吸灯效果

前言 本来这篇文章应该在上周就写完的,不过突然被安排出差,一直忙到了现在,终于可以静下心来做些其它事情。 之前和龙芯3A5000主机一起送过来的还有一块龙芯2K500的迷你开发板,整个板子不到巴掌大小。之前只是简单做了上电启动,这次拿到了比较完整的开发资料,可以尝试为开发板编写一些程序了。 由于暂时没有屏幕,只能先试着做一些其它的事情,如通信和IO控制,其中最简单,最基础的就是LED灯的控制。然后我就发现,这个板子居然有一颗可以调节亮度的LED灯!没错,之前做的LED控制都只能进行开关操作,而可以调节亮度,意味着可以做出更多的显示效果,这次我就做了一个呼吸灯的效果。 然后,我也简单了解了一下这种亮度调节的原理,实际上就是通过调节PWM输出的占空比,改变一个周期内输出的高低电平所占的比例,实现控制LED灯亮度的效果。由于引脚输出的电压是固定的,所以不能通过改变电平来控制亮度,而改变高低电平的占空比则是另一种思路,嵌入式设备的屏幕背光亮度调节也是基于同样的原理。 开发板上电启动、连接串口终端 由于暂时没有屏幕,想要和开发板进行交互就只能通过终端的方式,通常开发板都会有调试串口,我们先通过串口终端登录设备,配置好网口IP地址后,再通过网络连接登录设备。 串口的连接方式如下图: 将绿、白、黑三色线以图中方式接好(红线不用接),USB端插入到电脑,应该不需要装驱动,电脑可以直接识别出串口设备。 打开串口终端工具,比如Windows MobaXterm,linux minicom等,我比较喜欢用putty。 配置好端口,设置 波特率:115200 数据位:8位 停止位:1位 校验:无 硬件流控:无 然后给开发板接通电源,就可以看到调试输出信息了。 查看系统信息,可以看到运行的是安装了PREEMPT_RT补丁的实时操作系统。 1 2 3 [root@LS-GD ~]# uname -a Linux LS-GD 5.10.0.lsgd-g434b00a6badf #1 PREEMPT Wed Sep 14 12:57:58 CST 2022 loongarch64 GNU/Linux [root@LS-GD ~]# 配置交叉编译环境 2K500开发板是loongarch64架构的嵌入式板卡。下载好对应的交叉编译工具链后,解压到系统/opt/目录下。按手册来就好~ 1 $ sudo tar -xf toolchain-loongarch64-linux-gnu-gcc8-host-x86_64-2022-07-18.tar.xz -C /opt/ 然后我们需要将交叉编译器添加到系统路径,方便我们接下来使用。 这里我直接将配置写成脚本,方便下次使用。 1 2 3 4 5 6 7 8 $ cd /opt/toolchain-loongarch64-linux-gnu-gcc8-host-x86_64-2022-07-18 # 创建脚本 $ sudo touch environment-setup-loongarch64-linux-gnu # 添加可执行权限 $ sudo chmod +x environment-setup-loongarch64-linux-gnu # 修改脚本内容 $ sudo vi environment-setup-loongarch64-linux-gnu # 内容如下~ 1 2 3 4 5 6 7 8 # environment-setup-loongarch64-linux-gnu CC_PREFIX=/opt/toolchain-loongarch64-linux-gnu-gcc8-host-x86_64-2022-07-18 export PATH=$CC_PREFIX/bin:$PATH export LD_LIBRARY_PATH=$CC_PREFIX/lib:$LD_LIBRARY_PATH export LD_LIBRARY_PATH=$CC_PREFIX/loongarch64-linux-gnu/lib64:$LD_LIBRARY_PATH export ARCH=loongarch export CROSS_COMPILE=loongarch64-linux-gnu- 接下来测试一下交叉编译环境 ...

二月 19, 2023 · 3 分钟 · 452 字

Prism note

简介 Prism是一个用于WPF、Xamarin Forms、WinUI等的MVVM框架,刚刚学习,这里只是个人总结的一些知识点笔记。 IoC IContainerProvider 1 2 3 4 protected override Window CreateShell() { return Container.Resolve<MainWindow>(); } 1 2 3 4 5 6 public void OnInitialized(IContainerProvider containerProvider) { var regionManager = containerProvider.Resolve<IRegionManager>(); var viewA = containerProvider.Resolve<ViewA>(); ... } IContainerRegistry 1 2 3 4 5 6 7 8 9 // App.xaml.cs protected override void RegisterTypes(IContainerRegistry containerRegistry) { containerRegistry.Register<IApplicationCommands, ApplicationCommands>(); containerRegistry.RegisterDialog<NotificationDialog, NotificationDialogViewModel>(); containerRegistry.RegisterForNavigation<Page1>(); containerRegistry.RegisterForNavigation<Page2>(); ... } Module IModule ...

九月 4, 2020 · 3 分钟 · 1338 字

C#传递函数指针到C++

简介 在编码的时候难免会遇到不同编程语言之间的接口调用,其中最通用的就是C的动态链接库,几乎所有语言都可以调用C的接口函数。那么这种关系能否反过来呢?用C调用其它的函数接口,当然也是可以的,只需要将函数指针作为参数传递进去就可以了。 ...

七月 17, 2020 · 2 分钟 · 780 字

Rust 学习资源收集

文档 The Rust Programming Language Second edition Rust 程序设计语言(第二版)简体中文版 Rust by Example 通过例子学 Rust Async programming in Rust with async-std async-std 中文文档 其它 Rust Language Cheat Sheet Rust Fundamentals Rust语言中文社区

六月 4, 2020 · 1 分钟 · 63 字

一些基本没什么用的MFC技巧

前言 由于我很少用MFC,只有工作上需要的时候才会用到,所以我也是个新手,遇到问题需要到网上找很久资料。这里只是记录一些特殊情景下会用到的技巧,方便以后查找。 ...

四月 24, 2020 · 4 分钟 · 1900 字

如何获取Windows10主题颜色

前言 最近公司的系统也开始陆续向 Windows 10 迁移了,我的办公电脑也终于换上了新系统。为了适应新的开发环境,有时候需要获取一些系统相关的信息,这里就稍微总结一下。 ...

四月 24, 2020 · 5 分钟 · 2328 字

为程序添加通知栏图标

前言 经常看到其它程序在最小化或者窗口隐藏后依旧会在通知栏显示一个托盘图标,像微信、QQ之类的,即使主窗口不显示,程序并不会退出,依旧可以通过托盘图标进行操作。 那么怎样为自己的程序添加一个托盘图标呢?这次就来讲一讲。 ...

三月 25, 2020 · 2 分钟 · 910 字

应用程序单例模式

简介 通常来说,应用程序可以启动任意数目的实例,前提是你的电脑内存足够大,想启动多少都可以。但有时候我们只希望程序同时只有一个实例在运行,应用程序不会重复运行。这就是应用程序的单例模式。 ...

三月 25, 2020 · 3 分钟 · 1415 字

WPF 获取命令行参数

虽然平时很少会用到命令行参数,但有时候可以使用命令行参数来使程序执行不同的行为。 在写控制台程序的时候,我们可以直接得到程序命令行参数。 1 2 3 4 static void Main(string[] args) { // args 就是命令行参数 } 那么如果不是控制台程序如何获取命令行参数呢? ...

三月 25, 2020 · 1 分钟 · 418 字

Newtonsoft.NET 基本使用

简介 JSON是一种常用的轻量级数据交换格式。与XML相比,JSON无论是体积还是可读性都更好,所以在网络数据传输和应用程序中被广泛的应用。 那么,.NET平台使用最广泛的JSON库是什么呢?自然要数Newtonsoft.NET了,打开nuget包管理器第一个就是,在所有包下载量排行中排名第一。使用简单,性能可靠,文档也很齐全。 使用 使用JSON最常用的就是对象的序列化和反序列化。 先来看最基本的使用 1 2 3 4 5 6 7 // 先定义一个类 public class TestJsonDeseClass { public Guid MessageGuid { get; set; } public string Message { get; set; } } 1 2 3 4 5 6 7 8 TestJsonDeseClass test = new TestJsonDeseClass() { MessageGuid = Guid.NewGuid(), Message = "Test Message" }; string json = JsonConvert.SerializeObject(test); TestJsonDeseClass des = JsonConvert.DeserializeObject<TestJsonDeseClass>(json); 只需要将类的成员属性设置为get和set就可以了,反序列化的时候,Json.NET会自动根据成员的名字为对象的成员赋值。 ...

二月 22, 2020 · 3 分钟 · 1286 字