![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
MCU编程
文章平均质量分 68
pq113_6
这个作者很懒,什么都没留下…
展开
-
LVGL学习笔记17 - 开关Switch
开关看起来像一个小滑块,功能类似于按钮,通过lv_switch_create创建对应的对象。原创 2023-01-13 21:00:00 · 3023 阅读 · 6 评论 -
LVGL学习笔记16 - 进度条Bar
进度条有一个背景和一个指示器组成,通过lv_bar_create创建对象。进度条默认的范围是 0..100。原创 2023-01-11 21:00:00 · 3848 阅读 · 0 评论 -
LVGL学习笔记15 - 文本框TextArea
文本框由一个Label和一个光标组合而成,用于文本输入。通过lv_textarea_create创建对象。原创 2023-01-10 21:00:00 · 5143 阅读 · 4 评论 -
LVGL学习笔记14 - 线Line
通过一组点绘制出相连的直线,通过lv_line_create创建相应的对象。线只有LV_PART_MAIN一个部件。原创 2023-01-05 21:00:00 · 3886 阅读 · 0 评论 -
LVGL学习笔记13 - 圆弧Arc
圆弧由背景和前景弧组成,通过lv_arc_create创建。原创 2023-01-04 21:00:00 · 4129 阅读 · 0 评论 -
LVGL学习笔记12 - 复选框CheckBox
复选框通过lv_checkbox_create创建。一个CheckBox由一个点击框加一个Label组成。注意,CheckBox的size可以不用设置,会自动匹配字符串长度。字符串可以通过lv_checkbox_set_text和lv_checkbox_set_text_static更改。原创 2023-01-03 21:00:00 · 1867 阅读 · 0 评论 -
LVGL学习笔记11 - 按钮矩阵Button Matrix
按钮矩阵是多个按钮的组合,例如直接绘制一个九宫格按键。按钮矩阵的按钮是实时绘制的,所以占用的内存会比较小。通过lv_btnmatrix_create函数创建按钮矩阵对象。原创 2023-01-02 21:00:00 · 6401 阅读 · 3 评论 -
LVGL学习笔记10 - 按钮Button
按钮有点类似矩形框,更多的是具有事件属性。通过lv_btn_create创建。按钮的Parts只有LV_PART_MAIN。原创 2023-01-01 21:00:00 · 9688 阅读 · 4 评论 -
LVGL学习笔记9 - 标签Label
显示字符串是通过对象Label实现的。Label的Parts只有LV_LABEL_PART_MAIN。标签通过lv_label_create创建。原创 2022-12-31 21:00:00 · 6374 阅读 · 1 评论 -
LVGL学习笔记8 - 字体
字体是位图和呈现字母(字形)图像所需的其他信息的集合。LVGL的字库信息保存在lv_font_t的变量中。LVGL默认使用ASCII范围(包含所有ASCII字符,度数符号(U + 00B0),项目符号(U + 2022)和内置图标)的一组字体,在lv_conf.h中有相关的宏定义可以使能相应大小的字体,默认使用LV_FONT_MONTSERRAT_14,这里的14指的是字体大小。数字越大,字体的像素越大,占用的空间越大。原创 2022-12-30 21:00:00 · 7752 阅读 · 3 评论 -
LVGL学习笔记7 - GD32平台优化
学习过程中发现GD32平台的显示效果不佳,而且会出现死机的问题,需要优化一下平台代码。原创 2022-12-29 21:00:00 · 2081 阅读 · 0 评论 -
LVGL学习笔记6 - 输入设备
输入设备的回调函数需要用户根据硬件自己实现,例如上例中的lv_win32_pointer_driver_read_callback、lv_win32_keypad_driver_read_callback和lv_win32_encoder_driver_read_callback。通过lv_obj_add_event_cb给对象添加事件处理程序函数。filter - 事件代码,例如LV_EVENT_CLICKED表示点击事件,具体可以看lv_event.h中的枚举lv_event_code_t。原创 2022-12-28 21:00:00 · 6583 阅读 · 0 评论 -
LVGL学习笔记5 - Display, Screen和Layer
目录1. Display2. Screen2.1 创建Screen2.2 加载Screen2.3 获取活动的Screen2.4 实例2.4.1 定义2个Screen全局变量2.4.2 初始化Screen2.4.3 循环更替3. Layer图层3.1 切换顺序3.2 顶层和系统层3.3 实例3.3.1 创建全局变量3.3.2 初始化3.3.3 循环更替处理在移植那里会有一个显示接口的移植,这部分其实对应的就是Display,可以翻译为显示器。在LVGL中,可以有多个Display,即物理上支持多个显示器。原创 2022-12-27 21:00:00 · 3755 阅读 · 0 评论 -
LVGL学习笔记4 - 主题Themes
目录1. 获取主题句柄2. 设置基础主题3. 设置主题的回调函数4. 使能主题5. 实例5.1 定义一个全局Style变量5.2 显示默认主题风格的矩形5.3 初始化新主题的样式 5.4 初始化新主题 5.5 回调函数的实现 5.6 设置新主题5.7 显示主题是风格的集合。对应的变量结构体是lv_theme_t。定义一个主题也必须是全局变量或者静态的。参数含义:obj - 对象句柄,如果是NULL,则获取的是默认主题。为主题设置基础主题。基础主题中的样式将添加到当前主题的样式之前。通过设置基本主题,可原创 2022-12-26 21:00:00 · 3906 阅读 · 0 评论 -
LVGL学习笔记3 - 样式Style
样式用于设置对象的外观,比如颜色等属性,存储在 lv_style_t 变量中,这个变量应该是static 、全局 或 动态分配的。1. 初始化样式在使用样式之前,应使用 lv_style_init(&style) 进行初始化 。static lv_style_t style;lv_style_init(&style);2. 设置样式初始化后,我们就可以设置样式的属性。 属性集函数如下所示:lv_style_set_<property_name>(..原创 2022-12-25 21:00:00 · 2617 阅读 · 0 评论 -
LVGL学习笔记2 - 对象
LVGL是Light and Versatile Graphics Library(轻量级通用型图形库)的简称,遵循MIT开源许可协议。LVGL的官网地址如下:LVGL - Light and Versatile Embedded Graphics LibraryLVGL中文资料:http://lvgl.z.net1. 下载LVGL源代码源代码在Github上。GitHub - lvgl/lvgl: Powerful and easy-to-use embedded GUI li原创 2022-12-24 21:00:00 · 2638 阅读 · 0 评论 -
LVGL学习笔记1 - 准备
LVGL是Light and Versatile Graphics Library(轻量级通用型图形库)的简称,遵循MIT开源许可协议。LVGL的官网地址如下:LVGL - Light and Versatile Embedded Graphics Library1. 下载LVGL源代码源代码在Github上。GitHub - lvgl/lvgl: Powerful and easy-to-use embedded GUI library with many widgets, advan原创 2022-12-23 21:00:00 · 3496 阅读 · 0 评论 -
FreeRTOS学习笔记 11 - 中断管理
FreeRTOS的中断处理方式和RT Thread有点不同,在中断处理函数中Free RTOS都会有对应的API,例如xQueueSend对应xQueueSendFromISR,即API函数名加上“FromISR”就是中断中的API函数。原创 2022-05-31 21:00:00 · 3706 阅读 · 0 评论 -
FreeRTOS学习笔记 10 - 消息队列
注意,FreeRTOS消息队列传递的是实际数据,并不是数据地址消息队列,这点在之前的邮箱中有强调。消息队列的句柄#define rtosMQ_t QueueHandle_t1. 创建#define rtosMQCreate( \ handle, \原创 2022-05-30 20:00:00 · 258 阅读 · 0 评论 -
FreeRTOS学习笔记 9 - 邮箱
FreeRTOS没有邮箱,可以用队列实现。邮箱的句柄如下:#define rtosMailbox_t QueueHandle_t1. 创建#define rtosMailboxCreate( \ handle, \ name,原创 2022-05-29 20:00:00 · 1000 阅读 · 0 评论 -
FreeRTOS学习笔记 7 - 信号量
从互斥量的定义可以看出,FreeRTOS的互斥量其实也是走的信号量。而RT Thread中定义的信号量在FreeRTOS中定义为计数信号量,对应的宏定义配置是configUSE_COUNTING_SEMAPHORES信号量句柄定义:#define rtosSem_t SemaphoreHandle_t1. 创建#define rtosSemCreate(原创 2022-05-27 20:00:00 · 249 阅读 · 0 评论 -
FreeRTOS学习笔记 5 - 调度
FreeRTOS操作系统支持三种调度方式:抢占式调度,时间片调度和合作式调度。可以通过configUSE_PREEMPTION和configUSE_TIME_SLICING配置调度算法。1. 基于时间片的抢占式调度当configUSE_PREEMPTION = 1且configUSE_TIME_SLICING=1时是基于时间片的抢占式调度。用之前RT Thread的测试代码验证一下。2个任务代码如下:static void thread1Entry(void *parameter){原创 2022-05-25 19:00:00 · 947 阅读 · 0 评论 -
FreeRTOS学习笔记 6 - 互斥量
FreeRTOS不支持调度方式的设置,所以下面2个宏定义可以随意设置值。#define RTOS_IPC_FLAG_FIFO 0x00#define RTOS_IPC_FLAG_PRIO 0x01互斥量对应的句柄定义:#define rtosMutex_t SemaphoreHandle_t1. 创建原创 2022-05-26 19:00:00 · 357 阅读 · 0 评论 -
FreeRTOS学习笔记 4 - 定时器
定时器的句柄定义:#define RTOS_TIME_HANDLE TimerHandle_t同样支持2种方式的定时器#define RTOS_TIMER_ONE_SHOT pdFALSE#define RTOS_TIMER_PERIODIC pdTRUE1. 创建定时器#define rtosTimerCre原创 2022-05-24 19:00:00 · 296 阅读 · 0 评论 -
FreeRTOS学习笔记 3 - 配置
FreeRTOS的配置文件是FreeRTOSConfig.h。有些宏定义可以不用定义,FreeRTOS会使用默认值,有些宏定义则必须配置好。configUSE_PREEMPTION 设置调度方式。设置1时为抢占式调度,优先级高的任务优先执行;设置0时为合作式调度,通过时间片轮流执行。configUSE_IDLE_HOOK设置是否支持空闲钩子函数。设置1时需要实现钩子函数void vApplicationIdleHook( void ),否则会编译错误。configUSE_TICK_..原创 2022-05-23 19:00:00 · 864 阅读 · 0 评论 -
FreeRTOS学习笔记 2 - 任务
FreeRTOS的任务和RTThread的进程应该是同一个概念。1. 创建任务#define rtosCreateThread( \ handle, /*Thread Handle*/ \ name, /*Thread Name*/ \ entry, /*Thread Entry*/原创 2022-05-22 19:00:00 · 367 阅读 · 0 评论 -
FreeRTOS学习笔记 1 - 准备工作
基于RTT Nano后续学习FreeRTOS,FreeRTOS是国外的能免费商用的RTOS。1. 下载FreeRTOS在FreeRTOS官网下载页面下载,官网地址如下:FreeRTOS - Market leading RTOS (Real Time Operating System) for embedded systems with Internet of Things extensionsMarket-leading MIT licensed open source real-time o原创 2022-05-21 19:00:00 · 377 阅读 · 0 评论 -
MDK中如何给汇编程序添加条件编译
C语言的条件编译众所周知#ifdef XXX#else#endif而MDK中汇编程序的条件编译语法如下: IF :DEF:XXX ELSE ENDIF注意几点:1. IF/ELSE/ENDIF前必须要有空格,否则会报错。2. ‘IF’和‘:’之间必须要有空格。3. ‘:DEF:’这几个之间必须没有空格。4. 汇编程序对应的宏定义设置是在ASM子项卡里面...原创 2022-04-03 13:22:23 · 1177 阅读 · 0 评论 -
RTT Nano学习笔记 11 - 消息队列
消息队列是另一种常用的线程间通讯方式,它能够接收来自线程或中断服务例程中不固定长度的消息, 并把消息缓存在自己的内存空间中。其他线程也能够从消息队列中读取相应的消息,而当消息队列是 空的时候,可以挂起读取线程。当有新的消息到达时,挂起的线程将被唤醒以接收并处理消息。消息 队列是一种异步的通信方式。消息队列可以应用于发送不定长消息的场合,包括线程与线程间的消息交换,以及中断服务例程中 发送给线程的消息(中断服务例程不可能接收消息)。...原创 2022-04-21 20:00:00 · 643 阅读 · 0 评论 -
RTT Nano学习笔记 10 - 邮箱
邮箱用于进程间通信,不同于之前的互斥量,信号量和事件,邮箱具有数据交互功能。RTT的邮箱中每一封邮件只能容纳 固定的4字节内容 (针对32位处理系统,指针的大小即为4个字节,所以一封邮件恰好能够容纳一个指针),并且具备一定的存储功能,能够缓存一定数量的邮件数。1. 创建#define rtosMailboxCreate( \ handle, \原创 2022-04-20 20:00:00 · 691 阅读 · 0 评论 -
RTT Nano学习笔记 9 - 事件
事件也是线程同步的一种方式,与信号量或互斥量不同的是,它可以实现一对多、多对多的线程同步。另外,线程还可以通过多个事件间的逻辑关系来确定是否唤醒,比如需要多个事件都发生才唤醒,或者多个事件中有一个发生就可以唤醒。RTT的事件集合用 32 位无符号整型变量来表示,每一位代表一个事件,线程通过“逻辑与”或“逻辑或”与一个或多个事件建立关联,形成一个事件集。1. 创建#define rtosEventCreate( \ handle原创 2022-04-19 20:00:00 · 231 阅读 · 0 评论 -
RTT Nano学习笔记 8 - 信号量
信号量(Semaphore)的功能有一点与互斥量类似,同样是保护临界资源的一种有用方法。信号量可以但不一定实现互斥(不是说不能,一种情况是不存在共享临界区,谈不上互斥,另一种情况是允许共同进入临界区,比如读操作)。它的运行机制可以理解为:信号量是一个正值,代表资源的可访问数目,当有任务访问时,这个数目减一,任务访问完成时,任务访问结束,释放他,让他加一,信号量为0时,其他任务则不能获取他,选择退出或者等待挂起,直到有信号量释放后,按照优先级来获取信号量,获取后就绪。把资源想象成车位,信号量就是车位管原创 2022-04-18 20:00:00 · 365 阅读 · 0 评论 -
RTT Nano学习笔记 7 - 互斥量
当多进程访问共享资源时,会产生竞争的问题,所以引入互斥量(又称互斥锁)。每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束后解锁。原创 2022-04-17 17:46:44 · 387 阅读 · 0 评论 -
RTT Nano学习笔记 6 - 定时器
这里的定时器指的是软件定时器,功能与硬件定时器一样,它也是创建一个线程,超时函数运行在线程里面,该线程具有线程的属性,优先级,栈大小等,不过没有时间片的概念。1. 创建定时器#define rtosTimerCreate( \ handle, /*Timer Handle*/ \ name, /*Timer Name*/原创 2022-04-17 17:33:55 · 414 阅读 · 0 评论 -
RTT Nano学习笔记 5 - 线程调度
RT-Thread的线程调度算法是基于优先级的全抢占式多线程调度算法,即在系统中除了中断处理函数、调度器上锁部分的代码和禁止中断的代码是不可抢占的之外,系统的其他部分都是可以抢占的,包括线程调度器自身。通过2个进程了解调度static void thread1Entry(void *parameter){ uint32_t count = 0; while (1) { Printf("1:%d\n", count++); delayms(原创 2022-04-17 17:21:16 · 410 阅读 · 0 评论 -
RTT Nano学习笔记 4 - 配置
RT-Thread Nano 的配置在 rtconfig.h 中进行,通过开关宏定义来使能或关闭某些功能。1. RTE_USING_FINSH这个开关是通过defined(__CC_ARM) || defined(__CLANG_ARM)约束的。其中__CC_ARM是MDK编译器,__CLANG_ARM是CLANG编译器。RTE_USING_FINSH是控制RT Thread的控制台功能。先不用使能。2.RT_THREAD_PRIORITY_MAX/* 线程优先级表 */rt_li.原创 2022-04-17 16:20:34 · 735 阅读 · 0 评论 -
RTT Nano学习笔记 3 - 线程
使用RTOS必然会用到线程(有些OS称为任务),而多线程是RTOS的基本功能。将单片机需要完成的工作分割成多个相对独立的功能,每个功能模块在非OS的应用中是串行执行的,而在RTOS中则被定义为线程,在宏观上它们是并行执行的。1. 创建线程创建线程分2种情况:动态创建和静态创建。使用 rt_thread_create() 创建一个动态线程,使用 rt_thread_init() 初始化一个静态线程,动态线程与静态线程的区别是:动态线程是系统自动从动态内存堆上分配栈空间与线程句柄(初始化 heap原创 2022-04-17 16:19:17 · 976 阅读 · 0 评论 -
RTT Nano学习笔记 2 - 移植
1. 修改startup.s无系统的startup.s默认是跳转到main函数,当系统加入 RT-Thread 之后,需要先跳转到RT-Thread 系统启动函数 rtthread_startup()。;/* reset Handler */Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT SystemInit ..原创 2022-04-16 20:36:26 · 712 阅读 · 0 评论 -
RTT Nano学习笔记 1 - 准备工作
RT-Thread Nano 是一个极简版的硬实时内核,适用于入门级 MCU 的场合。软件框图如下图:RT-Thread Nano 实时操作系统遵循 Apache 许可证 2.0 版本,实时操作系统内核及所有开源组件可以免费在商业产品中使用,不需要公布应用程序源码,没有潜在商业风险。平台采用GD32F450的GD32450i-EVAL板子。下载完RTT Nano,解压后目录结构如下:带颜色部分是需要移植的部分,黄色是和MCU相关的部分,绿色是和板子有关的部分。有关文件夹com原创 2022-04-16 20:34:25 · 584 阅读 · 0 评论 -
GD32450i-EVAL学习笔记 19 - USB FS 数据传输
1. SETUP数据包的获取SETUP数据包的获取发生在接收数据FIFO非空中断下图是接收数据FIFO非空中断的处理流程图:在接收SETUP数据包前必须先设置好USBFS_DOEP0LEN中的STPCNT的大小,控制端点每收到一个 SETUP 数据包后, STPCNT的值都会递减。STPCNT的值必须设置为3.而接收数据 FIFO 中需要分配一些额外空间,以便能够在控制端点上接收连续的最多三个 SETUP 数据包。每个SETUP需要8个字节的数据和4个字节的SETUP状态,3个S..原创 2021-12-26 15:58:37 · 2353 阅读 · 11 评论