- 博客(60)
- 收藏
- 关注
原创 FlexibleButton驱动移植
概述在实际项目中,经常需要用到独立按键来作为人机交互的工具。为了避免重复造轮子,这里简单介绍一个使用组件FlexibleButton的移植,它支持单击、双击、长按等常用事件。正文废话不多说,直接开盘。第一步:获取源码链接第二步:准备好工程,并把源文件加入工程。第三步:注册按键参考代码如下:static flex_button_t user_button[1];static void flex_key_init(void){ GPIO_InitTypeDef GPIO_InitStr
2022-04-07 21:48:53 933 2
原创 FIR有限冲击响应滤波器
概述本文分享使用FIR滤波器设计低通滤波器,分享如何使用matlab和arm_dsp库设计滤波器。正文matlab设计滤波器系数matlab输入fdatool调出滤波器设计工具输入滤波器各项参数,如下:点击Targets->Generate C header,并选择对应的数据类型即可导出文件。ARM DSP库FIR滤波器API这里提供自己整理的驱动文件作为参考,滤波效果还算可以。#include "fir.h"/*************************
2022-03-21 15:30:35 903
原创 IIR无限冲击响应滤波器
概述实际项目中,常常需要从叠加频率的信号中获取特定频带的数据,这时候就需要使用到低通、高通、带通或陷波器来进行数字信号处理。而IIR滤波器具有结构简单、运算量小等特点,非常适用于嵌入式系统的数字信号前端处理。所以,这里分享如何使用arm_dsp库和matlab设计简单的2阶IIR直接I型滤波器。正文matlab设计滤波器系数矩阵matlab输入fdatool调出滤波器设计工具。输入要设计的滤波器类型及各项参数,如下。点击Edit->Convert Structure,选择是 Direc
2022-03-20 16:52:45 1453
原创 FAL移植
概述FAL (Flash Abstraction Layer) Flash 抽象层,是对 Flash 及基于 Flash 的分区进行管理、操作的抽象层,对上层统一了 Flash 及 分区操作的 API (框架图如下所示),并具有以下特性:支持静态可配置的分区表,并可关联多个 Flash 设备;分区表支持 自动装载 。避免在多固件项目,分区表被多次定义的问题;代码精简,对操作系统 无依赖 ,可运行于裸机平台,比如对资源有一定要求的 Bootloader;统一的操作接口。保证了文件系统、OTA、NV
2022-03-18 14:30:03 1226
原创 SFUD移植
概述SFUD (串行Flash通用驱动库)是一款开源的串行 SPI Flash 通用驱动库,支持市面上多数的串行flash芯片。本文主要介绍如何移植SFUD到项目工程中使用。正文第一步:下载源文件链接第二步:工程准备好一个项目工程。第三步:将源文件添加进工程,并包含好头文件路径第四步:修改工程文件修改sfud_port.c文件。/* * This file is part of the Serial Flash Universal Driver Library. * * Cop
2022-03-16 14:14:32 1809
原创 ESP32 GPIO实验
概述本文简要分析esp32 gpio例程。正文项目文件结构:main文件夹:存放工程的资源文件CMakeLists.txt:这里定义了cmake环境Makefile:工程makefile,这里可以修改项目名称main文件夹结构:CMakeLists.txt:这里是工程src、inc文件的定义,多个src文件的工程需要在这里进行包含component.mk:组件makefile文件,不常用,一般不作更改。gpio_example_main.c:项目源文件gpio_exampl
2021-11-28 14:48:04 3384
原创 FinSH组件用法
概述本文简单介绍rtthread的FinSH控制台组件的用法,在实际项目中,该组件对调试非常方便。正文首先,先按上篇搭建好工程。这里,我以正点原子战舰板工程来实验。FinSH组件的文件结构如下:shell.c、msh.c这两个文件实际项目中基本不用更改,所以我们在cmd.c中增加我们需要的命令即可。不带参数的命令带参数的命令总结到这里,就简单了解了FinSH组件的用法。...
2021-11-28 12:49:27 1729
原创 使用ENV工具搭建工程
概述ENV工具是RTT提供的构建工程、管理组件以及裁剪工程的工具,对于开发工程非常方便,接下来我们简单了解如何使用ENV工具进行项目开发。正文ENV工具下载链接:下载RTT标准版源码下载链接:下载配置ENV环境:1.安装python2.安装git3.在env目录下点击env.exe,右键进入settings,然后在Intergration --> Register --> Save settings搭建工程第一步:进入rtt标准版源码目录,进入bsp目录,选择匹配的板机
2021-11-27 11:14:56 1697
原创 EasyFlash移植
概述easyflash是开源的轻量级嵌入式flash存储器库,非常适合小型项目开发使用。正文废话不多说,直接开始盘它。第一步:下载源文件链接第二步:工程准备好一个工程。第三步:将源文件添加进工程,并包含好头文件路径第四步:修改工程文件修改ef_port.c文件。主要修改:ef_port_read、ef_port_erase、ef_port_write函数,这里函数实现对flash的读写操作,需要自行实现。注意:其他功能函数,如log打印、加锁和解锁操作也需要自行实现。ef_
2021-11-20 18:18:39 1913
原创 Source Insight工程拷贝到其他目录下,路径不匹配问题。
概述当我们把一个包含source insight工程的文件夹拷贝到其他路径下,会出现用source insight修改工程文件后,工程文件事件未被修改的情况,反而源目录下的工程文件被修改了。这是由于拷贝后的source insight工程路径未更新导致。正文解决办法就是更新一下拷贝后的工程即可。点击Project --> Synchronize Files更新。结论每次我们拷贝工程到其他目录下,都需要进行上述操作,确保si工程路径匹配。...
2021-11-20 15:54:19 1350
原创 ESP32 Windows开发环境搭建
概述本文介绍如何在windows环境下,快速搭建ESP32开发环境,为各位提供参考。正文下载地址ESP-IDF下载地址注意:需要先在电脑上安装好Python环境。启动ESP-IDF安装ESP-IDF,记住安装路径安装完成,我们可以看到有eclips、poowershell、command prompt三种运行环境选择,自己选择合适的即可。如果电脑上存在多个ESP-IDF(不同版本的esp-idf),后续开发需要命令行切换至对应工作路径进行编译开发。到此,esp开发环境搭建完成
2021-10-17 09:37:28 3261
原创 STM32F103系统时钟设置
概述实际使用STM32F103单片机时,第一步就是配置系统的工作时钟。我们失常需要选择使用外部时钟源和内部时钟源,这里我们以F103为例子,提供两个函数参考,供大家实际开发中使用配置系统时钟。实例废话不多说,直接上代码。#include "dri_sysclk.h"static void SetSystemClk(eSelectClkSrc _ClkSrc);T_SysClk_Device g_tSysClk_Dev = { .SysClkConfig = SetSystemClk};
2021-10-09 22:42:30 2636 2
原创 移植RTThread-nano内核
概述本文基于MDK移植RTThread-nano内核到F103工程。步骤一、nano源码下载点击Nano源码下载。二、移植在F103工程文件夹内,新建rtthread文件夹,然后从Nano源码文件夹内添加以下文件。include文件夹、libcpu文件夹、src文件夹bsp文件夹下的rtconfig.h、board.c打开MDK工程,在工程添加以下文件。rtthread/src文件夹下所有文件rtthread/libcpu文件下对应文件rtthread文件夹下board.c、rt
2021-10-09 22:42:12 607
原创 命名规范与注释规范概述
概述本文根据自己的日常代码书写习惯,整理一下关于C语言编码过程中的命名规范和注释规范。每个人有自己的编程习惯,本文仅供参考,不作为标准。正文由于本人学习安富莱的教材,感觉其编码规范做得很好,所以我们参考安富莱的命名规范来学习。1、文件与目录文件命名文件的命名需要准确清晰,适当使用字母缩写,使得名字精简。如:App.c、Uart.c等。头文件中段落安排顺序1、文件头注释2、防止重复引用头文件的设置3、#include部分4、enum常量声明5、类型声明和定义,包括struct、uni
2021-10-09 22:40:35 639 1
原创 emWin学习(2)————滑动列表控件SWIPELIST
前言安卓系统上,QQ和微信的信息浏览都是可以通过上下滑动来快速浏览通知信息的,那emWin可以实现这样的效果吗?答案是肯定的。emWin5.32以上的版本就新增了滑动列表控件用来实现这样的效果。本文使用emWin5.44版本,简单演示滑动列表控件SWIPELIST的使用。概述滑动列表控件的使用与其他控件的使用类似,不同点需要我们认真阅读使用手册并且多加使用摸索。滑动列表控件的一个项目的结构如下所示:控件是可以发送通知WM_NOTIFY_PARENT消息到其父窗口的,但是对键盘信息无反应,
2020-11-15 11:59:58 2514
原创 emwin应用(1)————自定义波形显示
前言在使用emwin开发项目中,因为自带的图形控件达不到项目所要呈现的效果,所以需要使用自定义绘图的方式去实现想要的效果。比如,在开发医用监护仪的项目时,由于emwin自带的控件绘制的曲线是整区域绘制,且波形刷新属于平移运动,与实际医用监护仪方式不一样,所以就不能使用自带的控件。因此,在此以医用监护仪的通用波形显示作为例子,探讨emwin实现自定义波形显示和维护的实现方式。概述本文项目使用STM32F429系列芯片作为主控芯片,emwin移植的是emwin5.44版本,使用SDRAM作为emwi
2020-11-08 18:09:47 2624 9
原创 emWin学习(1)————窗口控件Window和框架窗口控件FrameWin
前言平时开发项目,常常需要自己进行界面设计,简单的项目可以自己使用简单的绘画功能即可,但继续复杂界面的设计时就需要使用到嵌入式GUI。而emWin就是一款主流的嵌入式GUI,接下来我们学习使用emWin开发项目。概述emWin的移植过程以及底层驱动的优化可以参考网上教程,我们直接学习使用emWin开发。本次先学习Window控件和FrameWin控件的使用。首先,我们先了解一些基本概念:什么是对话框? 答:简单来说,emWin的对话框是以Window和FrameWin为载体的一个交互
2020-08-18 20:25:38 3572
原创 数组实现简单的栈操作
前言单片机开发过程中,常常会用到栈操作,例如多级菜单的页面跳转,这里分享一个自己C语言写的非常简单的栈操作文件供各位参考。源代码#include "bsp_user_stk.h"uint8_t stack[STACK_SIZE];__IO static int top_element = -1; //指向栈顶元素的指针void push(uint8_t val){ if(is_full() == 0){ top_element++; stack[top_element]
2020-07-29 21:47:04 266
原创 uCOSIII移植补充
前言上篇写到uCOSIII的移植,由于移植的是教程写好的文件到开发板,没发现到一些问题。今天移植到另一个开发板的时候出现系统卡死在OSStartHighRdy()函数的问题。现在就再次分析一下移植过程。实验分析(一)现象分析我们将RCT6开发板上的uCOSIII移植到C8T6的板子上时,会发现系统一直没有启动,LED没用闪烁。通过单步调试,我们可以发现系统卡在OSStartHighRdy()函数里。通过分析,猜测是SysTick_Handler没有启动,导致任务优先级切换失败。(
2020-07-12 23:05:08 741 1
原创 uCOSIII移植
前言闲来无事,想起之前的朋友问到uCOS的移植过程,居然忘记了。平时使用过程中都是将以前写好的Demo工程一复制就完事了,毕竟避免重复造轮子嘛。现在就再复习一下啰。实验分析(一)准备工作(1)了解uCOSIII。uCOS作为经典的RTOS,优缺点网上文章讲述了,这里就不说了。(2)准备uCOSIII源码。uCOS源码可以在Micrium官网下载,我这里就用一直用开的3.03版本。(二)源码分析(1)EvalBoards文件夹这里其实就是官方工程的工程文件,我们只需要里面红框标
2020-07-01 22:41:49 1215
原创 IAR for ARM新建STM32工程
前言最近由于工作原因,项目工程会包含一些C++文件,这就导致MDK对项目工程的编译支持不够好,所以需要使用IAR和Source Insight结合的开发方式开发STM32项目。这里我尝试使用IAR for ARM8.40搭建STM32工程。实验分析(一)IAR的下载及安装由于网上已经有很多关于IAR的安装及破解方法,这里就不作过多讲诉。破解完成的结果将如下图所示:(二)新建工程...
2020-06-28 21:21:32 2214 4
原创 简单分析sizeof和strlen的区别
前言C语言中有sizeof和strlen两个函数,这两个函数都可以用来求字符数组的长度,但它们又有所区别,这里对它们的用法进行区分。分析C语言中字符串默认末尾加'\0'作为结尾; sizeof函数计算的是分配空间的实际字节数(包含'\0'),strlen计算的是字符串的字符个数(不包含'\0'); sizeof是运算符,可以以数据类型、函数做为参数。strlen是函数,只能以字符串指针做参数; sizeof是在编译时计算数据类型占空间的大小。strlen则是运行代码时计算结果,传入函数的数
2020-05-11 21:51:01 412
原创 NRF24L01实现多对一通信
前言NRF24L01是一个常用的2.4G无线通信模块,经常在项目开发中会用到。用NRF24L01做一对一通信就比较多,但是一对多通信却比较少。我们都知道NRF24L01在接收模式下可以接收6个不同通道的数据。每个数据通道使用不同的地址,但是共用相同的频道。也就是说6个不同的NRF24L01设置为发送模式后可以与同一个设置为接收模式的NRF24L01进行通信,而设置为接收模式的NRF24L01可...
2020-04-16 22:08:15 3201 2
原创 NRF51822蓝牙服务(9)——动态修改设备的名称
前言很多时候我们希望能够通过手机动态修改设备的MAC地址、配对密码或者蓝牙设备信息等,其实原理上都是可以实现的。大概思路其实就是把我们需要修改的内容发送到FLASH中保存,然后再用FLASH中的内容替代原先的内容。最后重启服务就行了。这里我们通过修改设备的名称来验证一下。实验分析官方的协议栈实现中默认都会提供Generic Access(GAP)服务(UUID:0x1800)和Gene...
2019-12-19 21:16:07 2398
原创 NRF51822蓝牙服务(8)——动态密码配对
前言上篇我们学习了使用静态密码的方式在连接时进行密钥的验证,那么我要使用动态密码,进一步提高安全性呢?这里我们就在上篇代码的基础上尝试使用动态密码的方式完成蓝牙配对。实验分析由于,静态密码的时候已经把基本步骤详细讲述,这里就不再过多讲述。由于开发板没有显示屏,所以这里采用串口打印的方式获取动态密码。static void gap_params_init(void){ ...
2019-12-18 19:34:19 1266 1
原创 NRF51822蓝牙服务(7)——静态密码配对
前言有时候我们希望能够在连接的时候进行密钥的验证,以保障连接的安全。为了保证低功耗蓝牙的绝大多数安全特征,必须完成两个事情。首先是设备必须互相配对;其次,设备必须分配用于加密、保障隐私并对消息进行验证的密钥。这里我们尝试使用静态密码的方式完成蓝牙配对。实验分析这里,我们仍然使用前面的串口实验例程。配对连接过程:手机连接上之后立刻调用安全请求API(sd_ble_gap_aut...
2019-12-16 21:03:08 2174 4
转载 手把手,嘴对嘴,讲解UCOSII嵌入式操作系统的任务调度策略(五)
继续......整个UCOSII嵌入式操作系统的任务调度策略便是如此,现在进行一个总结:某个任务在执行中,每隔一定周期发生滴答时钟中断,在中断中遍历整个任务链表,更新每个任务的延时时间,修改就绪状态。 任务执行完毕后,进入延时函数,在延时函数中会把当前任务挂起(清空当前任务的就绪状态,使其进入未就绪状态),然后根据查表发找到在就绪任务中,优先级最高的那一个任务。 找到新任务以后,人工强...
2019-12-16 14:00:46 487
转载 手把手,嘴对嘴,讲解UCOSII嵌入式操作系统的任务调度策略(四)
继续......再回到那个重要得函数:void OS_Sched (void){#if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */ OS_CPU_SR cpu_sr = 0u;#endif OS_ENT...
2019-12-16 13:47:17 606
转载 手把手,嘴对嘴,讲解UCOSII嵌入式操作系统的任务调度策略(三)
继续......if (ticks > 0u) { /* 0 means no delay! */ OS_ENTER_CRITICAL(); y = OSTCBCur->OSTCBY; /* ...
2019-12-12 20:36:13 363 2
转载 手把手,嘴对嘴,讲解UCOSII嵌入式操作系统的任务调度策略(二)
继续......if (ticks > 0u) { /* 延时参数是否为0 */ OS_ENTER_CRITICAL(); /* 禁止中断 */ y = OSTCBCur->OSTCBY; OSRdyTbl[y] &= (OS...
2019-12-12 20:20:58 407
转载 手把手,嘴对嘴,讲解UCOSII嵌入式操作系统的任务调度策略(一)
前言所谓操作系统,便是隔绝硬件层与应用层的平台,让工程师可以最大限度的忽视硬件,直接进行逻辑开发,它最大的特点,便是可以让多任务并发执行,但并非是同时执行,形象点来说,假如我有4个任务(LED点灯,喇叭鸣叫,串口通信,数据计算),让每个任务都执行几十个毫秒,虽然实际上在任何一个时间点,都有且只有一个任务的一条代码在执行,但是从宏观上看来,这4个任务几乎是同时执行的,这4个任务的调度,就是切换是...
2019-12-12 15:30:16 614
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人