MCU
文章平均质量分 64
微控制器相关内容
星沉地动
简洁是一种美!
展开
-
STM32F407移植OpenHarmony笔记9
继上一篇笔记,已经完成liteos内核的基本功能适配。今天尝试启动OHOS和XTS兼容性测试。原创 2024-02-04 16:40:13 · 1040 阅读 · 0 评论 -
STM32F407移植OpenHarmony笔记8
继上一篇笔记,成功开启了littlefs文件系统,能读写FLASH上的文件了。今天继续研究网络功能,让控制台的ping命令能工作。原创 2024-02-02 18:15:40 · 1098 阅读 · 0 评论 -
STM32F407移植OpenHarmony笔记7
继上一篇笔记,成功启动了liteos_m内核,可以创建线程了,也能看到shell控制台了。今天研究文件系统,让控制台相关文件命令如mkdir和ls能工作。原创 2024-02-01 17:40:12 · 1619 阅读 · 0 评论 -
STM32F407移植OpenHarmony笔记6
继上一篇笔记,编译好STM32的裸机程序,能点亮LED灯了。下一步就是启动liteos_m内核了。原创 2024-01-31 17:40:16 · 645 阅读 · 0 评论 -
STM32F407移植OpenHarmony笔记5
继上一篇笔记,搭建好STM32的编译框架,编译出来的OHOS_Image.bin并不能跑不起来。今天要在bsp里面添加一些代码,让程序能跑起来。原创 2024-01-31 15:50:27 · 637 阅读 · 0 评论 -
STM32F407移植OpenHarmony笔记4
上一篇写到make menuconfig报错,继续开整。make menuconfig需要/device/soc/*下面有对应的Kconfig文件。直接去gitee下载stm32的配置文件拿来参考用。先提取Kconfig文件,后面再添加其它文件。原创 2024-01-30 17:27:35 · 1230 阅读 · 0 评论 -
STM32F407移植OpenHarmony笔记3
接上一篇,搭建完环境,找个DEMO能跑,现在我准备尝试从0开始搬砖。首先把/device和/vendor之前的代码全删除,这个时候用hb set命令看不到任何项目了。/device目录是硬件设备目录,包括soc芯片厂商和board板级支持代码。创建目录规则:“device/{芯片厂商}/{芯片开发板}”。/vendor目录是产品项目定义目录。创建目录规则:“vendor/{产品模组厂商}/{产品模组名称}”。原创 2024-01-30 16:03:27 · 613 阅读 · 0 评论 -
STM32F407移植OpenHarmony笔记2
搭建完开发环境后,我们还要继续工作。官方合作的开发板刚好有STM32F407,我准备试一下开发板的demo,虽然我用的不是他们的开发板。原创 2024-01-24 16:00:21 · 648 阅读 · 0 评论 -
STM32F407移植OpenHarmony笔记1
STM32F407移植OpenHarmony笔记1, 搭建开发环境。原创 2024-01-24 15:16:48 · 642 阅读 · 0 评论 -
MODBUS-TCP协议
modbus-tcp的默认端口号是502,设备端作为TCP服务器监听502端口,主机为TCP客户端主动去连接外设。与RS485一样,主机发起请求,设备返回响应,设备不会主动发送数据。原创 2022-12-12 09:49:49 · 8498 阅读 · 2 评论 -
MODBUS-ASCII协议
MODBUS-ASCII协议应用比较少,主要还是以MODBUS-RTU为主。ASCII帧格式虽然与RTU有所差别,但是功能码和寄存器格式是一样的。原创 2022-12-09 11:02:20 · 7631 阅读 · 0 评论 -
KEIL/MDK中的标准C库函数printf和malloc实现线程安全
在KEIL/MDK的标准库中提供了一组可重载的互斥锁函数,我们可以自行实现这一组函数,来保证C库函数线程安全。原创 2022-08-17 14:21:47 · 2321 阅读 · 3 评论 -
全志F1C100S的BROM研究
全志f1c100s是个性价比很高的芯片,但是对一般人不太友好的是它的资料开放的太少了。网上找不到完整版的用户手册,只能从有限的手册文档和参考代码旁敲侧击,反向猜测。关于它的BROM网上的手册内容很少。原创 2022-03-04 00:33:33 · 2946 阅读 · 0 评论 -
Cortex-M处理器中断向量表
系统复位后中断向量表始终是在0x00000000地址。系统启动后可以对中断向量表进行重定向:SCB->VTOR = vector_addr;原创 2021-12-31 18:06:25 · 3572 阅读 · 0 评论 -
Cortex-M核心寄存器
Cortex-M核心寄存器一共有21个。Cortex-M0没有FAULTMASK,Cortex-M0没有BASEPRI,Cortex-M3/M4/M7寄存器相同。原创 2021-12-31 17:57:57 · 2671 阅读 · 0 评论 -
Cortex-M系列处理器对比
ARM发展至今,已经设计了9代处理器构架,每一代架构又设计了不同的处理器核心。目前市面上主流的微控制器主要还是Cortex-M0,M3,M4和M7。原创 2021-12-31 16:26:40 · 5968 阅读 · 1 评论 -
聊聊MCU的困惑
什么是MCU?MCU和MPU有什么区别?MCU和SOC有什么关系?MCU和单片机有什么关系?原创 2021-12-24 18:11:51 · 3184 阅读 · 1 评论 -
Ambiq Apollo3使用内建SBL进行固件升级
Apollo3系列MCU出厂时内置了一段代码,官方名叫:SBL(Secure BootLoader)这段代码在片上FLASH的0x0000地址,占用空间48KB。这就是为什么我们在KEIL里面看到的IROM起始地址是0xC000。这段代码实现了开机通过UART、I2C、SPI下载用户程序的功能,同时还实现了IAP固件升级功能。原创 2021-12-16 14:23:17 · 1310 阅读 · 0 评论 -
[蓝牙]nRF52840+S340协议栈无法被iPhone连接的问题
从官方SDK例程中,删掉了peer_manger模块,蓝牙设备不支持配对。导致iPhone上面的测试APP无法正常连接到设备。通过分析日志,发现手机与设备的connect过程其实是成功了。只不过connect之后,手机端又发起了一些其它未知请求,没有被设备端处理,导致手机端又主动断开了连接,然后报错。查阅资料后,解决方案如下:在on_ble_evt函数中添加以下代码:static void on_ble_evt(ble_evt_t const * p_ble_evt){ ......原创 2021-08-23 15:47:36 · 513 阅读 · 0 评论 -
HC32F460外设中断用法
华大HC32F460的外设中断和STM32相比也是非常的个性!!!先来看看HC32F460的启动文件startup.s,如下图所示:从这个文件可以看出来,它定义的中断向量表里,对中断名有只一个编号,没有写明具体是哪个外设的中断。这就非常有意思,因为HC32F460的外设中断的中断号是可以“任意”编程的,不过这个“任意”也并不是全部128个中断都可以随便选择,也有一定的小规则,查看手册INTC章节,有如下所示的表格:比如GPIO中断,只能选择0-37或者128。下面就来看看怎么把外设中断和原创 2021-07-07 16:25:33 · 5736 阅读 · 1 评论 -
HC32F460串口驱动的问题
HC32F460片上有4路串口,驱动使用了HC32官方的库函数,一般初始化流程如下代码,一开始验证没有问题,能正常收发数据。//HC32F460串口初始化{ stc_usart_uart_init_t init; memset(&init, 0, sizeof(init)); init.enClkMode = UsartIntClkCkNoOutput; init.enClkDiv = UsartClkDiv_1; init.enDataLength= U原创 2021-06-07 16:28:05 · 4120 阅读 · 0 评论 -
华大HC32F460看门狗的使用
由于STM32涨价,厂家纷纷换了国产MCU,现在用华大HC32系列已经是潮流了。用惯了STM32,突然换其它MCU,总是要踩一些坑,来看看HC32的看门狗吧。HC32F460有两个看门狗:SWDT和WDTSWDT使用的是内部专用RC时钟源,大约为10KHz,精度低,不受外部晶振和PLL的影响,可靠性较高WDT使用的是系统时钟PCLK3,精度高,但如果晶振或PLL故障,看门狗会停止计数。做为系统死机守护的看门狗,建议选用SWDT。SWDT是16位递减计数器,计数值只能选择:256、4096原创 2021-05-21 09:53:37 · 5045 阅读 · 4 评论 -
RS485-MODBUS协议总结
简介Modbus是一种串行通信协议,是Modicon公司(现施耐德电气)于1979年发表的。目前Modbus已经成为工业领域通信协议的业界标准,并且是工业电子设备之间常用的连接方式。Modbus协议的通信机制是主从模式,在一条链路上可以挂载多个设备,其中有且只有一个主设备,其余设备均为从设备。在通信过程中,所有命令均由主设备发起,从机设备只能被动接收并响应主设备发起的命令。Modbus协议的数据帧格式有两种类型:一种是ASCII类型,数据类型使用字符串输出。一种是RTU类型,数据类型使用原创 2021-02-26 12:54:49 · 3770 阅读 · 0 评论 -
在Keil MDK中无法使用gmtime函数进行时间戳转换
硬件平台STM32,软件平台Keil MDK 5.18由于项目中需要用到UNIX时间戳和日历的来回转换,于是想到C库函数<time.h>里面有现成的函数可以使用。于直接使用mktime和gmtime两个函数进行时间戳转换,前者把日历转为时间戳,后者把时间戳转为日历。但是程序运行起来发现,gmtime得到的日历数据为乱码!!!经过调试才发现,这个函数返回值是NULL啊!!!查看反汇编代码,简直惊呆,这是什么鬼操作?汇编代码没有函数跳转,取而代之的是MOVS R0, #0原创 2020-12-24 14:17:14 · 2553 阅读 · 0 评论 -
如何从HardFault异常中定位到错误代码
调试Cortex-M处理器的程序,最常见的异常就是HardFault错误,这种错误一般是因为非法访问内存或者非法指令引起的,比如写空指针,程序跑飞等情况。但常常出现HardFault异常后,难以直接定位到出错代码,只能通过读取栈顶数据来定位错误代码。那么发生HardFault异常的栈顶数据该怎么解读?在Cortex-M相关文档中异常模型章节可以找到一张图表,下图是Cortex-M4当异常发生时,硬件会自动往栈顶写入的数据结构。从图中可以看出Cortex-M4有两种模式,一种是带FPU指针的结构,另原创 2020-12-18 16:43:28 · 2430 阅读 · 0 评论 -
LWIP使用TCP自带的KEEPALIVE功能
TCP_KEEPALIVE功能可以用来检测或保持基于TCP协议的客户端和服务器之间的链路畅通。当客户端和服务器之间长时间没有数据通信时,协议栈会发送一个特殊的空数据包,用来检测链路是否正常。接收到这个空数据包的一方会自动发送一个应答包,表示网络链路通信正常。发送方如果在规定的时间内没有收到应答包,则表示链路中断,自动断开TCP连接,并通知应用层TCP连接断开。整个交互逻辑完全在协议栈内完成,不需要在应用层做额外的工作,比较方便。应用示例:如下图所示,两个交换机中间的网线损坏,导致网络原创 2020-12-01 17:10:51 · 6297 阅读 · 5 评论 -
电子称专用ADC芯片HX711驱动
简介HX711是一个用于电子称的ADC芯片,分辨率为24bit,内置2个通道的低噪放大器,可选增益32/64/128倍。通道A可选增益64倍或128倍。当增益为64倍时,满量程为±40mV;当增益为128倍时,满量程为±20mV。通道B固定增益32倍。满量程为±80mV。通信HX711与MCU通信采用的是2线串行数据通信,一条时钟线(PD_SCK),一条数据线(DOUT)。时序和SPI类似,但不是标准的SPI协议。它要求每次通信至少25个时钟,至多27个时钟。前面24个时钟传送ADC原创 2020-11-23 09:10:01 · 3965 阅读 · 0 评论 -
LWIP+ENC28J60长时间运行后无法访问外网服务器
一台设备,硬件使用STM32+ENC28J60,协议栈使用LWIP-2.1.2版本。作为TCP客户端与外网的服务器通信,正常运行了约2个月后,出现出法连接服务器的故障,查看UART日志发现:使用lwip的函数tcp_connect建立连接,返回成功。但在等待连接成功的回调时,发生了error异常,错误代码是ERR_ABRT(-13),一般表示连接超时。1.重新插拔网线,可以正常检测到网线断开和连接,说明网口芯片工作正常,网口的绿灯和黄灯也正常点亮。2.使用同局域网的电脑调用ping命令,可以原创 2020-11-17 09:53:27 · 1204 阅读 · 1 评论 -
FM17550读不到身份证UID的问题
项目需要读身份证UID,用的是复旦微FM17550芯片,这款芯片封装是QFN32,管脚兼容RC522、SI522。RC522只支持ISO/IEC-14443-A类卡片,FM17550同时支持A类和B类,身份证是ISO/IEC-14443-B类卡片。软件驱动用的是复亘微官方提供的DEMO程序,该程序是基于STM32F103平台。简单更换GPIO和SPI接口后,移植到STM32F429平台。测试能读到A类卡的UID,但刷身份证没有反应,ReaderB_Request返回244(FM175XX_TIM原创 2020-10-16 10:25:07 · 2876 阅读 · 5 评论 -
经过验证的GPIO模拟I2C时序代码
使用STM32的GPIO模拟I2C总线时序,GPIO设置为开漏模式,SDA和SCK外部必须使用上拉电阻,一般是4.7K。开漏模式的好处是,可以同时读取输入电平,而无需切换输入/输出模式。注意事项:在开漏模式输出高电平,是释放总线,从机可以拉低;而输出低电平,则是锁住总线,从机无法拉高。下面是代码:/******************************************************************************* I2C驱动(GPIO模拟)*原创 2020-09-22 12:04:24 · 866 阅读 · 0 评论 -
使用RC522(SI522)写UID卡0扇区0块
在淘宝买的UID白卡,可以使用特殊指令写0扇区0块,达到修改卡号的目的。一开始淘宝白卡各类繁多,没搞明白,查了查以下几个关键词:IC卡:普通的S50卡,0扇区0块不可更改。UID:0扇区0块可以更改(使用特殊指令)。CUID:0扇区0块可以更改(使用标准扇区读写指令)。FUID:0扇区0块可以更改(与UID类似,但只能写一次)。手上刚好有一块SI522的板子,SI522据说完全兼容MFRC522,拿来测试。通过查阅资料,得知写UID的流程是这样的:#1.寻卡send:2.原创 2020-07-03 14:40:01 · 10861 阅读 · 2 评论 -
JHM3000体温传感器驱动
因2020疫情影响,国内突然就冒出来一堆做体温计的厂商。。。硬件平台:nRF52832 + JHM3000JHM3000是个单线通信的体温传感器芯片,线性度较好,校准后精度可达0.1度。主要问题是通信是单IO输出,芯片上电后,IO就会不停地输出脉冲信号,需要MCU计算脉宽来解码数据。每个采样周期为:2.8ms间隔 + 6ms数据传输相邻两个高脉宽之比决定数据类型,START=3...原创 2020-04-21 08:35:30 · 1599 阅读 · 0 评论 -
嵌入式软件编程规范(C语言)
〇、前言代码编程我认为也是一门艺术,优美的代码使人赏心悦目。然而编程规范并没有唯一的行业标准,就像windows和linux的代码各具风格。本文是作者本人在多年嵌入式软件开发中所总结出的一些经验,仅作读者参考。一、排版格式0.在同一个项目中的所有代码应保持一致的代码风格,引用第三方库文件源码的除外。1.代码行首缩进使用TAB键,TAB宽度设置为4个字符。2. 一条语句占一行,不要把多条...原创 2020-03-09 10:23:16 · 2346 阅读 · 0 评论 -
I2C接口读取MPU9250磁力数值
一开始拿到芯片手册云里雾里,根本没有找到关于磁力数据的寄存器,结果上网一查才知道,这芯片竟然是个胶水芯片。。。MPU9250内部是MPU6050和AK8963两个芯片合并在一起的,感觉傻傻的。内部的AK8963是负责三轴磁力传感器采样的芯片,它通过I2C总线与MPU9250连接在一起。如上图所示,MPU9250还集成了一个I2C主机控制器。默认情况下MPU9250用它的I2C主机控...原创 2020-01-13 16:27:25 · 5009 阅读 · 1 评论 -
EC20模块内置协议栈的开发笔记
本文主要记录如何通过UART接口发送AT指令进行网络连接。前言EC20是4G全网通模块。从手册上看类似的模块应该还有EG9x和EM05硬件硬件上使用一路UART接口与模块通信,UART接口默认使用115200波特率。模块上电就会启动,可以通过拉低RESET管脚对模块进行复位操作。软件AT命令的格式:发送方是以AT开头0x0D结尾的字符串,格式比较统一。模块响应是...原创 2019-10-29 16:25:09 · 5391 阅读 · 0 评论 -
BM817模块内置协议栈的开发笔记
BM817和U8300C是非常相似的4G全网通模块;AT指令初始化流程也几乎相同,可以参照U8300C的使用方法。重点说一下不同之处:1.设置模块搜网模式指令是:AT+BMMODODR=11此处的值定义见手册:2.此模块注册到电信HDR网络时使用的指令集会不同。通过模块上报的^MODE: 2状态来决定通用指令集,当状态值为2,4,8时模块使用3GPP2指令模式。此模式:A...原创 2019-10-28 16:54:17 · 1128 阅读 · 0 评论 -
U8300W模块内置协议栈的开发笔记
本文主要记录如何通过UART接口发送AT指令进行GPRS网络连接。前言U8300W是LTE制式的4G网络模块,支持移动和联通4G网络。类似的模块的还有U8300C、U7500、C5300。U8300C是支持电信4G的全网通模块。U7500是只支持联通3G模块。C5300是只支持电信3G模块。这几个模块的开发方式是一样的,支持的AT命令也都差不多。硬件硬件上使用一路...原创 2019-10-24 09:28:13 · 2318 阅读 · 2 评论 -
SIM800模块内置协议栈的开发笔记
本文主要记录如何通过UART接口发送AT指令进行GPRS网络连接。前言SIM800是GSM制式的2G网络模块,支持移动和联通2G网络。类似的模块的还有SIM900和SIM2000,SIM2000是CDMA制式的模块,仅支持电信2G网络。这三个模块的开发方式是一样的,支持的AT命令也都差不多。但是2019年了,2G模块基本也属于淘汰级别的产品了。硬件硬件上使用一路UAR...原创 2019-10-17 12:52:04 · 2100 阅读 · 1 评论 -
EPT分区表
对,你没有看错是EPT,不是GPT,也不是MBR分区表!什么是EPT,目前根本没有EPT分区表,EPT是我自定义的一种分区表格式。EPT是介于MBR和GPT之间的一种分区表格式,比MBR支持更多的分区,比GPT更少的开销。一个MBR只能记录4个分区,局限比较大;GPT设计得“过于”复杂,在单片机等小系统中使用不太方便,特别是GUID的引入,一个表项数据太长了。于是我在嵌入式小系统项原创 2016-05-18 11:59:58 · 709 阅读 · 0 评论 -
DS28E01典型应用及破解方法
DS28E01一般应用在加密保护,防止产品被轻易copy盗版。注意这里说的是“轻易”而不是“阻止”,因为任何加密芯片都不能阻止盗版,只是增加了破解的复杂度而已!加密与解密永远都是矛与盾的关系,此增彼长,无穷无尽。简单介绍DS28E01:DS28E01通过1条单总线与MCU通信,单总线不多说了,要求时间非常严格,精确到us级别。DS28E01有四个存储区:原创 2016-05-19 09:15:12 · 14138 阅读 · 11 评论