自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

wallace89的博客

分享学习,分享经验,一起成长

  • 博客(130)
  • 收藏
  • 关注

原创 嵌入式CANopen协议从入门到落地产品(更新2023.10.18)

一、前言我写CANopen系列博文的初衷是分享如何使用STM32单片机开发一款CANopen产品,所谓实战为主,理论为辅。光看CANopen协议的理论是很枯燥的,而且无论看多少遍都无法掌握CANopen协议。我认为掌握CANopen协议的唯一方法是自己设计一个CANopen从站。以前我在电气研发的时候,看了很多遍讲CANopen协议的pdf与书籍,最后也没看懂CANopen是什么东西。害的我在工作上一碰到CANopen协议就害怕,觉得是一个非常复杂的东西,一般人根本学不会。命运的转折点又来了,上一年(2

2021-07-28 21:16:36 10166 8

原创 STM32+CubeMX开发工程笔记汇总(更新2022.6.12)

一、前言使用STM32开发产品已经快两年了,一路走来真的非常有意思。单片机型号:从STM32F103->STM32F407->STM32H743库: 从标准库->HAL库(STM32CubeMX生成)IDE:从IAR->STM32CubeIDE->KeilRTOS:从UCOSIII->FreeRTOS->RTX5学习的嵌入式厂家:正点原子->野火->硬石科技->安富莱电子(牛B厂家)在使用STM32开发产品的过程中,经常碰到不知

2021-07-13 21:47:53 3051 1

原创 嵌入式实时操作系统RTX5快速入门 (完结)

一、前言在实际工作上使用过ucosIII与FreeRTOS,对它们俩的API都较为熟悉,那么当有新的项目时,直接二选一就好了。为什么非得去折腾另一款新的RTOS(RTX5)?原因是使用RTOS会影响系统的执行效率(ISR切换线程,线程切换线程都需要时间)。但是,RTX5在这方面做得不错,这是我非得去折腾一个新的RTOS的原因。RTX5的简单介绍可以查看安富莱的总结:第3章 RTX5操作系统介绍非得折腾去RTX5的理由:实时性强。以低的中断延迟执行高速实时操作(对于M3/M4/M7内核可以实现零中断延

2021-06-09 23:01:16 18145 13

原创 CANopen | 对象字典OD 07 - 创建对象字典变量,变量变化时发送TPDO1,滤波时间200ms

CANopen从站有一个变量tx_Value,映射到TPDO1上。接着,当变量tx_Value发生变化时,通过TPDO1发送出去,滤波时间为200ms。

2023-04-16 21:26:51 1117 1

原创 CANopen | 对象字典OD 06 - 创建对象字典变量,通过TPDO定时发送

CANopen从站有一个变量tx_Value,映射到TPDO1上。接着,CANopen从站每1S发送一次TPDO1,将tx_Value发送出去。

2023-04-16 21:18:57 1228 4

原创 CANopen | 对象字典OD 05 - 创建对象字典变量,映射到RPDO

以上摘自《CANopen_easy_begin》的第7章。

2023-04-16 20:27:46 1540 3

原创 IAP-Bootloader | 基于STM32F407+STM32CubeMX - 通过按钮实现Bootloader程序与APP程序互相切换

bootloader一般分为两种:1、ISP - 使用ST芯片自带的bootloader程序实现APP程序的刷写,其优势是简单,可靠。2、IAP - 自己编写一个bootlader实现APP程序的刷写,其优势是自定义,灵活性强。可以通过任意的通讯接口实现远程升级。下面文章是初学IAP的重点,文章是基于标准库解决问题,在HAL库上原理一样,只是处理方法改一下。(HAL库没有函数NVIC_SetVectorTable)

2022-09-04 22:52:25 4520 3

原创 MQTT | Windows + mosquitto搭建MQTT Broker(本地服务器)与MQTTX客户端联调

当我们调试MQTT客户端时,在本地电脑上搭建MQTT Broker(本地服务器)可以方便调试MQTT通讯。为了测试MQTT Broker是否正常运行,在本地电脑通过MQTTX软件分别创建MQTT客户端1与MQTT客户端2。接着MQTT客户端1发布主题hello_world,MQTT客户端2订阅主题hello_world。下载mosquitto软件:https://mosquitto.org/download/下载对应的版本,现在的windows电脑应该都是64位的吧?请记住软件安装的目录,后面要

2022-07-05 12:49:25 6082 4

原创 bootloader | 基于STM32F407 - 使用STM32Cubeprogrammer的UART进行固件烧写

stm32,bootloader

2022-06-13 00:00:30 2134 3

原创 bootloader | 基于STM32F407 - 使用STM32Cubeprogrammer的USB DFU进行固件烧写

stm32f407,bootloader

2022-06-12 22:46:46 6940

原创 MacOS|解决《UNIX环境高级编程》的头文件apue.h找不到的问题

文章目录一、前言二、下载与修改apue.h文件2.1、官网[http://www.apuebook.com/apue3e.html](http://www.apuebook.com/apue3e.html)2.2、源代码apue.3e2.3、修改apue.h文件三、gcc编译器的头文件路径四、将apue.h与error.c复制过去五、编译例程代码5.1、1-4的代码5.2、使用gcc编译代码,并执行代码一、前言学习《UNIX环境高级编程》的所有例程代码之前,必须先解决头文件apue.h的问题。头文件

2022-05-24 22:32:02 753

原创 ESP32 + ESP-IDF | 串口1 - 简单的串口回环测试

文章目录一、前言**二、VSCODE + ESP-IDF****2.1、快速创建项目****2.2、选择串口通道,ESP芯片型号**三、代码3.1、头文件3.2、全局变量3.3、app_main( )函数3.4、实验代码四、相关API4.1、uart_param_config( )4.2、uart_set_pin( )4.3、uart_driver_install( )4.4、uart_write_bytes( )4.5、uart_read_bytes( )一、前言测试串口外设最省事的方法是串口回环

2022-04-17 23:44:16 4014

原创 ESP32 + ESP-IDF |GPIO 03 - 定时器轮询按钮的状态,控制LED亮或者灭

一、前言前面两个章节使用了GPIO的输出功能,本章节介绍如何使用ESP32上GPIO的输入功能。通过一个简单的实验来学习这个功能:1、开启一个定时器(上一章节学习了),定时器以每100ms的周期来轮询gpio26的电平(按钮被按下 = 电平0,按钮没有被按下 = 电平1)。2、当按钮被按下时,gpio27输出电平0,让led亮起来。当按钮没有被按下时,gpio27输出电平1,让led熄灭了。实验视频:ESP-IDF打印出来的信息:这个实验的代码只是演示GPIO的输入功能,并不能用于实际项

2022-04-10 00:43:14 5325

原创 ESP32 + ESP-IDF |GPIO 02 - 使用高分辨率定时器,每100ms时间间隔驱动外部两个LED灯闪烁

文章目录一、前言二、VSCODE + ESP-IDF2.1、快速创建项目2.2、选择串口通道,ESP芯片型号三、代码3.1、头文件3.2、全局变量3.3、app_main( )函数3.4、定时器回调函数3.5、实验代码四、相关API4.1、函数esp_timer_init( )4.2、函数esp_timer_create( )4.3、函数esp_timer_start_periodic( )4.4、变量类型esp_timer_handle_t4.5、变量类型esp_timer_create_args_t一

2022-04-05 23:14:57 3891 2

原创 ESP32 + ESP-IDF |GPIO 01 - 驱动外部两个LED灯,以每300ms的时间间隔闪烁

文章目录一、前言一、前言嵌入式软件开发从来都不是从hello world开始,而是从GPIO驱动LED闪烁开始。本次实验的目的是使用GPIO26与GPIO27各驱动一个LED灯,以300ms的时间间隔闪烁。

2022-04-05 16:10:27 5147

原创 Python | threading05 - 使用有界信号量,实现线程间同步

文章目录一、前言二、ValueError异常2.1、测试有界信号量过多释放是否真的会产生ValueError异常三、生产者-消费者模型3.1、代码3.2、运行的结果一、前言上一节学习完信号量,接着继续学习有界信号量。首先看看python官方对有界信号量的描述:从官方的描述可以看到,release( )方法过多被调用时,就会产生ValueError异常。二、ValueError异常2.1、测试有界信号量过多释放是否真的会产生ValueError异常我在命令行测试了一下,过多的释放的确会产生

2022-01-16 20:07:00 621

原创 Python | threading04 - 使用信号量,实现线程间同步

文章目录一、前言二、生产者-消费者模型2.1、代码2.2、运行的结果2.3、Semaphore没有设置上限值一、前言先说一下信号量与互斥量之间的关系。信号量的一个特殊的应用是互斥锁(互斥量),当信号量的最大数量是1时,它跟互斥锁(互斥量)的作用相同。以下摘自《python并行编程》中文版:二、生产者-消费者模型本次的代码目的如下:生成者producer每隔3秒时间同步一次消费者1(customer1)与消费者2(customer2)。消费者1(customer1)与消费者2(custo

2022-01-16 20:00:10 1253

原创 Python | threading03 - 使用条件对象,实现线程间的同步

文章目录一、前言二、生产者-消费者的模型2.1、代码2.2、运行2.3、wait( )方法会将互斥锁释放三、条件同步 - threading.Condition( )3.1、相关API3.2、acquire( )3.2、release( )3.3、wait( )3.4、notify(n=1)3.5、notify_all( )3.6、wait_for(predicate,timeout=None)一、前言上一篇博文学习了线程的互斥锁(Python | threading02 - 互斥锁解决多个线程之间随

2022-01-09 00:29:47 925

原创 Python | threading02 - 互斥锁解决多个线程之间随机调度,造成“线程不安全”的问题。

文章目录一、前言二、线程不安全的现象2.1、代码2.2、运行三、使用互斥锁解决线程不安全3.1、代码3.2、运行四、忘记释放互斥锁,造成死锁4.1、代码4.2、运行五、with语句拯救粗心的人类5.1、with语句在互斥锁上的使用5.3、运行的结果一、前言多线程的优势在于并发性,即可以同时运行多个任务。但是当线程需要使用共享数据时,也可能会由于数据不同步产生“错误情况”,这是由系统的线程调度具有一定的随机性造成的。由于线程之间的任务执行是CPU进行随机调度的,并且每个线程可能只执行了n条指令之

2022-01-03 01:23:39 3435

原创 树莓派 | threading01 - 创建两个子线程同时运行,两个线程各负责控制一个LED灯以不同的频率闪烁

文章目录一、前言二、代码三、运行一、前言Python | threading01 - 创建两个同时运行的子线程上一次使用了python的多线程库threading创建了两个同时运行的子线程。在树莓派上用threading创建两个子线程同时运行,两个线程各负责控制一个LED灯以不同的频率闪烁。二、代码# python3.9import timeimport threadingimport RPi.GPIO as GPIOdef thread1(): """ 线程1

2022-01-02 20:25:36 2547 2

原创 Python | threading01 - 创建两个同时运行的子线程

文章目录一、前言二、创建两个同时运行的线程2.1、代码2.2、运行三、threading库的函数3.1、threading.Thread()3.2、threading.join()3.3、threading.start()四、最终的完整代码一、前言使用threading库,咱们的python程序就能从单线程串行变成多线程并发。python的threading库实现的“并发”是假的并发,即同一时刻只有一个线程在运行。据说python后来想将这个假的“并发”改为真的并发,但出现特别多的BUG,最后放弃了

2022-01-02 20:22:02 5665

原创 树莓派 | 串口02 - 树莓派4B上打开另外4路硬件串口

文章目录一、前言二、打开另外4路串口2.1、查看4B上所有的串口资源2.2、查看某个串口的信息2.3、开启另外4路硬件UART2.4、查看配置是否生效三、各个串口自收自发测试3.1、ttyAMA03.2、ttyAMA13.3、ttyAMA23.4、ttyAMA33.5、ttyAMA4一、前言树莓派 | 串口基础01 - 修改串口的映射关系相比树莓派零、1、2 以及 3 的双串口 UART0(PL011)和 UART1(mini UART),树莓派 4B 中新增了 4 个 PL011 串口共计有 6

2022-01-02 20:11:49 4069

原创 Python | Socket02 - 使用with语句建立一个TCP服务器(阻塞+单线程),将TCP客户端发过来的字符串原路返回

一、前言Python | Socket01 - 创建一个TCP服务器(阻塞+单线程),将TCP客户端发过来的字符串原路返回在上一篇博文完成TCP服务器简单的收发程序后,发现在Python上有更加简洁的方式来实现,使用with语法提供的上下文管理器。该程序的功能还是跟上一篇博文一样。二、代码import socketdef main(): # 使用with语句创建并管理一个套接字对象tcp_Server with socket.socket(socket.AF_INET,so

2021-12-17 18:43:14 1459

原创 Python | Socket01 - 创建一个TCP服务器(阻塞+单线程),将TCP客户端发过来的字符串原路返回

一、前言使用Python可以很简单地创建一个TCP服务器程序,该TCP服务器的程序目的是完成这个功能:TCP客户端发送一段字符串给TCP服务端,TCP服务端将字符串原路返回去。我是从该B站视频教程学习python的socket编程:https://www.bilibili.com/video/BV1Xx411R743?spm_id_from=333.999.0.0二、代码import socketdef main(): # 创建套接字tcp_Server_Socket t

2021-12-17 18:34:58 1586

原创 H7-TOOL | 以太网 - 动态IP(DHCP)功能测试

文章目录一、前言二、接线三、H7-TOOL设置四、查看路由器分配给H7-TOOL的IP地址与MAC地址五、H7-TOOL的上位机软件h7toolPC六、细节补充一、前言安富莱研发的软硬件开源神器工具H7-TOOL非常强大。今天来测试一下以太网的动态IP(DHCP)功能。H7-TOOL是使用基于M7架构的STM32H750高性能单片机开发。二、接线框图:三、H7-TOOL设置根据官方的介绍,打开H7-TOOL上动态IP(DHCP)的功能。注:根据我现在使用的固件版本,动态DHCP已经

2021-11-20 22:22:33 2290

原创 电子电路 | I2C - 通过阻抗匹配解决CLK与SDA信号的上冲与下冲

文章目录一、前言二、案例一2.1、实际电路2.2、解决方案三、案例二3.1、实际电路3.2、解决方案一、前言通常I2C是用于PCB板内各个IC之间的总线通讯,此外I2C也可以用于短距离板级之间的通讯,默认波特率为100k。I2C电路必须用阻抗匹配的方法来优化SDA与SLK信号的波形,让信号波形尽量接近方波,优化信号完整性。糟糕的波形:好的波形:无论是I2C电路还是SPI电路都存在同样的信号完整性问题,要使用阻抗匹配的方法来优化。阻抗匹配的前提是学习使用示波器去观察波形,根据实际情况去调整阻抗

2021-11-16 19:09:20 9748 2

原创 KICAD | 分享一个必须安装的插件Interactive HTML BOM plugin for KiCad

文章目录一、前言二、Interactive HTML BOM plugin for KiCad2.1、下载2.2、安装2.3、使用一、前言PCBA设计完成后,必须花时间整理BOM。KICAD官方虽然提供快速生成BOM的功能,用过的同学们应该都知道,根本没法用!以前在珠海丽亭智能上班的时候,我带的一位嵌入式的实习生(这位同学学习能力非常强!)给我推荐一款插件,说能很好地处理BOM的问题。当我使用一次后,发现根本离不开这一款KICAD插件了。(我用过Altium Designer,PADS,还有立创E

2021-10-05 17:18:05 3722 1

原创 树莓派 | 串口03 - Windows使用串口助手发送字符给树莓派

文章目录一、前言二、打开串口2.1、通过图形桌面2.2、通过终端三、串口测试3.1、minicom3.2、Windows串口调试助手一、前言树莓派 | 串口01 - 在系统上修改串口的映射关系当完成串口映射关系的修改后,需要验证一下串口的功能是否正常。最简单的方法是在Windows上使用串口助手发送字符给树莓派,树莓派将收到的字符显示出来了。测试的硬件:电路图:二、打开串口2.1、通过图形桌面将Serial Port设为enable,将Serial Console设为Disabled

2021-10-02 00:02:12 1086

原创 树莓派 | 串口01 - 在系统上修改串口的映射关系

文章目录一、前言二、串口的映射关系2.1、系统默认的串口映射关系2.2、修改串口映射关系三、细节补充一、前言树莓派3B以上版本之后,树莓派CPU内部有两个串口,分别是硬件串口(/dev/ttyAMA0)与mini串口(/dev/ttyS0)。ttyAMA0有单独的波特率时钟源,性能高,可靠。ttyS0的时钟源又内核提供,会受操作系统影响,不稳定。可以这样理解,ttyAMA0是硬件串口,ttyS0是软件串口。所以,ttyS0没什么实用价值,要用树莓派实现可靠的串口通讯,只能用ttyAMA0了。然

2021-10-01 21:05:29 3542

原创 树莓派 | 通过网线连接笔记本与树莓派,实现SSH连接,并让树莓派能上网(Internet)

文章目录一、前言二、实验开始2.1、硬件2.2、Windows的网络2.3、树莓派2.4、回到Windows的网络和共享中心2.5、MobaXterm一、前言这种情况最常见与使用:树莓派经过自身的无线WIFI连接到无线路由器,笔记本也通过WIFI连接到同一个无线路由器。在这种情况下,只需要知道树莓派分配的IP地址,笔记本电脑就能通过SSH或者VNC方式访问树莓派。(在家里,我可以通过手机APP连接到无线路由器,找到树莓派电脑被分配的IP地址。)在实际使用上,有可能出现如下这种情况。笔记本电脑通过W

2021-09-25 16:54:31 10386 15

原创 树莓派 | 在windows使用RealVNC,远程登陆树莓派的图形桌面

文章目录一、前言二、RealVNC2.1、下载RealVNC三、树莓派3.1、打开VNC功能3.2、查看树莓派的IP地址四、Windows4.1、运行RealVNC一、前言某些情况下,我们希望通过Mac或者Ubuntu或者Windows远程登陆树莓派系统的图形桌面,完成某些工作。此时,RealVNC是一个流行之选。它可以很好地跟树莓派系统的VNC服务器建立连接。效果如下所示:二、RealVNC2.1、下载RealVNC官方网站:https://www.realvnc.com/en/conn

2021-09-21 12:56:23 3380

原创 树莓派 | 在Windows使用MobaXterm,通过SSH远程控制树莓派

文章目录一、前言二、MobaXterm2.1、下载安装包2.2、安装软件三、树莓派3.1、查看树莓派系统的IP地址3.2、开启树莓派的SSH功能。四、Windows4.1、MobaXterm一、前言Windiws系统远程控制Linux系统(Ubuntu或者树莓派等)时,最常用的方式是SSH。其实就是在Windows上登陆远程Linux的终端,效果如下:免费的SSH工具有很多,最基本的就是大名鼎鼎的Putty了,相信很多嵌入式的老前辈都是用这一款免费的SSH工具。今天,我演示的是另一款免费的现代化的

2021-09-21 12:26:56 2774 3

原创 CANopen | 对象字典OD 03 - 启动CANopen节点的服务数据对象SDO

文章目录一、前言二、实验的目的三、对象字典OD3.1、Slave1.od3.2、Slave1.c四、CAN盒子(收发器)4.1、通过SDO方式修改CANopen从站的心跳时间一、前言当设计一个CANopen节点(从站)时,必须必须打开SDO服务器功能。只有CANopen从站打开SDO服务器功能后,CANopen主站才能读写CANopen从站的对象字典。为什么CANopen主站要修改CANopen从站的对象字典?以前我调试过一个CANopen伺服驱动器,品牌是德国ELMO。伺服驱动器上电后只发出一个

2021-09-08 10:10:45 2687 6

原创 CANopen | 对象字典OD 04 - 创建对象字典的变量(映射变量)

文章目录一、前言二、实验目的三、对象字典3.1、找到工程里的对象字典文件3.2、创建映射变量四、STM32代码4.1、Slave1.c4.2、main.c五、CAN盒子(收发器)5.1、通过SDO方式获取obj_Var_Buttom的值一、前言对象字典的映射变量是用户程序与CANopen程序(Canfestival)之间的通讯桥梁,目的是能让用户程序与CANopen程序(Canfestival)通讯。例如CANopen从站0x05的用户程序每隔1S时间读取一次按钮是否被按下,当按钮被按下时,修改映射变

2021-09-08 09:46:14 3530 13

原创 CANopen | 对象字典OD 02 - 修改CANopen节点的心跳报文发送间隔

文章目录一、前言一、前言通过修改CANopen节点的对象字典,改变它发送心跳报文的频率。测试硬件如下:

2021-08-27 16:53:58 2918

原创 CANopen | 拓展知识 - CANopen,CAN总线与OSI模型的关系

一、前言CAN总线定义OSI模型的物理层与数据链路层。CANopen协议使用了OSI模型的应用层与传输层。二、CANopen and the OSI reference model国外原文的地址:https://www.canopensolutions.com/english/about_canopen/CANopen-and-the-OSI-reference-model.shtmlISO的开放系统互连OSI参考模型指定了七层。CANopen协议与CIA301中规定的通讯配置文件(或者E

2021-08-27 11:19:59 1863

原创 CANopen | 对象字典OD 01 - canfestival对象字典编辑软件安装与使用

对象字典编辑软件环境的搭建很简单。直接参考《硬石YS-H7Multi开发板开发手册》的第46.3章节-对象字典编辑器的环境搭建与第46.4章节-对象字典编辑器的使用,手册的下载地址我分享:《硬石YS-H7Multi开发板开发手册》:同学们也需要参考链接:https://pan.baidu.com/s/1qtFBjw7pzaZZVj67BjVTmg提取码:5aidCanfestival的对象字典的样子如下,后续的实验都会用到以下7个段,一定要熟练掌握。1、0x1000 ~ 0x1029 Com

2021-08-26 14:41:35 2494

原创 CANopen | 网络管理NMT02 - 节点状态切换命令

文章目录一、前言二、命令2.1、启动命令0x012.2、停止命令0x022.3、进入预状态0x802.4、复位节点应用层0x812.5、复位节点通讯0x82一、前言上一节演示了一些能控制CANopen节点的CAN报文,这些都是节点状态切换命令。值得注意的是,这些节点状态切换命令不一定非要CANopen主站发送,CANopen从站也可以发送这些NMT报文。我们可以在STM32的程序里面编写一段代码,在某些条件下,调用FDCAN底层直接发送CAN报文,控制CANopen网络上的各个CANopen节点(包括

2021-08-26 14:25:38 9939 7

原创 CAN总线技术 | 数据链路层04 - CAN节点状态与错误处理机制

文章目录一、前言二、错误检测区域三、错误帧四、CAN节点状态4.1、FDCAN错误计数器寄存器(FDCAN_ECR)4.2、FDCAN协议状态寄存器(FDCAN_PSR)一、前言CAN的错误类型有如下图所说的5种,其中:应答错误与位发送错误会出现在CAN发送的节点(CAN发送端)CRC错误与位填充错误会出现在CAN接收的节点(CAN接收端)二、错误检测区域如下是每一个错误发生在CAN报文中的区域,5种错误类型可以同时发生。位检测的区域最长,可以看到采样点的匹配是多么的重要(一般不建议相

2021-08-25 16:38:09 4252 1

原创 CAN总线技术 | 数据链路层03 - CAN总线竞争与仲裁机制

文章目录一、前言二、CAN总线非破坏性仲裁机制三、非破坏性仲裁机制的前提四、仲裁的实现一、前言CAN总线厉害的其中一个原因是CAN总线灵活且强大的竞争与仲裁机制。二、CAN总线非破坏性仲裁机制当CAN节点发送竞争失败时,计划发送的CAN报文并不会被破坏。然后CAN节点等待下一次的同步。三、非破坏性仲裁机制的前提CAN控制器有电平检测的功能,再加上“线与”的原理就能实现非破坏性仲裁机制。说白了,就是抢占总线之前先看看总线有没有被其他CAN节点占用,如果占用了就进入只听模式,等待下一次的同步

2021-08-25 15:46:01 5495 4

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除