- 博客(85)
- 收藏
- 关注
原创 使用Jlink打印单片机的调试信息
除去RTT_Debug.h外的其他几个文件在jlink安装目录。5.打开jlink rtt viewer。RTT_Debug.h的内容如下。1.在工程中添加6个文件。
2024-09-24 15:20:30 673
原创 stm32 IIC总线busy解决方法
3) 在HAL_I2C_Mem_Write()之前,先判断是否busy,如果busy就调用I2C_Busy_C();-------------->再调用HAL_I2C_Mem_Write();调用HAL_I2C_Mem_Write()之前,先判断是否busy,如果busy则重新初始化,初始化结束后,再HAL_I2C_Mem_Write();我根据参考的博客在 HAL_I2C_MspInit() 中添加了2行代码;3----在HAL_I2C_Mem_Write()时会busy,
2024-09-12 11:22:07 895
原创 cubemx配置stm32f407vet6的can通信,can发送失败
想要实现发送,需要在MX_CAN1_Init添加。想要接收,需要在MX_CAN1_Init添加。MX_CAN1_Init函数不完全;一直提示can发送error;
2024-08-23 09:58:19 263
原创 pycharm无法导入pyside2模块;“ModuleNotFoundError: No module named ‘PySide2“
出现报错““ModuleNotFoundError: No module named ‘PySide2’””后,看来很多博客,都不能解决,只有这篇博客提供了思路;2).ui转化为.py后,点击运行,报错““ModuleNotFoundError: No module named ‘PySide2’””https://blog.csdn.net/weixin_61891798/article/details/127097989。按照博客的指引,和命令行的提示,我找到了pyside2的包;
2024-08-01 16:56:32 513
原创 f407_demo\f407_demo.axf: Error: L6218E: Undefined symbol assert_param (referred from softtimer.o).
解决方法:添加头文件。
2024-07-10 09:23:33 130
原创 stm32f407VET6 can通信踩坑
2)如图,原理图上在mcu和TJA105连接时,使用0欧姆电阻;硬件工程师给我一块板子,并且和我说,板子上的can通信相关的部分都正常(线序,虚焊这些都没问题);但是硬件工程师没焊接这2个0欧姆电阻,导致mcu的can口信号给不到TJA1075!1)使用已经出货的版本的固件,烧录在这块板子上。(如果can通信有问题,那就是硬件导致的);1)TJA105要5V供电,但实际上没供电,导致TJA105不工作(硬件工程师说 画错了);1)在老版本代码上添加了can.c相关,也许有问题;
2024-05-22 11:51:06 423
原创 cubemx配置stm32f407VET6实现can通信
参考博客:https://blog.csdn.net/weixin_43362027/article/details/132716496。移植canopen的前提是can通信正常,现在添加一下can通信(先用标准帧,250K bit/S的波特率测试)项目上需要把原先的TMC5160电机驱动器替换为购买的电机控制模块(该模块采用canopen通信)3)实现can接收;我实现的业务逻辑是在can接收回调函数中串口打印接收到的can包。can1的时钟在APB1上,APB1的时钟为84MHZ;1)如何计算波特率?
2024-05-15 16:28:08 1015 1
原创 cubemx配置stm32f407VET6实现USB虚拟串口
5)配置USB_DEVICE为communication Device Class(CDC)第一步:在文件 usbd_cdc_if.c中 的 函数添加一行代码用于获取字符串长度;最近做项目需要使用USB,一根数据线连接“mcu的板子”和“电脑”;在usb_device.c中实现业务逻辑“USB数据回显函数”1)仅使用MCU的USB发送数据(注意波特率可以是任意值)电脑上的串口助手通过USB线和mcu的USB通信;接下来的方法是之前一个同事写的,我直接搬运一下;2)测试mcu的USB接收功能。
2024-05-15 13:33:37 746
原创 hal库定时器中断的使用
5)验证:定时器每溢出一次,会触发1次溢出中断,在中断的回调函数中进行串口打印“hello world\r\n”2)定时器3 预分频720,所以72MHZ进行720分频后,频率为100KHZ;即1秒计数100000次;3)定时器3配置为向上计数,自动重装载值为9999;即0.1秒溢出1次;验证定时器中断的回调函数功能;1)cubemx配置定时器3和串口2;4)串口2设置为115200波特率。
2024-05-09 09:19:11 363
原创 c8t6,hal库,pwm输出
(249指的500个计数值的周期内,有250个计数值为低电平,,有250个计数值为高电平,占空比为50%)自动重装载计数值设置为499;即0.5ms一个周期;1MHZ即1秒计数1000000次;自动重装在计数值:499;即1毫秒计数1000次;定时器1通道1发送脉冲;1.cubemx配置。设置分配系数:71;
2024-03-08 14:19:17 453
原创 逻辑分析仪分析硬件spi
如图,数据解析为0000 0001 ,即0x01,和程序一致;发送5个字节:1,2,3,4,5;数据高位在前,低位在后;
2024-03-07 13:00:45 875 2
原创 hal库stm32串口接收不定长数据
进入main.c文件,找到入口函数void mian(void), 在USER CODE BEGIN 2下方开启串口1的DILE中断,并打开DMA接收。打开usart.h文件,在文件开头的USER CODE BEGIN Includes下方添加如下语句。打开uart.c文件,在文件顶部的USER CODE BEGIN 0下方添加下列变量。打开uart.c文件,在文件末尾的USER CODE BEGIN 1下方添加下列函数。在while语句中添加接收查询语句。添加串口及IDLE处理函数。
2024-02-01 14:26:22 982
原创 基于hal库实现stm32f103c8t6裸机项目的“软件定时器”
一,项目背景:优化裸机项目,考虑到硬件资源有限,所以不移植rtos,采用的方案是“软件定时器+状态机”注意点:软件定时器的任务要求短小精悍,要在定时时间到达前运行完毕。原因:未做保存现场和恢复现场。二,下面是cubemx的配置:我还做了其他功能,但是这里仅描述“时钟配置”,“定时器配置”(1)时钟72MHZ(2)定时器2通道1设计要求:主频72MHZ,软件定时器的时基为1ms;定时器参数解读:(2)per:9。
2024-01-31 13:32:44 1273
原创 stm32裸机添加“软件定时器”
软件定时器对应的任务要短小精悍(在定时时间到达之前执行完毕),原因是“只是简单的定时,未做保存现场和恢复现场,所以程序在定时时间到达时仍无执行完毕会导致异常”近期想要优化逻辑程序,想到可以通过软件定时器实现优化。这是一种基于时间片的轮询机制,在裸机项目中这种软件定时器+状态机的方案可以满足基本需求。代码:参考https://blog.csdn.net/qq_26904271/article/details/83833168。
2024-01-30 10:55:17 472
原创 16-1网络编程
UDP:面向报文,特点是数据量大(不关心是否连接成功,只关心下发数据);TCP:面向连接,特点是数据准确(确保连接成功再通信);初级开发不用了解怎么实现协议,只要了解怎么使用;IP地址,端口号(用于标识和哪个服务器对接);通信协议(http,TCP/UDP);
2023-06-04 15:07:50 123
原创 V9.0_增加信号的功能(信号的基本用法)
之前需学习过信号的基本用法;比如通过signal()和自定义的handle()来处理信号; 或者通过kill(pid,9);来杀死指定进程;本次实验的目的是:在使用自定义ls功能时,子进程使用popen实现ls后向共享内存发送子进程的IID号。父进程通过读取共享内存获取子进程的ID号并使用kill杀死子进程,然后父进程退出。父子进程的任务: 子进程实现“ls”,然后把子进程ID发送到共享内存 父进程从共享内存读子进程的ID并使用kill()杀死子进程 运行结果main.cio.cio..h
2023-06-04 11:38:28 146
原创 V8.0_增加共享内存功能
功能:使用自定义delete指令删除指定文件时:子进程执行完删除任务后会调用自定义函数(创建共享内存,向里面写入数据"had delete file"),接着exit();此时因wait()而处于阻塞状态的父进程解除阻塞,并调用自定义函数(打开共享内存读取数据)从共享内存读数据。
2023-06-01 12:15:18 104
原创 V7.0_增加消息队列功能
使用自定义copy功能时,子进程copy结束后向父进程发送消息(通过消息队列)然后exit;此时因wait()而处于阻塞态的父进程终于解除了阻塞并且从队列中读取到消息;
2023-05-30 18:06:35 75
原创 V6.0_增加fifo功能(在使用自定义write指令时,父进程创建fifo并以只读方式打开fifo会导致父进程被阻塞。子进程中读取终端输入的指令并记录在file中,输入QUIT结束文本编辑后,子进)
在使用自定义write指令时,父进程创建fifo并以只读方式打开fifo会导致父进程被阻塞。子进程中读取终端输入的指令并记录在file中,输入QUIT结束文本编辑后,子进程以只写的方式打开fifo,从而解除父进程的阻塞,父进程读取完fifo的消息后结束进程。运行结果:如图,(1)父进程通过(2)创建file并编辑完文本后,通过fifo 子进程向父进程发送消息(88888888),父进程可以接收到(88888888)
2023-05-30 16:25:36 88
原创 V5.0_增加pipe功能(使用自定义creat指令创建文件时,在子进程中创建新文件,创建完成后子进程通过pipe通知父进程“子进程的任务已完成”)
半双工:所以同一时刻要么只能读,要么只能写;
2023-05-30 14:16:19 86
原创 V4.0_增加popen的功能用于实现“ls”
(即:提过popen调用了ls指令后,popen把文件夹下的所有文件都列举出来了,也就是说popen的运行结果为:“file1 io.c io.h main.c run”),popen把运行结果传给fp,通过。//popen把运行结果传递给fp。程序会执行到int ls_file();执行程序,输入./run ls all。
2023-05-30 11:12:09 88
原创 V3.0_用exec族函数替代system()
二,验证“exec族函数允许成功后不会返回,也不会继续执行,而是结束子进程,且子进程的结束状态为0(相当于调用exit(0)结束子进程)”exec族函数允许成功后不会返回,也不会继续执行,而是结束子进程,且子进程的结束状态为0(相当于调用exit(0)结束子进程)(2)exec族函数中的函数调用失败时会设置error并返回-1,然后从源程序调用点接着往下执行。父进程在等待子进程结束,如果子进程结束了,会打印结束状态;创建子进程后,在子进程中调用exec组函数处理事情;子进程结束状态为0;
2023-05-29 21:38:42 668
原创 V2.0-在记事本功能上添加fork和wait
但如果我们对这个子进程是如何死掉毫不在意,只想把这个僵尸进程消灭掉,(事实上绝大多数情况下,我们都会这样想),我们就可以设定这个参数为NULL,就像下面这样:pid = wait(NULL);wait()要与fork()配套出现,如果在使用fork()之前调用wait(),wait()的返回值则为-1,正常情况下wait()的返回值为子进程的PID.如果成功,wait会返回被收集的子进程的进程ID,如果调用进程没有子进程,调用就会失败,此时wait返回-1,同时errno被置为ECHILD。
2023-05-29 15:56:30 693
原创 基于open,read,write,lseek,system实现的记事本
(2)向文件写入数据 ./a.out write file1(注意执行这个命令后会进入死循环不断读取键盘输入的字符,直到键盘输入QUIT才退出)(5)拷贝文件 ./a.out copy file1 file2(这个功能没偷懒,是依赖lseek实现的)(3)展示文件的内容 ./a.out display file1(原理是调用system())(4)删除文件 ./a.out delete file1(原理是调用system())(1)创建文件 ./a.out creat file1。
2023-05-29 14:12:56 92
原创 15-7-线程-线程条件控制实现线程的同步
线程1一直等待,直到线程2发送触发信号后,线程1处理1次业务逻辑(处理结束后,线程1继续等待)实验:利用等待和触发实现“同步”
2023-05-03 11:11:03 62
原创 15-6-线程-死锁
什么是死锁?---因互斥锁使用不当导致其他程序无法运行的现象。(前提条件是有两个锁,当线程A获得1把锁,想要获得另外1把锁,但是线程B已获得了线程A想要获得的那一把锁,同时线程B想要去获得线程A已经获得的那把锁。这会导致线程A和线程B都想拿到对方的那把锁,这导致两个线程不能继续解锁,导致死锁)
2023-05-03 10:30:58 69
原创 15-4-线程-线程同步之互斥量加锁解锁
互斥量:互斥量(mutex)从本质上来说是一把锁,在访问共享资源前对加互斥量(实现加锁),在访问完成后释放互斥量(实现解锁)。加锁后,任何其他试图再次加锁的线程将会被阻塞直到当前线程释放该互斥锁。如果释放互斥锁时有多个线程阻塞,所有在该互斥锁上的阻塞线程都会变成可运行状态,第一个变为可运行状态的线程可以加锁,其他线程将会看到互斥锁依然被锁住,只能回去等待它重新变为可用。在这种方式下,每次只有一个线程可以向前运行。在设计时需要规定所有的线程必须遵守相同的数据访问规则。只有这样,互斥机制才能正常工作。
2023-05-03 09:42:41 1023
原创 15-2-线程-线程的创建,等待,退出
实验:(1)创建线程,向线程传递1个参数,线程调用函数,该函数把传递给线程的参数打印出来。如图,编写了以下代码;并且编译时连接了libpthread.a库;参数一:&t1参数二:NULL,表示新建的线程的属性为默认属性;参数三:fun1,函数指针,该函数是新建的线程所要执行的函数,该函数只能有1个参数,如果想要传递多个参数则需要依赖结构体。参数四:(void *)& param,是传递给fun1函数的实参;(注意:首先要把参数强制转换为指针类型,因为fun1函数的。
2023-05-02 20:20:38 819
原创 15-1-线程-基本介绍
而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。据统计,总的说来,一个进程的开销大约是一个线程开销的30倍左右,当然,在具体的系统上,这个数据可能会有较大的区别。当然,数据的共享也带来其他一些问题,有的变量不能同时被两个线程所修改,有的子程序中声明为static的数据更有可能给多线程程序带来灾难性的打击,
2023-05-02 18:51:08 623
原创 14-5-进程间通信-信号
入门级:(只有信号,没有消息)kill(发送信号);signal(接收信号);高级:(既有信号,又有消息)需要探讨以下几个问题:接收消息:问题1:来信号时怎么处理(怎么绑定)?问题2:来信号时如何读出消息?问题3:信号如何携带消息?问题4:用什么发送?问题5:怎么放入消息?
2023-05-01 20:19:39 800
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人