首页 文章 精选 留言 我的

精选列表

搜索[stm32],共117篇文章
优秀的个人博客,低调大师

STM32/GD32芯片信息

因为需要自动适配芯片进行系统配置,所以我们有必要通过读取一些系统寄存器来获取必要信息。 我们的代码需要兼容STM32F1/GD32F1/STM32F0/STM32F4 代码如下: #ifdef STM32F0XX void* p = (void*)0x1FFFF7AC; #else void* p = (void*)0x1FFFF7E8; #endif memcpy(ID, p, ArrayLength(ID)); CPUID = SCB->CPUID; uint MCUID = DBGMCU->IDCODE; // MCU编码。低字设备版本,高字子版本 RevID = MCUID >> 16; DevID = MCUID & 0x0FFF; _Index = 0; #ifdef STM32F0XX FlashSize = *(__IO ushort *)(0x1FFFF7CC); // 容量 #else FlashSize = *(__IO ushort *)(0x1FFFF7E0); // 容量 #endif 各常见芯片信息如下: STM32F030C8T6 SmartOS STM32F030C8 48MHz Flash:64k RAM:8k DevID:0x0440 RevID:0x2000 CPUID:0x410CC200 ARM ARMv6-M Cortex-M0 R0p0 ChipID:55-00-3E-00-04-57-32-4D-39-35-34-20 Heap :(0x200009a0, 0x200011a0) = 0x800 Stack:(0x200011a0, 0x20002000) = 0xe60 GD32F130C8T6 SmartOS GD32F130C8 48MHz Flash:64k RAM:8k DevID:0x0410 RevID:0x1303 CPUID:0x412FC231 ARM ARMv7-M Cortex-M3 R1p2 ChipID:26-49-31-39-31-33-30-32-32-32-33-32 &I1913022232 Heap :(0x200009a0, 0x200011a0) = 0x800 Stack:(0x200011a0, 0x20002000) = 0xe60 STM32F051C8T6 SmartOS STM32F030C8 48MHz Flash:64k RAM:8k DevID:0x0440 RevID:0x2000 CPUID:0x410CC200 ARM ARMv6-M Cortex-M0 R0p0 ChipID:22-00-21-00-11-57-36-41-36-33-32-20 Heap :(0x200009a0, 0x200011a0) = 0x800 Stack:(0x200011a0, 0x20002000) = 0xe60 GD32F150C8T6 SmartOS GD32F150C8 72MHz Flash:64k RAM:8k DevID:0x0410 RevID:0x1303 CPUID:0x412FC231 ARM ARMv7-M Cortex-M3 R1p2 ChipID:8F-14-31-39-31-33-30-32-32-32-33-32 8F141913022232 Heap :(0x20000678, 0x20000e78) = 0x800 (2k) Stack:(0x20000e78, 0x20002000) = 0x1188 (4k) STM32F103VET6 SmartOS STM32F103VE 72MHz Flash:512k RAM:64k DevID:0x0414 RevID:0x1001 CPUID:0x411FC231 ARM ARMv7-M Cortex-M3 R1p1 ChipID:38-FF-D4-FB-31-4E-36-30-36-66-01-43 Heap :(0x20000a30, 0x20004a30) = 0x4000 Stack:(0x20004a30, 0x20010000) = 0xb5d0 GD32F103VET6 SmartOS GD32F103VE 120MHz Flash:512k RAM:64k DevID:0x0414 RevID:0x1309 CPUID:0x412FC231 ARM ARMv7-M Cortex-M3 R1p2 ChipID:46-86-31-36-38-37-30-31-01-02-03-04 F�168701 Heap :(0x20000a30, 0x20004a30) = 0x4000 Stack:(0x20004a30, 0x20010000) = 0xb5d0 GD32F103VKT6 SmartOS GD32F103VK 120MHz Flash:3072k RAM:96k DevID:0x0430 RevID:0x1309 CPUID:0x412FC231 ARM ARMv7-M Cortex-M3 R1p2 ChipID:2A-58-36-35-34-31-31-33-32-30-32-34 *X6541132024 Heap :(0x20000a30, 0x20004a30) = 0x4000 Stack:(0x20004a30, 0x20018000) = 0x135d0 未解决问题: 1,有人说F0的ID只有32位,这个没有找到确切资料 2,GD芯片F130/F150没有读取得到DevID和RevID,而同为F0固件库的F030可以 3,STM32F103和GD32F103还有GD32F130/F150都可以通过0x1FFFF7E0读取得到内置闪存大小,而STM3F030不行,是不是因为这个是M3地址,而M0地址不同?如果130/150使用F0库缺使用M3地址,使用起来就麻烦了。 4,GD32F130/GD32F150上中断向量表映射到RAM的0x20000000失败,调用SYSCFG_MemoryRemapConfig配置SYSCFG->CFGR1为SYSCFG_MemoryRemap_SRAM后再读取发现没有生效,系统仍然使用Flash上的中断向量表。 我不相信神话,我只相信汗水!我不相信命运,我只相信双手! 分类: 物联网 本文转自大石头博客园博客,原文链接:http://www.cnblogs.com/nnhy/p/chip_id.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

STM32/GD32上内存堆栈溢出探测研究

无数次遭受堆栈溢出折磨,随着系统变得复杂,故障点越来越难以查找! 主要溢出情况如下: 1,一般RAM最后两块空间是堆Heap和栈Stack,堆从下往上用,栈从上往下用,任意一个用完,都会进入对方的空间 2,如果栈用完,进入堆的空间,这个时候系统是不会有任何异常的,也就是说,栈底没有什么意义。除非堆和栈指针重叠,否则大家相安无事,尽管栈用了堆的 3,如果栈用完进入堆,并且还碰到了堆的空间,这个时候系统仍然没有异常,但是堆栈会相互修改数据。最悲剧的就是栈里面保存的然会地址lr,一旦被堆指针修改,返回的时候就会跳到别的地址空间去了。绝大多数时候是这种情况,并且大多数跳到无效空间去。你应该感谢它跳到无效空间,让你马上发现错误。否则堆栈互相穿透而不报错,然后系统工作出现数据错乱,到时候看你想撞头还是想跳楼! 4,使用Keil的微库,malloc要用到堆空间,如果堆空间用完,再malloc的时候得到空指针,但是不会报错。然而,如果使用C++的new,这个时候会报错! 因为主线程和中断处理的存在,随时可能分配释放内存,这就导致了问题随时可能发生!非常难检查问题所在! 因此,SmartOS v2.5增加了内存堆栈溢出探测模块 声明: #ifdef DEBUG void* operator new(uint size); void* operator new[](uint size); void operator delete(void * p); void operator delete [] (void * p); #endif 实现: extern uint __heap_base; extern uint __heap_limit; void* operator new(uint size) { debug_printf(" new size: %d ", size); void * p = malloc(size); if(!p) debug_printf("malloc failed! size=%d ", size); else { debug_printf("0x%08x ", p); // 如果堆只剩下64字节,则报告失败,要求用户扩大堆空间以免不测 uint end = (uint)&__heap_limit; if((uint)p + size + 0x40 >= end) debug_printf(" + %d near HeapEnd=0x%08x", size, end); } assert_param(p); return p; } void* operator new[](uint size) { debug_printf(" new size[]: %d ", size); void * p = malloc(size); if(!p) debug_printf("malloc failed! size=%d ", size); else { debug_printf("0x%08x ", p); // 如果堆只剩下64字节,则报告失败,要求用户扩大堆空间以免不测 uint end = (uint)&__heap_limit; if((uint)p + size + 0x40 >= end) debug_printf(" + %d near HeapEnd=0x%08x", size, end); } assert_param(p); return p; } void operator delete(void * p) { debug_printf(" delete 0x%08x ", p); if(p) free(p); } void operator delete[](void * p) { debug_printf(" delete[] 0x%08x ", p); if(p) free(p); } 通过重载new/delete实现,并且带有64字节提前预测功能!在堆即将用完之前预警! 我不相信神话,我只相信汗水!我不相信命运,我只相信双手! 分类: 物联网 本文转自大石头博客园博客,原文链接:http://www.cnblogs.com/nnhy/p/memory.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

【STM32 .Net MF开发板学习-16】Zigbee遥控智能小车

Zigbee技术目前在物联网领域和RFID一样,受关注度非常高。日前中科院上海微系统与信息技术研究所、无锡物联网产业研究院等传感器网络标准工作组成员单位联合发布了名为VW628、WSNS1_SCBR的两款中国自主知识产权的无线传感网SoC芯片,其中WSNS1_SCBR为中国首款符合IEEE802.15.4g标准的验证型全集成传感网节点SoC芯片。 其实封装好的Zigbee模块,使用起来和操作串口一样,特别是我们把其通信模式设置为透明传输模式,这时候我们已经感觉不到是在用Zigbee模块,而觉得是在用一条串口线。在之前写的《Zigbee在.Net Micro Framework系统中的应用》博文中相对详细的介绍了Zigbee相关模块的应用,感兴趣的网友,可以参考一下。 单个的Zigbee模块非常小,其串口管脚为TTL电平,需要直接和MCU相连,具体接线管脚如下(简便期间,我们只接4根管脚): 序号 Zigbee模块 红牛开发板 1 3(RX0) PA2(USART2_TX) 2 4(TX0) PA3(USART2_RX) 3 6(GND) GND 4 7(VCC) 3.3v 开发板上的控制程序如下(非常简单,就是串口接收和小车控制程序): //打开串口,并设置zigbee模块为透明传输模式 serial =newSerialPort("COM2", 115200,Parity.None, 8,StopBits.One); serial.Open(); serial.DataReceived +=newSerialDataReceivedEventHandler(serial_DataReceived); stringstrCommand ="---2-"; byte[] byteData = System.Text.Encoding.UTF8.GetBytes(strCommand); serial.Write(byteData, 0, byteData.Length); //读取数据 staticvoidserial_DataReceived(objectsender,SerialDataReceivedEventArgse) { if(serial.BytesToRead > 0) { byte[] bytData =newbyte[serial.BytesToRead]; serial.Read(bytData, 0, bytData.Length); serial.Write(bytData, 0, bytData.Length); stringKeyName =""; switch(bytData[0]) { case48://'0' KeyName ="Forward"; MoveForward(); break; case49://'1' KeyName ="Left"; MoveLeft(); break; case50://'2' KeyName ="Right"; MoveRight(); break; case51://'3' KeyName ="Back"; MoveBack(); break; case52://'4' KeyName ="Stop"; MoveStop(); break; } Debug.Print(KeyName); } } 上面的程序进行了简化,关于小车PWM控制部分的代码,请参考我以前写的博文《用PWM驱动智能小车》及《红外遥控智能小车》。 为了便于控制,我们需要在PC上编写一个最简单的串口发送程序,以控制智能小车的运转,相关代码如下: //串口 SerialPortserial =null; publicfrmMain() { InitializeComponent(); serial =newSerialPort("COM1", 115200,Parity.None, 8,StopBits.One); serial.Open(); stringstrCommand ="---1-"; byte[] byteData = System.Text.Encoding.UTF8.GetBytes(strCommand); serial.Write(byteData, 0, byteData.Length); } privatevoidfrmMain_FormClosed(objectsender,FormClosedEventArgse) { serial.Close(); } privatevoidbtnForward_Click(objectsender,EventArgse) { serial.Write("0"); serial.DiscardInBuffer(); } privatevoidbtnLeft_Click(objectsender,EventArgse) { serial.Write("1"); serial.DiscardInBuffer(); } privatevoidbtnRight_Click(objectsender,EventArgse) { serial.Write("2"); serial.DiscardInBuffer(); } privatevoidbtnBack_Click(objectsender,EventArgse) { serial.Write("3"); serial.DiscardInBuffer(); } privatevoidbtnStop_Click(objectsender,EventArgse) { serial.Write("4"); serial.DiscardInBuffer(); } 运行后的界面如下: 单击相关按钮,如果不出意外的话,在Zigbee通信范围的智能小车应该已经动起来了。 相关控制视频如下: http://video.sina.com.cn/v/b/40292033-1804832611.html (1)、小车底盘 http://item.taobao.com/item.htm?id=7218838776 (2)、四路直流电机驱动器 http://item.taobao.com/item.htm?id=7218717808 (3)、.NET Micro Framework开发板 http://item.taobao.com/item.htm?id=7117999726 注:需要红牛开发板固件在V1.0.0以上 本文源码1:http://www.sky-walker.com.cn/yefan/MFV40/SourceCode/PCZigbee.rar 本文源码2:http://www.sky-walker.com.cn/yefan/MFV40/SourceCode/ZigbeeCar.rar MF快速参考:.NET Micro Framework快速入门 MF中文讨论组:http://space.cnblogs.com/group/MFSoft/ 微软官方论坛:MSDN微软中文技术论坛(.NET Micro Framework) 开发板简明手册:http://blog.sina.com.cn/s/blog_6b938f630100kh0k.html 【低价开发板】http://item.taobao.com/item.htm?id=7117999726 本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/411006,如需转载请自行联系原作者

优秀的个人博客,低调大师

【物联网智能网关-16】成功移植SQLite(STM32 .NET MF平台)

前言 .NET Micro Framework系统官方代码是不支持任何数据库的,这对一些具有用户管理的Web Server、RFID数据采集和复杂的手持机应用来说是非常不方便的。 很早就知道了SQLite,但是一直没有深入研究,随着目前移植的.NET Micro Framework系统越来越成熟,用户对数据库支持的呼声也越来越高,迫切需要一个数据库平台了。考虑到移植难度和代码大小,最初原打算把YFIOs系统中的内存YFIODB数据库修改为文件版本,这样移植是最快的,代码也比较小,但是缺点是比较明显的,不支持Select等相关的SQL语句,这对熟悉数据库应用的用户来说,还需要重新了解数据库的操作方法,还不如用文件来实现了。 在这个过程中,也了解了其它的嵌入式数据库,如FastDB、Berkeley DB等开源嵌入式数据库,但其用户群和知名度远比不上SQLite,考虑到物联网中间件本身就是一个框架和平台,供用户二次开发,用户越熟悉的技术就应该优先选择。 确定了要移植SQLite数据库,但是又引出一个问题,是移植SQLite最新的版本?还是以前相对代码较小的版本?这着实让我踌躇了良久。 SQLite V2x和V3x比较 项目 V2.8.17 V3.7.15 API接口个数 44 207 源文件个数 44 89 源代码字节数 1.32M 4.0M Win32 dll库大小 209K 591K 文本编码支持 UTF-8或iso8859 UTF-8、UTF-16 二进制数据(Blob) 不支持 支持 行编号 32字节 64字节 并发性 多读,单写 改良的并发性 .NET Micro Framework的核心代码也不过300K左右,如果支持一个比自己核心还大的多的数据库,真有点小马拉大车的感觉,所以在满足基本功能的基础上(以前我比较担心V2x版本的国际化应用,比如是否支持中文),代码大小是我最关注的。 在Windows平台上对SQLite V2.8.17进行测试后,决定移植V2x版本的SQLite(当然后续不排除再移植3.0版本),移植成功后,release版本的 SQLite的大小大概130K左右。 SQLite V2x和V3x .NET Framework开发 考虑到.NET Micro Framework是.NET框架,所以最初研究的是System.Data.SQLite.dll库,后来发现,一是System.Data.SQLite.dll封装的太过复杂,二是System.Data.SQLite.dll对.NET Framework的框架非常依赖,并且针对不同平台,很难做到直接拷贝就可以使用(必须要安装),三是没有支持SQLite V2x的版本。 所以最后还是决定用Interop的方式直接访问Win32 的 SQLite.dll。网上搜索了一下,有关于SQLite3的相关示例,SQLite V2x的就没有了。所以先研究了一下SQLite3的接口应用,然后根据C++相关的接口定义,反推了一下SQLite V2x的C#接口。 在Windows .NET Framework平台测试SQLite V2x接口(如下图)没有问题的情况下,才开始进行.NET Micro Framework 平台下的SQLite V2x的移植。 SQLite V2x .NET Micro Framework移植 理论情况下,只需要对OS.c代码中的接口进行.NET MF的实现即可(标准的OS.c文件已经支持Windows,UNIX、Mac OS平台)。但实际移植发现,远没有这么简单。 (1)、SQLite代码都是标准的C语言,但是OS.c中需要调用.NET MF本身的C++代码操作接口,所以SQLite所有源码的c扩展名一律修改为cpp接口,采用cpp编译器进行编译,但是这样修改后,会出现很多编译错误,大都是类型转换的错误。 (2)、.NET Micro Framework平台不支持(或不建议)直接采用标准的string.h、ctype.h、math.h和stdio.h等头文件定义的函数。.NET Micro Framework代码中已经有部分字符串操作的实现,但是为了实现SQLite的正确编译,还必须自己补全相关操作函数。时间、文件等操作函数,也需要转换为.NET Micro Framework平台下的,或者自己实现。 (3)、内存分配相关函数.NET Micro Framework有两类,一种就是private_开头的函数,另外就是TinyCLR支持的内存操作函数,由于二者使用的堆空间不同(private_开头的操作Custom_Heap,这个一般都比较小),所以我调试的时候采用private_开头的函数,实际应用则是TinyCLR内存操作函数。把SQLite内存相关操作的函数,修改为.NET Micro Framework的。 (4)、由于.NET Micro Framework底层代码对文件的操作相对简单,所以SQLite产生的临时文件,我是在上层C#代码中进行清除的。 (5)、锁操作,.NET Micro Framework底层是无法对文件进行锁定操作的,考虑到.NET Micro Framework本身的特点(单进程,多线程),所以在上层C#代码中进行了简单的锁实现(该锁读写不能同时)。 (6)、SQLite指针应用的非常多,稍有不慎,系统就会出异常,所以在移植过程中,一定要研究透各种接口指针的实际含义(比如定义char ***p这类指针,我以前就很少遇到) ,否则调试过程将是一个噩梦。 SQLite.NET MF应用开发 .NET MF C#接口又进行了封装,一是接口尽可能和System.Data.SQLite.dll兼容,二是做一些必要的内存释放和其它处理(如系统格式化,创建临时目录,磁盘刷新等等)。 其实对相对简单的嵌入式应用来说,数据库无非就是建表,添加和修改数据,删除,获取表数据而已,而这些功能都可以通过SQL语句进行实现,所以说功能多,但是接口却很简单(如下图所示)。 测试代码如下: public static void Main() { string dbPath = "\\ROOT\\mftest.db"; using (SQLite db = new SQLite(dbPath)) //":memory:")) { //创建表 db.ExecuteNonQuery("CREATE TABLE student(id INTEGER, name VARCHAR(20), sex VARCHAR(2));"); //插入数据 db.ExecuteNonQuery("INSERT INTO student VALUES(1, '小红', '女');"); db.ExecuteNonQuery("INSERT INTO student VALUES(2, '小李', '男');"); db.ExecuteNonQuery("INSERT INTO student VALUES(3, '小明', '男');"); //读取表 YFDataTable table = db.ExecuteQuery("SELECT * FROM student"); // WHERE name = '小李';"); string info = ""; foreach (YFColumn col in table.Columns) { info += col.Name + " "; } Debug.Print(info); foreach (YFDataRow row in table.Rows) { Debug.Print(row[0].ToString() + "," + row[1] + "," + row[2]); } } Thread.Sleep(Timeout.Infinite); } 运行调试的场景如下图所示: ---------------------------------------------------------------------- MF简介:http://blog.csdn.net/yefanqiu/article/details/5711770 MF资料:http://www.sky-walker.com.cn/News.asp?Id=25 相关硬件:http://www.sky-walker.com.cn/Products.asp?Id=24 本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/1119476,如需转载请自行联系原作者

优秀的个人博客,低调大师

基于STM32设计的SD卡数据读取与上位机显示系统

简介:本研究的主要目的是基于STM32F103微控制器,设计一个能够读取SD卡数据并显示到上位机的系统。SD卡的数据扇区读取不仅是为了验证存储设备的性能,还为了提高嵌入式系统的数据处理与存储能力。通过SDIO接口实现与SD卡的高速通信,并将存储在SD卡上的数据通过串口传输至上位机,能够实现数据的显示与分析。SD卡采用的是工业级SD卡,型号为CSNP4GCR01-DPW,支持工业温度范围和内置纠错功能,适合在恶劣环境下使用。

优秀的个人博客,低调大师

用 STM32 搞清楚 FreeRTOS 的任务上下文到底是什么

FreeRTOS 的上下文是一个细节特别多的事情,为了便于搞清楚原理,我们暂且不掺杂诸如 TrustZone、FPU 等一些其他特性,但这并不代表这些细节不属于上下文的一部分,而是我们故意先搁置它们以便简化这部分内容,使我们能够聚焦于主线,这样对初学者能够更好地入门,要想看明白这篇笔记,前提需要你对 ARM Cortex-M 的寄存器有一些了解。希望我总结的这篇笔记能够为想学习 FreeRTOS 内部机制 的人提供一些帮助。

优秀的个人博客,低调大师

通过STM32搞清楚 .text、 .rodata、 .data 以及 .bss 段是怎么回事

刚接触嵌入式写代码的时候,很少有人会主动去想一个变量存在哪,随着工作越来越久,慢慢就会明白:g_rx_buf[512] 明明一次都没赋过值,芯片的 RAM 却实打实少了 512 字节;而那张 const 正弦表,RAM 一点没占,Flash 却胖了一圈,那么我们的代码里的变量、函数、字符串等等到底都是如何处理的呢,我这里整理的笔记希望能给你带来一点惊喜。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册