自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

gzggyg

嵌入式开发

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

原创 在RT-Thread-Studio中添加arm_math库

在RT-Thread-Studio中添加arm_math库

2024-07-04 14:37:07 188

原创 在MCU上调试UDP遇到的两个问题

第2条产生的原因,多个MCU设备是挂在同一个交换机下的,虽然每个MCU设备的IP地址不同,但是MAC地址是相同的。在向上一个设备发送完报文后立马向当前设备发送报文,此时路由器中的MAC地址表还是上一个设备的,当前设备无法收到报文,等待两三秒左右地址表更新之后就能收到报文了。此问题将MAC地址更改为不同地址即可。第1条中问题产生的原因,网络调试助手被防火墙阻止了。表现的现象是可以发送报文到MCU端,但是MCU端发送的报文收不到。

2023-10-08 16:13:46 122

原创 keil项目转换成RT-Thread Studio项目方法

拷贝CubeMX项目文件至上面建好的项目文件夹,注意CubeMX的工程文件不能放在RT-Thread Studio项目的根目录,否则重新生成之后RT-Thread Studio项目会无法识别。由于众所周知的原因,需要将之前由Keil开发的项目转换成RT-Thread Studio项目。如果有报错,可以找到对应的文件或者目录,这些文件在Keil项目的时候是没有被编译的,但是RT-Thread Studio默认是把项目目录下的文件全部编译进去的,就有可能找不到头文件或者依赖,右键选择排除构建即可。

2023-06-29 16:04:33 1409

原创 section的含义和用法

在rtthread中定义了rti_start、rti_end等函数,知道了这些函数的地址,就可以已知的类型对地址自增就可以知道用户定义的函数的地址了。再看rtthread中对section名称的定义就清楚了,按照1、2、3...的顺序命名,地址也自然是按照这个顺序排列的。2.在nrf53832的实现里,使用NRF_SDH_BLE_OBSERVER一类的宏把event handler定义在对应的section内,产生事件之后sdh去调用event handler,实现代码的解耦合。先来一副整体的结构图。

2023-06-24 16:11:59 502

原创 SPI主从通信

于是就尝使用SPI同步传输,nrf52832的SPIS做从机,F407的SPI做主机,都使用DMA传输。由于从机无法主动发送数据给主机,所以主机不管有无数据,都要周期性的启动传输,以保证数据的及时性。双方的数据包的其实4个字节代表长度,接收之后按照这个规则解析就行了。以前用SPI总线控制4094,读取595等器件,MCU都是作为SPI Master,并且SPI Slave的数据长度是固定的,相对容易开发。用SPI做透传的优点是速率可以设置的较快,缺点是没UART那么灵活,需要主机的支持。

2023-06-20 15:30:35 227

原创 NRF52832 UART接收不定长数据

方案参考的是Nordic的libuarte工程,但是我们这里面有soft device,其本身会占用一些外设,比如RTC0,TIMER0等。那我们就只能选择其他外设,这里选用TIMER1和TIMER2。在使用NRF52832做串口透传的时候,示例程序里UARTE,接收长度为1个字节。如果串口接收到长数据(测试了1K),则很容易导致蓝牙发送的超时重启。解决方案:使用PPI功能,使串口具备接收不定长数据的能力。

2023-06-14 17:33:57 856 1

原创 CANOpen DS402伺服电机控制项目总结

有些厂家把状态字的bit9在CANOpen控制的时候是置1的,认为CANOpen就是远程控制,而有些厂家则无此处理。上面的控制方式是周期性的发位置指令给伺服,旧的指令还未到位的时候新指令已经下发,则伺服会立即更新指令,不会等到上一条指令执行完,两条指令中间也就不会有停顿。一共使用过三个厂家的伺服电机,控制字都是一样的,但是状态字各家有自己的处理,有一点小差别。如下是其中一家的文档。PP_MODE的控制是最复杂的,除了要给定位置和速度,还要控制控制字中的bit4和bit5才能更新指令。

2023-06-13 18:03:39 2168 2

原创 深入探究STM32H743 FDCAN的Message RAM

STM32H743 FDCAN的Message RAM研究

2022-07-28 22:39:58 1324 1

原创 调试STM32H743,RTThread&LwIP,踩坑记录

很久之前看过LwIP的一些内容,感觉好复杂。这次一个项目用到了网口,打算结合RT-Thread,移植一下LwIP。鉴于MDK中Compiler 5已经不再更新,此次移植直接基于Compiler 6。因为公司之前有一个很简单的UDP的协议,基本可以直接跑通的,要移植一个自己不太熟的协议栈,心里还是做了很多斗争的。先确定技术路线吧。RT-Thread有官方移植好LwIP,但是公司现在还没有使用RT的那一套环境开发,一直以来用的是CubeMX。CubeMX里RT-Thread和LwIP能单独配置,但是不能生成

2022-05-30 21:02:26 2732 2

原创 STM32H743 standby 模式调试记录

无法进入standby或者进入之后被意外唤醒

2022-03-03 20:54:25 944

原创 关于使用SPI总线读取并转串(74HC165)发生数据移位的问题

关于使用SPI总线读取并转串(74HC165)发生数据移位的问题背景:使用STM32H743主控,通过SPI读取74HC165的数据,74HC165接了7个按键。现象:在所有按键都没按下的时候读取到的数据应该为0x00,按下某个按键对应的bit应该变成1。实际测试发现不按任何按键的时候数据是0x01,按第一个按键的时候读取到0x03,依次类推。按键对应的bit错了一位。原因:SPI的初始化代码如下:void MX_SPI5_Init(void){ hspi5.Insta

2021-04-08 21:26:09 4142 1

原创 STM32更改了程序之后再次下载会无法发现芯片的问题

在调试STM32的过程中会不停的改动优化自己的代码,有时候会出现把改动的代码烧录进单片机之后运行不正常,再次烧录发现调试器连芯片都找不到了。根据自己的经验,出现这种问题的原因可能有:时钟超频,导致芯片被锁。 调用STM32的设备库函数初始化寄存器的时候用了野指针导致芯片被锁。此种情况不一定会导致芯片被锁。这种问题的解决办法:BOOT0拉低,BOOT1拉高,上电用调试器把正确的代码烧录进去即可解锁,之后可以正常烧录了。至于STM32的锁定机制,未有深入研究。...

2020-09-05 16:53:04 1514 1

原创 CAN的显性位与隐性位

CAN显性位:CAN_H与CAN_L的电压差为2V,用0表示。CAN隐性位:CAN_H与CAN_L的电压差为0V,用1表示。总线仲裁的时候显性位胜出,所以ID小的帧会胜出;仲裁段的最后一位远程帧标示,远程帧的时候是1,为隐性位,会失败。所以相同ID的帧数据帧的优先级高于远程帧。帧的起始位为一位显性位,帧结束为7位隐形位。...

2019-11-12 17:00:17 7681

原创 4.canfestival-TimeDispatch

在timer.h中有两个函数需要去实现,setTimer和getElapsedTime。按照函数说明的意思去实现就可以。这里有一个需要考虑的问题,就是void setTimer(TIMEVAL value)中参数value的单位。在源码中多处会用到MS_TO_TIMEVAL(ms)这个宏,这个宏在timerscfg.h中定义为#define MS_TO_TIMEVAL(ms) ((ms) * 1...

2019-10-22 22:24:57 2627 1

原创 3.canfestivel-proceedPDO

设备收到can帧之后就调用解包函数canDispatch,在这个函数里,根据帧ID的不同进行分类处理。void canDispatch(CO_Data* d, Message *m){ UNS16 cob_id = UNS16_LE(m->cob_id); switch(cob_id >> 7) { case SYNC: /* can be a SYNC o...

2019-10-20 21:56:10 1392 1

原创 2.canfestivel-回调函数

当从站收到主站发来的RPDO数据之后,怎么去执行特定的操作呢?只需要编写回调函数并注册到相应的索引对象就可以。索引回调函数的原型在objdictdef.h定义,如下所示typedef UNS32 (*ODCallback_t)(CO_Data* d, const indextable *, UNS8 bSubindex);typedef struct td_subindex{...

2019-10-19 22:32:08 3254 1

原创 1. canfestivel-由对象编辑器生成的对象字典

做了一个IO设备,需要实现CANopen从站,移植的是canfestival。在移植的过程中,CANOpen系列教程对我帮助很大,感谢博主。基于参考以上博客移植好的代码,对源码部分做一些分析。用对象编辑器生成的对象字典,是一对.c/.h的文件。里面把对象字典编辑器里选择的对象和设置的参数都生成好了。自己定义的一些对象,旁边都自动生成了注释,索引和子所引。如下代码所示:UNS8 Write...

2019-10-18 19:49:07 1366 1

原创 Stm32 ADC在DMA中切换不同的采集源

应用背景:一个双通道DO输出芯片,能反馈两个通道的电流,但是只有一个反馈引脚,不同的通道需要用单片机控制切换 。把反馈引脚接到单片机的ADC,然后在程序中进行切换。代码如下:void Adc2_init(void){ ADC_InitTypeDef ADC_InitStructure; ADC_CommonInitTypeDef ADC_CommonInitStruct...

2019-10-11 22:11:23 482 1

原创 关于KEIL(MDK)调试代码下载完直接全速运行且打断点无效的问题

今天优化公司代码。拿到代码之后,用Jlink连上设备,点击调试按钮,下载完成就自动开始全速运行了,观察程序里的tick,也确实在不停的增加,但是在tick中断里打断点,程序无法停止,tick还是在不停的增加。用Jlink、Ulink都是一样的问题。在网上查了很多资料,没有有效的解决办法。后来想起来公司的程序都是分成两部分,一部分是IAP程序,我们也叫做BOOT,另一部分是APP程序。而需要...

2019-10-10 22:19:30 3914

空空如也

空空如也

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

TA关注的人

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