单片机系统
文章平均质量分 51
ARM STM32 51
Quan略略略
君子爱色取之有道
展开
-
【嵌入式】如何使用JLINK RTT打印log日志
没有串口的情况下可以使用JLINK的RTT即 Real Time Transfer功能。RTT的工作原理大致就是在内存里面创建一个RTT控制块RTT Control Block,即SEGGER_RTT_CB结构体。这个结构体里面存放了若干个上行通道和下行通道,每个通道都有一个数据buffer以及读写指针,构成了数据队列。向RTT控制块里面的任意一个上传通道写入log信息,然后JLINK能够通过读取RAM内容,获取到数据buffer和读写指针的内容。在JLINK的安装目录里面有RTT的代码:可以直原创 2022-05-28 11:12:24 · 3585 阅读 · 5 评论 -
【单片机】An Introduction to the Digital Multiplex Protocol
https://www.electroschematics.com/an-introduction-to-the-digital-multiplex-protocol/The Digital Multiplex (DMX) protocol is everywhere in lighting, so if you’re fiddling with lighting, it’s not going to be long before you start to have questions about th转载 2020-12-11 16:54:18 · 317 阅读 · 0 评论 -
【单片机】RGB和RGBW LED灯珠的区别
1、RGB三基色1:1:1混合原理上能得到纯白色。2、相同电流下,RGB三个发光二极管的发光亮度是不同的,例如WS2812灯珠的RGB灯泡参数:三基色的发光强度范围是不同的,尽管额定工作电流都是20mA。所以为了能将RGB的发光强度映射到0x00~0xFF上去,需要每个颜色对应不同的驱动电流,但是总会有误差,而且电流和发光强度的对应关系也不一定是线性的。所以就会发现纯白光的情况下WS2812的灯泡并不是完美的白色。3、SK6812这种灯珠有RGBW型号,其中W就是White,是将颜色中的白色原创 2020-12-14 15:04:22 · 8827 阅读 · 2 评论 -
51单片机为什么无法下载程序?
检查单片机型号是否正确。注意这个软件上设置的单片机型号必须与芯片上标注的型号完全相同,如果你使用的是STC89C52RC而设置的是STC89C52没有RC,也会出现无法下载程序的情况。检查串口TX和RX两根数据线是否插反。检查单片机是否已经正确安装晶振。开发板上晶振通常是可拆卸的,看看晶振有没有插好。以上都正常,请尝试将波特率降至最低。转载 2017-04-03 10:50:39 · 7430 阅读 · 0 评论 -
【单片机】STM32f030 硬件 I2C 的使用(避坑)
test原创 2020-05-08 13:11:23 · 2930 阅读 · 2 评论 -
【单片机】SI4432 Based Networking 2
SI4432芯片的内部状态机以及各个状态下的:编写一个简单地碰撞检测示例程序:void RF_SendProcedure_CSMA_CA(void){ static const u8 random_withdraw_time_table[] = {5,22,19,14,12,20,9,10,6,11,7,13,8,23,25,17,16,21,24,18}; static ...原创 2020-03-11 11:52:58 · 414 阅读 · 0 评论 -
【单片机】SI4432 Based Networking 1
设计了一个基于SI4432的USB Dongle:焊接了两个设备,相距20CM,正常状态下,两个设备都是处于接收状态,不向外发射信号:软件上以100Hz的速度读取RSSI寄存器的值并显示波形:这时候无线芯片收到的RSSI值在60到70左右,比较平稳,这可能是环境中存在的已经来自大自然(宇宙)的杂波。SI4432的数据手册对RSSI值的解释:The RSSI (Re...原创 2020-03-10 15:01:00 · 1476 阅读 · 3 评论 -
【单片机】DIY无刷电机驱动器 2
接着上篇,先解释一下为什么会出现“共振”现象,如下图:假如A1的占空比为25%,B2的占空比为10%,C2的占空比也为10%,我一开始想象的A1和B1之间的信号强度应该是:25% x 10% = 2.5%但是实际远不是这么回事,假如B2的高电平时间范围正好都落在了A1的高电平时间范围中,那么A1到B2的信号的实际占空比就是B2信号的占空比10%。但是如果B2的高电平时间范围没有完...原创 2020-03-04 18:48:51 · 3281 阅读 · 1 评论 -
【单片机】DIY无刷电机驱动器 1
参考文章:《【机械自动化】BLDC驱动器ESC》。控制直流无刷电机和控制直流有刷电机的最大区别有两点:1、有刷直流电机使用用两个驱动桥臂,无刷直流电机需要使用三个驱动桥臂。2、有刷直流电机使用碳刷换相,无刷直流电机需要外部控制换相。这里为了简化,没有使用霍尔传感器以及参考文章中介绍的反电势法(BEMF)原理进行换相检测,这里使用的方法是“猜”,“猜”法很简单,就是我觉得该换相了,就...原创 2020-03-04 12:25:10 · 14442 阅读 · 5 评论 -
【单片机】STM32F030硬件SPI的坑
使用的是STM32F030F4P6,这是一个小封装的单片机,但是五脏俱全,很多功能,就是引脚不多。使用到SPI的时候感觉应该和以前用过的STM32F103系列是一样的,寄存器的结构几乎是完全一样的,寄存器操作的程序甚至都能兼容,但是在使用的时候就是调不通,耽误了不少时间。SPI的引脚初始化和配置代码: GPIO_InitStructure.GPIO_Pin = nIRQ_PIN;// |...原创 2020-03-03 15:46:02 · 5678 阅读 · 4 评论 -
【嵌入式】数字电位器(旋转编码器)检测程序
void EXTI4_15_IRQHandler(void){ if(EXTI->PR & EXTI_Line5) { //每一相脉冲都可能有抖动,类似于按键的抖动 //需要在软件上将抖动过滤掉,延时放在最前面。 delay_us(1000); //去抖动,放在中断处理的最前面! // printf("r"); now = GPIOA->IDR ...原创 2020-02-27 19:40:58 · 6323 阅读 · 2 评论 -
Wiznet W5500 MAC RAW和UDP
使用MAC RAW功能对于W5500来说有点浪费,不过如果想要在W5500基础上移植LwIP之类的协议栈的话就需要MAC RAW功能了,这就使得W5500和一片ENC28J60网卡芯片的功能一样了,屏蔽掉了内部的硬件TCP/IP协议栈。但是我使用MAC RAW的功能不是为了移植LwIP协议栈,而是作为一种局域组网的高速数据传输的验证,场景如下:现在有一个设备需要8个控制器控制,8个控制器由一个...原创 2019-04-30 12:54:23 · 5310 阅读 · 1 评论 -
Wiznet W5500以太网控制器应用笔记
引用数据手册的芯片介绍:“W5500 是一款全硬件 TCP/IP 嵌入式以太网控制器,为嵌入式系统提供了更加简易的互联网连接方案。W5500 集成了TCP/IP 协议栈,10/100M 以太网数据链路层(MAC)及物理层(PHY),使得用户使用单芯片就能够在他们的应用中拓展网络连接。”很多人都接触过ENC28J60这款网卡芯片,相比较而言W5500拥有自带的TCP/IP协议栈,而ENC28J6...原创 2019-04-01 10:08:04 · 3419 阅读 · 0 评论 -
STM32 SPI+DMA实现WS2812灯的驱动
WS2812的时序频率比较高,STM32芯片使用软件生成WS2812的时序是没有问题的,但是要屏蔽所有中断,防止时序被干扰,但是这样当刷新频率很高的时候会导致CPU的占用率增高很多,STM32也没有控制WS2812的专门外设,所以为了解决这个棘手的问题,我提出了一个使用SPI+DMA的方式进行WS2812的控制。WS2812的介绍参考之前转载的文章:https://blog.csdn.net/tq...原创 2019-03-13 22:28:16 · 14588 阅读 · 18 评论 -
STM32F429-LTDC的颜色混合
1、前言:STM32F429单片机内部集成了一个RGB屏的控制器,这个控制器和STM32F103系列中使用FSMC的SRAM时序控制的8080接口的LCD不一样,这种RGB时序的屏可以做比较大尺寸,比如4.3寸、5寸、7寸等,而8080接口的LCD一般都在4寸以下。两种屏幕的最大区别是在显存存放的位置,RGB接口屏幕的显存在单片机中,也就是需要单片机提供足够的内存空间作为显存使用,而8080接...原创 2018-11-28 10:21:58 · 3417 阅读 · 1 评论 -
STM32下载程序出现Invalid ROM Table
刚做的STM32F429IGT的板子使用SWD口下载程序的时候出现“Invalid ROM Table”错误,网上也有很多同行遇到这个问题,他们的解释是因为芯片内部有程序,并且里面的程序使用外部晶振,并且是按照外部晶振为8MHz的频率来设计的,而我们的板子上的晶振是是25MHz的,内部程序运行的时候会出现超频,导致芯片内部锁相环“卡死”,锁相环出现问题就无法给CPU内核提供时钟了,导致无法下载程序...原创 2018-11-19 16:50:05 · 5250 阅读 · 0 评论 -
STM32内置晶振和外置晶振的精度差别
STM32系列处理好像都有内置的RC振荡器,这个内置RC振荡器可以代替外置晶振,可以节省成本和PCB空间。我之前有几个设计都是使用的内置的晶振,觉得使用起来很方便,我也知道内置振荡器的精度不如外置的晶振,但是一直没有遇到对于振荡器的精度有十分严格的要求的应用。不过这次对付一个对时间精度要求比较高的应用,我发现了内置RC振荡器和外置晶振的差别还是很大的,而其我使用的还是最廉价的外置晶振,其精...原创 2018-08-03 16:52:59 · 33521 阅读 · 0 评论 -
Winbond W25QXX SPI Flash使用笔记
相较于EEPROM而言,SPI Flash的存储空间简直就是打开了一个新世界。以W25Q16为例,16Mb也就是2MB的空间,是AT24C08芯片的1KB空间的2048倍,价格也没有相差很多。同时使用SPI总线可以实现更高的读写速度,W25Qxx的SPI总线可以达到80MHz,这是IIC总线望尘莫及的,而且我比较喜欢用的STM32单片机的IIC总线总是让人那么揪心,所以我一直都是用的软件模拟IIC...原创 2018-07-20 16:25:07 · 32659 阅读 · 0 评论 -
RealView MDK生成BIN文件的方法
KEIL MDK本身并没有输出BIN文件的功能,在output栏中只能输出HEX文件:我们想要生成BIN文件的话需要使用小工具转换,但是每次编译完之后要手动调用一次转换挺麻烦,我们可以使用MDK的脚本执行来实现,打开User栏:可以看到有三个框,分别是Run User Program Before Compilation of a C/C++ File、Run User Progr...原创 2018-07-17 11:34:27 · 696 阅读 · 0 评论 -
设计一款STM32的BootLoader
参考文章:https://blog.csdn.net/qingtian506/article/details/9128899之前很想做一个属于STM32的BootLoader,但是想想没什么实际用处就没有下手,但是当前的项目遇到的麻烦事情要我改变了这种看法。比如说我开发了一个产品需要测试,把一个样品送到客户手里去测试使用,但是客户在使用的过程中提出了一些修改建议,那我就在做一个样品改好程序之后...原创 2018-07-13 12:01:33 · 22074 阅读 · 7 评论 -
STM32F10x单片机Flash写操作导致中断不响应问题
昨天遇到一个问题,在写入数据到STM32F103单片机的Flash中时会出现串口中断接收数据丢失现象,但是我设置的串口接收中断优先级是最高的,并且没有哪里将全局中断关闭很长时间(除了操作系统部分内核代码执行的时候关闭全局中断,但是没有占用很长时间,不会导致丢失串口数据)。在正常情况下在没有写数据到Flash中去的时候所有串口数据都能正常接收,没有数据丢包现象,但是当执行一次写入操作(写一个页256个原创 2018-05-05 10:23:10 · 10810 阅读 · 6 评论 -
RS485在切换收发状态的时候收到0x00
介绍一下测试背景,我使用单片机的TTL232,通过MAX485芯片转成RS485协议。但是遇到一个问题,MAX485芯片在从发送状态切换到接收状态的时候会收到一个0x00,很显然这是一个“假”数据,并不是真实接收到的数据,这个0x00着实有点烦人,我们来找一下谁是“凶手”。 我们知道TTL232协议中传输一个字节的数据需要一个启动位,启动位就是一个位的0电平,如下图: 那么我们可以猜测,当从原创 2018-05-03 12:14:21 · 5462 阅读 · 1 评论 -
EEPROM AT24C08的操作
EEPROM应该是学习IIC总线时候最先接触的东西了,EEPROM的优点是可以随机存取,不像Flash存储器一样需要先擦除在能写入,而且擦写次数多存储时间长,但是缺点是存储空间非常有限,像我这用的Atmel的AT24C08只有8Kbit的存储空间,也就是只有1KB,存储一些参数是够的,但是存储文档、音频什么的就算了,还好我现在项目只要存储一些参数,AT24C02的空间不够,所以用了空间相对大一点的A原创 2018-02-01 13:43:26 · 4121 阅读 · 2 评论 -
STM32F1xx芯片的非对齐内存访问
简单地说非对齐内存访问就是被访问的地址不是4字节对齐的,非对齐内存访问的用处很多,有的时候可以精简不少程序,尤其是在帧数据处理的时候。例如有一个整形变量A存放在内存的0x0000 0000处,访问变量A的时候就是对齐访问,因为地址0x0000 0000是4字节对齐的,再比如又有一个整形变量B的存放地址为0x0000 0003,那么对B的访问就是非对齐内存访问了,因为地址0x0000 0003不是4的原创 2018-01-31 13:45:22 · 2255 阅读 · 0 评论 -
CAN总线的仲裁机制简述
Controller Area Network简称CAN总线是一个在汽车电子上用得非常广泛的一种协议,CAN总线有众多优点…… 好,说了那么多CAN的特点之后激起了我对CAN总线工作原理的兴趣。CAN总线的总线仲裁机制是我觉得设计的非常精妙的,下面总结几个CAN总线的特征点,这几个特征点对理解CAN的总裁机制非常重要。1、CAN总线在物理层上只有两根线CANH和CANL,根据两根线的的电位差原创 2018-01-22 11:09:19 · 17675 阅读 · 10 评论 -
TL431芯片的使用
TL431是一款高性价比的常用分流式电压基准,有很广泛的用途。通俗的说就是用来生成一个非常稳定的基准电压源,例如在使用AD进行电压采集的时候,如果参考电压不够稳定,收到电网的干扰,就会导致测量的结果有误差,这时候就需要一个很稳定的参考电压源。市面上有很多类似的电压基准芯片,但是TL431的性价比很高,所以使用的很广泛。下面是我个人的使用心得,欢迎讨论。 TL431的数据手册在alldateshe原创 2018-01-05 17:36:52 · 9745 阅读 · 3 评论 -
STM32系列命名规则
例如: STM32 F 103 C 6 T 7 xxx 1 2 3 4 5 6 7 8第1部分:产品系列名,固定为STM32。 第2部分:产品类型;F表示这是Flash产品,目前没有其它选项。 第3部分:产品子系列;103表示增强型产品,101表示基本型产品,105表示集成一个全速USB 2.0 Host/Device/OTG接口和两个具有先进原创 2017-12-29 10:55:18 · 845 阅读 · 1 评论 -
单片机莫名掉电
开发一个低功耗项目,坑爹的地方不是一个两个。真的是服了。今天又被万用表坑了一次。系统进入低功耗之后电流在几十个uA左右,这时候使用触摸按键唤醒系统没有问题,可以正常唤醒运行,但是使用指纹模块唤醒的话就会导致掉电,为什么呢???指纹模块耗电量太大???的确指纹模块的耗电量是很大,峰值电流140mA,我就想是不是把系统电源电压拉低了导致单片机复位了,加大的滤波电容行不通,单独使用稳压芯片供电也行不通,使原创 2017-11-10 17:38:34 · 1319 阅读 · 0 评论 -
Keil MDK不支持结构体对指定元素初始化
结构体对指定元素初始化就是类似下面的操作:struct test{ int a; int b;};struct test t = { .a = 1, .b = 2};这样就能不按照结构体中的元素顺序对结构体进行初始化,这种方式在linux内核代码中使用的很多很多,但是在KEIL MDK中使用却报错:“expected an expression”。其实就是编译原创 2017-10-25 09:57:08 · 5698 阅读 · 0 评论 -
emWin 2天速成实例教程000_如何快速入门emWin/ucGUI
原文链接:http://www.neqee.com/content/?149.html备注:(1)打开工程目录下的"Exe\GUISimulationDebug.exe"即可看到效果。(2)看完教程000~005就基本会用emWin做项目,其他章节可以需要时再参考。 emWin和ucGUI是一样的,只是名称不同而已。emWin是德国SEGGER公司一个嵌入式GUI图形转载 2017-09-26 15:53:14 · 1917 阅读 · 0 评论 -
STM32-将程序编译成lib文件使用
参考我转载的文章:http://blog.csdn.net/tq384998430/article/details/78084719(库工程表示用于编译得到lib的项目工程,应用工程表示进行应用开发的项目工程)首先建立一个库工程,将需要编译成库的源程序都添加进库工程,在option选项中设置好处理器类型、编译器等参数,最好是沿用其他STM32应用工程的配置,然后在option的output选项卡中将原创 2017-09-25 14:43:44 · 3325 阅读 · 0 评论 -
将STM32的标准库编译成lib使用【图文】
原文链接:http://www.cnblogs.com/zyqgold/p/3189719.html以前一直使用STM32的标准库,需要一步步地将代码加进去,将编译选项设置好,然后再编译整个工程。这个编译过程是一个相当慢的过程!完全编译大约需要一支烟的时间。每次建立工程都这么编译,是一个相当浪费时间和香烟的过程。于是,我有了将库编译成lib文件的想法。本博文就是我将ST转载 2017-09-25 14:28:05 · 1967 阅读 · 0 评论 -
STM32低功耗应用
说起低功耗的单片机第一个想起来的肯定是MSP430系列单片机,它以极地的功耗和较强的性能占领了低功耗控制、应用领域。但是我不会MSP430单片机,其实也没什么会不会,学学都能用,只是嫌MSP430的开发环境和调试方式和ARM的不一样,嫌麻烦就没有使用过MSP430,用的比较多的单片机还是STM32系列的单片机,虽然是ARM内核,但是由于不能跑Linux系统,还是将其划归为单片机,无所谓,不是所有的应原创 2017-08-07 20:39:56 · 1883 阅读 · 0 评论 -
IIC读写16位地址的寄存器
一般来说IIC器件的内部寄存器地址都是8位的,这样在进行读写操作时,发送完器件地址之后直接发送一个字节的寄存器地址,然后即可以进行读写。但是有的器件内部寄存器是按照16位地址编排的,例如一些EEPROM器件,由于存储的数据量较大就会需要较大的寻址空间,对于这种的器件的内部寄存器寻址就需要多个字节的地址,也就是在发送完器件地址之后需要发送多个寄存器地址字节,具体实现如下程序所示:u8 IIC_R原创 2016-12-12 10:46:01 · 20360 阅读 · 3 评论 -
STM32-CubeMX学习笔记
1、首次使用参见文档:http://blog.csdn.net/tq384998430/article/details/534662632、CubeMX使用的HAL库中宏定义都是使用两个下划线加上全大写字母构成,因此程序中看见双下划线全大写的函数基本都是宏函数。原创 2016-12-06 15:14:42 · 2840 阅读 · 1 评论 -
手把手教你写STM32的bootloader(SDIO读取TF更新Bootloader)
百度文库链接:http://wenku.baidu.com/link?url=N3dazsOFn4x2XS0t_1Cd3toxx3pNm4Bi85W5vaUuuOD6EiEKdPg9Q7ihEyS1JMEUCgkvxWyBK4uHnJbJjFdyuno5DC_Ny8PpjyKeKJwRDFS原创 2016-11-29 13:37:54 · 3944 阅读 · 0 评论 -
基于STM32处理器的USB HID模拟鼠标键盘(2) - 实现键盘鼠标功能
由于在报告描述符中使用了两个Report ID,分别是0x01和0x02,前者是键盘的报告描述符的报告ID,后者是鼠标的报告ID,HID的键盘和鼠标发送的数据格式参考文档:http://linfengdu.blog.163.com/blog/static/1177107320122296942641/根据文档编写键盘和鼠标的发送函数如下: typedef enum { KEY原创 2016-11-28 10:42:12 · 18252 阅读 · 0 评论 -
基于STM32处理器的USB HID模拟鼠标键盘(1) - USB HID基础
HID是Human Interface Device的缩写,HID设备是直接与人交互的设备,例如键盘、鼠标与游戏杆等。不过HID设备并不一定要有人机接口,只要符合HID类别规范的设备都是HID设备。交换的数据存储在称为报表或报告(report)的结构内,设备的固件必须支持HID报表的格式。主机在控制与中断传输中传送与要求报表,来传送与接收数据。报表的格式非常有弹性,可以处理任何类别的数据。设备除了原创 2016-11-27 20:17:19 · 21290 阅读 · 2 评论 -
JLINK固件修复方法
有时候jlink的使用不当会导致jlink“坏掉”,但是这个坏掉不是硬件烧了,而是jlink内部软件的问题,比如今天这个狗日的MDK5给我更新jlink的时候告诉我固件更新失败,我说失败就失败吧,无所谓。然后要命的是jlink尽然不能用了,估计是因为固件更新了一部分,所以导致不能使用了,或者是因为检测出我的jlink是盗版的,然后故意给我弄坏了,ma dan,正版80多一个你和我们血呢??坏了原创 2016-11-24 10:53:27 · 4864 阅读 · 0 评论 -
JLINK的SWD解法
下面是20针牛角接口的JTAG接口图和SWD接口图,使用JTAG是安装左边的接法,使用SWD调试时使用右边图片的接法,注意要在MDK的debug选项栏的settings中的port选择SWD。有一点很奇怪的是单片机的3.3V引脚必须接到1管脚而不能接到2管脚。我猜测是因为在JTAG模式中1脚和2脚都接到了VCC-3.3V但是在SWD模式下2管脚是不可用的,也就是reserved,所以必须接原创 2016-11-23 21:57:29 · 2706 阅读 · 0 评论