单片机
文章平均质量分 81
队长-Leader
这个作者很懒,什么都没留下…
展开
-
光隔离探头
光隔离探头的CMRR比高压差分探头要高很多,在一些共模电压较高的测量领域用的比较多,如:开关电源、逆变器等。但是市面上介绍光隔离探头的方案比较少,这里简要说明一下我的个人想法。原创 2024-02-05 18:46:14 · 567 阅读 · 0 评论 -
PS2接口
一、简介。PS2是一种非常古老的接口,随着USB接口的普及,目前已经有很多电脑不支持PS2接口了。PS2接口主要应用在鼠标、键盘。PS2缺点是体积大,不支持热插拔;优点是全键无冲突。(也有部分USB键盘可以做到全键无冲突)PS2母座有双层的,一个键盘、一个鼠标;也有单层的只支持一个键盘或一个鼠标;也有单层的同时支持一个键盘和一个鼠标。所以有的电脑只有一个单层PS2座的话,那么你得用一分二的线,再接到键盘、鼠标。二、PS2协议。PS2协议跟串口协议非常像,也有是起始位、数据位、校验原创 2021-02-21 23:04:19 · 27754 阅读 · 0 评论 -
MSP430FR6989之串口重定向
MSP430FR6989的官方例子是使用sprintf和UART_transmitString来完成printf的功能,有点麻烦,这里改成重定向到printf,并且使用条件编译,#define DEBUG来定义printf的别名为debug,以及启用/禁止printf打印。#include <stdlib.h>#include <stdio.h>#include <driverlib.h>#define DEBUG#ifdef DEBUG #d原创 2020-09-21 23:15:20 · 1090 阅读 · 0 评论 -
搭建ESP32-IDF开发环境
这里介绍WIN10系统下ESP32-IDF v4.1开发环境的搭建。一、下载虚拟机。下载lubuntu和Vmware,还有ESP32-IDF v4.1。二、设置共享文件夹。三、安装python3.8。四、设置pip软件源。五、安装ESP32-IDF。六、编译例子。七、下载Eclipse。...原创 2020-09-02 00:07:11 · 4669 阅读 · 1 评论 -
MSP430FR6989之看门狗
MSP430FR6989的看门狗比较简单,只有一个寄存器可以设置。WDTPW:看门狗密码。每次设置WDTCTL寄存器都要向WDTPW写入0x05A。WDTHOLD:禁用/启用看门狗。WDTSSEL:设置看门狗时钟源。WDTTMSEL:看门狗模式设置。为0进入看门狗模式;为1进入间隔定时器模式。WDTCNTCL:喂狗。WDTIS:看门狗分频系数。再看看板子上的晶振,为32.768KHz,接在LFX低速晶振引脚上。而LFX则是接在ACLK上,所以WDTSSEL正好可以设为原创 2020-08-20 22:24:38 · 814 阅读 · 1 评论 -
基于ADS1298的肌电图仪
在本博客中已经详细介绍了基于ADS1298的心电图仪,这里不再赘述其技术细节,因为都是大同小异的。与心电信号不同,肌电信号的频率高、幅度高,但是肌电不需要威尔逊终端和右腿驱动。8通道的肌电图仪的整体方案如下图所示。其实物,如下图所示。串口连接,左手掌内外翻转的情况下,测量肱二头肌的肌电图。网络连接,左手掌内外翻转的情况下,测量肱二头肌的肌电图。串口连接,左肘不动、手掌前后摆动的情况下,测量肱二头肌的肌电图。网络连接,左肘不动、手掌前后摆动的情况下,测量肱二头肌的肌原创 2020-05-31 14:50:40 · 3552 阅读 · 4 评论 -
STM32G071不起振
STM32G071可以烧录代码,但是外部晶振不起振,用内部RC振荡也不能正常工作。解决办法:烧录bootloader到0x08000000地址,再烧录APP代码到0x08005000地址。STM32G071不需要接BOOT0下拉,因为BOOT0和SWCLK共用一个引脚。...原创 2020-04-13 10:28:53 · 1296 阅读 · 1 评论 -
曲线拟合在单片机中的应用
在单片机开发中,可能会用热敏电阻来测量温度:如PT100、MF58等。但是直接测量热敏电阻就有阻值,测阻值有很多方法,如:恒流源、电桥等。那么测出来的阻值,该如何对应出温度?有两种方法:查表法、曲线拟合。查表法适用于实时性要求高,单片机容量大的场合(FPGA也常常使用查表法)。曲线拟合适用于实时性要求低,单片机容量小的场合。本文以热敏电阻MF58为例,介绍如何使用曲线拟合来...原创 2020-04-09 12:00:28 · 4192 阅读 · 0 评论 -
TouchGFX简介
一、简介。在单片机上实现图形界面,最简单的方法是使用串口屏,但是在体积有限的手持机应用中,串口屏显得有点笨重了,而且板子往往不能适应需求,订做串口屏成本又太高。这就需要使用GUI框架来完成图形界面。在单片机领域的GUI框架有:ucgui(STemWin/emwin)、TouchGFX、GuiLite等。emwin提供的更多是一些较底层的函数(如:画线、画圆),而且不能拖控件,做出来的界...原创 2020-04-06 14:52:39 · 21984 阅读 · 3 评论 -
单片机量产软件
单片机批量生产时可能会遇到以下问题:1、每块板子都需要使用UUID,但是单片机不支持UUID。2、单片机可以通过串口指令读取厂家信息,如:版本号、批次、生产日期等,如何方便修改这些打印信息?3、烧录和测试如何一键完成?4、如何跟踪板子信息,方便统计产量、对接客户信息?所以,本文介绍如何设计单片机量产软件来解决这些问题。该量产软件需要实现以下功能:1、UUID、厂家信息需...原创 2020-04-05 00:20:54 · 1344 阅读 · 0 评论 -
LPC55S69之外部中断
外部中断用官方的例子就可以了。一、引脚。点击二、代码。#include "fsl_debug_console.h"#include "board.h"#include "fsl_pint.h"#include "fsl_common.h"#include "pin_mux.h"#include "fsl_inputmux.h"void pint_intr...原创 2020-01-03 15:42:19 · 714 阅读 · 0 评论 -
LPC55S69之时钟滴嗒
LPC55S69的时钟滴嗒要和睡眠模式一起使用,不能单独作为一个定时器来使用,否则不能进入中断。也就是不能进入utick_callback_t cb。void UTICK_SetTick(UTICK_Type *base, utick_mode_t mode, uint32_t count, utick_callback_t cb)一、引脚。随便设置一个输出的引脚。...原创 2020-01-03 15:21:28 · 661 阅读 · 0 评论 -
LPC55S69之输入捕获
官方没有提供输入捕获的例子,这里介绍使用CTimer做为输入捕获。一、引脚。二、代码。#include "fsl_debug_console.h"#include "board.h"#include "fsl_ctimer.h"#include "pin_mux.h"#include <stdbool.h>#define CTIMER CTIMER2 ...原创 2020-01-03 10:30:03 · 869 阅读 · 0 评论 -
LPC55S69之串口
串口用例子就可以了。一、引脚。二、代码。#include "board.h"#include "fsl_usart.h"#include "pin_mux.h"#include <stdbool.h>#define DEMO_USART USART0#define DEMO_USART_CLK_SRC kCLOCK_Flexcomm0#define DE...原创 2020-01-02 14:41:09 · 1463 阅读 · 0 评论 -
LPC55S69之定时器
使用CTimer来产生100ms和1s标志位,用于在主循环中使用。一、引脚。GPIO中二、代码。#include "fsl_debug_console.h"#include "board.h"#include "fsl_ctimer.h"#include "pin_mux.h"#include <stdbool.h>#define CTIMER C...原创 2020-01-02 14:05:57 · 1100 阅读 · 1 评论 -
LPC55S69之PWM
LPC55S69可以使用SC timer(SCT)或者ctimer来产生PWM,官方提供的ctimer例子比较好用,占空比和频率均可调。但是,LPC55S69的SCT配置PWM在手册上没写清楚的,这里提供个例子,PWM的频率可在10Hz~1kHz之间可调,步进10Hz;占空比在1%~100%之间可调。一、引脚。二、外设。三、代码。#include "fsl_d...原创 2020-01-02 11:11:26 · 1349 阅读 · 0 评论 -
LPC55S69之GPIO
LPC55S69的GPIO还是很容易的。一、引脚。这里标识符需要自己根据需求来填的,GPIO初始状态的Logical 1为初始高电平。按键的引脚,如下图配置。更新代码。在pin_mux.c中会更新已添加的GPIO的初始化代码。二、代码。修改工程目录下的Source代码,不同的工程名文件名也不同。#include "fsl_debug_con...原创 2019-12-31 13:58:30 · 1190 阅读 · 0 评论 -
LPC55S69之ADC
NXP提供的LPC55S69资料不是十分的完善,给的例子是单通道ADC,运行没问题,但是多通道ADC采样就有点问题了。多通道ADC需要按照以下配置方式。一、引脚。二、外设。添加ADC外设。通用配置。命令1。命令2。命令3。触发0。触发1。触发2。触发3。中断配置默认即可。说明。一个命令对应一个触...原创 2019-12-31 13:23:19 · 2203 阅读 · 11 评论 -
LPC55S69开发笔记
一、简介。LPC55S69是一款ARM Cortex M33内核,带TrustZone功能的单片机。TrustZone,可以把一部分代码放入安全区域,如:加密算法、指纹识别等。在安全区域中的代码,不能直接被非安全区域的代码读取内容。比如使用指针,直接指向安全区域的内存地址,是无法读出其内容的。这样,可以防止一些恶意软件攻击单片机。如下图所示,通过高位来区分安全区域(Secure)和...原创 2019-11-05 18:30:37 · 5024 阅读 · 3 评论 -
搭建STM8S001开发环境
1、IAR。由于keil不支持STM8,所以改用IAR。IAR For STM8 3.10或以上版本才支持STM8S001,可以直接在官网免费下载,如下图所示。破解工具用IAR Offline License Generator v1.4 by unis。如下图所示。注意:v1.3是无法破解IAR For STM8 3.10及以上版本。v1.4的破解工具可以在CSDN上找到...原创 2019-10-14 18:01:01 · 3407 阅读 · 1 评论 -
PH计之斜率补偿
PH计一般不带温度补偿,而温度对强酸、强碱的pH值影响比较大,对偏中性的溶液影响不大。这里的温度补偿有两种含义:补偿溶液、补偿斜率。一、补偿溶液。由于水的电离受温度影响,所以不同的溶液的pH值受温度影响的程度不同,需要查表才能补偿。二、补偿斜率。1、理论斜率。这里的斜率是由能斯特方程得到的(方程的具体推导过程请参考《电化学》)。上式中,t为摄氏度。R是理...原创 2019-05-10 17:18:59 · 11168 阅读 · 8 评论 -
查看Keil编译代码大小
在Keil中编译代码,超出单片机的存储容量,会弹出以下错误。Error: L6406E: No space in execution regions with .ANY selector matching xxx.o.那么,如何得知编译出来的代码,占用了多大的空间?在Keil中按Rebuild(不是Build)。没有错误的话,会得到下图所示。在工程目录下,打开Listi...原创 2019-06-18 16:59:34 · 15255 阅读 · 4 评论 -
ESP32应用指南
一、简介。想当年,安信可公司推出一款低成本的WIFI模块(基于乐鑫公司的ESP8266芯片)之后,火了一段时间。这个模块是支持AT指令和SDK两种开发方式。AT指令很简单,用串口发送几条指令,即可让模块进入串口透传模式,用户基本不用涉及复杂的TCP/IP协议。SDK开发,相当于固件库开发,官方提供丰富的例子,有带操作系统和不带操作系统等等,代码可读性好,上手难度并不高。由于ESP8...原创 2019-09-04 16:12:44 · 67870 阅读 · 1 评论 -
C51代码风格
有的时候自己写的代码,过了一段时间就忘了,再回头一看,发现自己也看不懂了。因此,不光要写好说明文档,还要养成良好的代码风格。良好的代码风格,有助于提高代码的可读性、可维护性,不仅方便自己阅读、使用,更是方便与同事之间的交流、沟通。1、不使用拼音命名。这是最常见的误区之一,如下图所示,用拼音定义了时、分、秒三个变量。但是拼音的重码率太多,很容易让人摸不着头脑。建议使用英文...原创 2019-09-28 09:14:57 · 1283 阅读 · 1 评论 -
ESP32使用SD卡注意事项
有两种方法可以使用:上拉电阻为47K和上拉电阻为10K。 上拉电阻为47K。按照ESP32-CAM开发板的接法。 上拉电阻为10K。一、原理图。ESP32S模块中有引出SDIO的接口,就是SD2、SD3、CM...原创 2019-10-09 13:51:14 · 20857 阅读 · 0 评论 -
CoOS使用教程——中断、裁剪、移植
1、中断。在CoOS下,只使用了M3内核的时钟滴嗒和PendPV,两个中断。这说明了,其它中断可以跟裸机开发一样使用,只要中断服务函数不出问题,就不影响内核调度。注意:在中断服务函数中,不能使用CoPostSem()等函数,而使用isr_PostSem()。此外,这些内核函数(如:isr_PostSem()、isr_PostMail()、isr_PostQueueMail()、原创 2015-12-22 23:20:54 · 1939 阅读 · 1 评论 -
MAX262程控滤波器
一、简介。MAX262内部有两个独立的程控滤波器,均可设置低通、高通、带通、带阻、全通,中心频率和Q值可调。中心频率有64个档位可调,Q值有128个档位可调。中心频率f0由采样频率FCLK和FN决定,最大不超过140KHz。Q值由QN决定。二、工作方式、FN、QN的配置。设置MAX262的寄存器,由下图所示。特别要注意最底下的Note,Q0A~Q6A均为0时,MAX......原创 2019-04-12 14:46:34 · 14738 阅读 · 1 评论 -
胎压监测TPMS
胎压监测由两部分组成:传感器、显示器。显示器并不难做,难的是传感器。传感器的温度范围在-40~90摄氏度,一般的电池可达不到。CR系列电池的温度范围比较宽,特种的CR2450温度范围在-40~80度,标称容量210mAh~600mAh。1 bar(巴) = 100kPa(千帕)。如此低的电池容量,还要能用5年以上,这就要求传感器必须是低功耗的。NXP有集成的解决方案,胎...原创 2019-04-01 11:04:46 · 3482 阅读 · 0 评论 -
在COIDE下使用uCOS-II的一些问题
目前网上已经移植好的基于STM32平台的uCOS-II系统,都是基于MDK编译器的,直接拿到COIDE上面,是不能使用的。关键的地方,有两处。1、多重包含。uCOS_II.C文件中,使用#include包含了多个.c文件,这在MDK下是没有问题的,但是在COIDE却不行,把这些include语句都注释掉就可以了。2、汇编格式不同。os_cpu_a.asm文件使用的是原创 2015-10-19 22:23:16 · 1226 阅读 · 0 评论 -
CoOS使用教程——消息队列
因为消息邮箱不能存放超过一条消息,所以才弄了个消息队列,这样,不需要使用互斥量了。消息队列可以存放多条消息。具体效果跟使用互斥量的消息邮箱是一样的,如下图所示:1、CoCreateQueue(),创建一个消息队列OS_EventID CoCreateQueue(void **qStart, U16 size ,U8 sortType);qStart原创 2015-12-22 18:58:15 · 1059 阅读 · 0 评论 -
CoOS使用教程——软件定时器
CoOS下可以使用软件定时器,不过跟我们使用STM32下的时钟滴嗒不同,它可以通过函数指针来使用回调函数,可以降低代码的耦合度。具体效果如下图所示,而printf下的转义字符\n不起作用,极有可能是软件定时器的bug。1、CoCreateTmr(),创建软件定时器。OS_TCID CoCreateTmr(U8 tmrType, U32 tmrCnt, U原创 2015-12-22 20:44:02 · 1965 阅读 · 0 评论 -
CoOS使用教程——消息邮箱
消息邮箱是一种任务间通信的机制,用起来跟QQ、163的邮箱差不多。但是CoOS下的消息邮箱只能存放一条消息,所以我这里用了互斥量,以免出错。最终效果如下图所示:1、CoCreateMbox(),创建一个消息邮箱。OS_EventID CoCreateMbox(U8 sortType);sortType是在多任务中,使用多个消息邮箱时候,内核需要对原创 2015-12-22 18:36:06 · 1414 阅读 · 0 评论 -
CoOS使用教程——信号量
可能你还对信号量这个名词感到些陌生,其实你在Windows下经常使用信号量,比如:Esc键就发出一个信号,它可以通知某个进程去关闭当前的窗口。那么,你也可以让按键(或其它东西)发出一个信号,使单片机去做某些事情。在CoOS下使用信号量也是非常简单的。具体步骤:创建信号量->发出信号量->处理信号量。1、信号量是怎样实现的?是使用PV操作。在任务A中使原创 2015-12-22 15:07:15 · 1290 阅读 · 0 评论 -
CoOS使用教程——事件标志
CoOS提供了一个事件标志的机制,用起来跟信号量差不多。1、CoCreateFlag(),创建一个事件标志OS_FlagID CoCreateFlag (BOOL bAutoReset,BOOL bInitialState);bAutoReset,为0表示手动复位,为1表示自动复位。bInitialState,为0表示初始状态是未就绪的,为1表示已就绪。原创 2015-12-22 17:40:12 · 1779 阅读 · 1 评论 -
CoOS使用教程——互斥量
在介绍互斥量之前,先说说什么是临界资源。最经典的临界资源就是打印机,在你同时让打印机打印两分文档的时候,会弹出一个窗口,上面列出打印队列。这就是说,打印机只有一个,它无法同时打印两个文档,只能排队,一个个地打。如果同时打印的话,会出错,这不是用户想要的结果。同样的,在单片机里面,串口1,也是个临界资源,为了不让它出错,必须使用互斥量。所谓互斥,就是互相排斥,任务A在使用串口1的原创 2015-12-22 16:43:52 · 1064 阅读 · 0 评论 -
CoOS使用教程——任务的状态
CoOS中,任务有四种状态,分别是:就绪态、运行态、等待态、休眠态。为什么要分不同的状态?目的就为了把CPU让给更有需要的任务,比如,你打开一个浏览器,又打开一个游戏(需要全屏),这样在你玩游戏的时候,就让浏览器这个任务挂起,以进入等待状态。然后整个CPU都在为游戏服务,而不会出现卡顿现象。同样的原理,也能运用在单片机当中。1、CoGetCurTaskID(),原创 2015-12-22 15:50:20 · 1294 阅读 · 0 评论 -
COIDE下重定向printf
在STM32下,可能需要重定向printf到串口,而COIDE下提供了重定向printf的组件,使用起来是相当方便的。先add这个组件,然后在printf.c下稍加修改即可使用了。如果在COIDE上无法修改printf.c的话,可以使用其它编辑器,如:sublime。先添加串口的头文件。然后,修改PrintChar函数,让它使用串口发送数据。此外原创 2015-12-21 18:59:41 · 1499 阅读 · 0 评论 -
COIDE2.0.2无法新建工程的解决方法
COIDE更新后的2.0.2版本无法新建工程,笔者尝试使用旧版本新建工程,再在2.0.2中使用,但是效果不佳。直接在Welcome页面下新建工程,是没有任何反应的。以下是间接新建工程的方法。首先,要有一个完好的工程,或者是别人建好的,或者是以前建好的,然后,在COIDE 2.0.2中打开。这时,可以正常打开Repository。点Manufacturer原创 2015-10-10 23:49:51 · 1193 阅读 · 0 评论 -
使用脚本语言生成芯片寄存器列表的头文件
脚本,跟C语言一样,是一种编程语言,但是,脚本语言抽象层次更高,用脚本可以轻松处理文本、管理系统(如linux下的shell)。而我们在做单片机开发的时候,经常跟不同的外设打交道,而某些外设有寄存器列表,如果我们手工地把这些寄存器列表弄成头文件,将是一件非常累的体力活。这时,脚本语言正是为此而生啊,使用它可以非常方便地生成芯片寄存器列表的头文件。下面以TCL/TK为例,处理ADE7878芯原创 2015-04-22 22:26:37 · 2722 阅读 · 0 评论 -
什么是硬件以及什么是软件
软件跟硬件之间的界限已经越来越模糊了,那么处于这个灰色地带的,就是固件了。这就分成三类工作者。1、软件工程师一般指做图形界面的程序员,工作内容就是写C++、JAVA、Web等。2、硬件工程师当然是指玩电路板的,工作内容就是画原理图、PCB等。3、固件工程师也叫单片机工程师,既写代码(主要是C语言、汇编)又要画电路图。玩单片机的人,可能会有个疑问,为什么我写的C语言能操作到底层的硬件原创 2015-07-02 20:04:11 · 25302 阅读 · 1 评论