C&MCU
文章平均质量分 66
林子xxx
工作多年,现在才想起写博客。
展开
-
结构体对齐
要了解结构体对齐 ,必须要知道:基本变量如 CHAR、INT 也是存在对齐问题,并且,对齐是以空间换速度,可以用命令(如#pragma pack(n))进行n字节对齐或解除对齐;编译器会根据不同的系统进行默认对齐。万变不离其宗,默认的对齐准则是:基本变量的存放地址能整除 基本变量的宽度(比如32位机的int为32/8=4,这里是以字节为单位);对于结构体,其首地址能整除 体内最大的原创 2016-08-17 09:13:58 · 374 阅读 · 0 评论 -
STM32:SPI驱动ADXL345
ADXL345为3轴数字加速度计。支持SPI或I2C访问。网上例子大多是I2C,这里使用4线SPI。一、遇过的坑调试过程花了几个小时,遇到一些小坑。1.开始的时候,无论如何都无法读取芯片ID。这可是最基础的一步啊,SPI,I2C都试过。无奈之下,对照原理图与手册的管脚说明,发现Vs接到地了。其实这个管脚要接电源电压。老实说,一看名字还以为要接地,毕竟一般IC接地脚名字为Vss。让硬件工...原创 2019-03-19 23:35:14 · 8539 阅读 · 24 评论 -
nodemcu:使用lua开发esp8266
一、LuaLua是一种轻量级的嵌入式脚本语言。由于它消耗资源小,本身是使用标准c语言开发的,所以也比较合适移植进各种单片机中,用来替代ini,xml这类配置文件,甚至json,并且更加灵活,功能更强。官网:http://www.lua.org二、nodemcu官方解释:nodemcu是超简单的物联网开发平台。直白地说,就是esp8266刷入了lua解析器,可通过Lua脚本控制esp...原创 2019-03-02 22:04:09 · 2212 阅读 · 0 评论 -
嵌入式软件架构的设计
嵌入式软件架构的设计大多数嵌入式程序员学习编程,都是从开发板的附带例程开始。之后工作也会继续参考那些例程,很多编程习惯、方式也会受之影响。其实开发板式的编程方式与工作中实际需求的并不完全一致。开发板的通常卖给初学者,注重“即插即用”,兼容各种模块,讲究功能的全面而不讲究性能、效率、成本、功耗等。很多时候为了兼容各种型号IC或者显示屏之类,程序累赘,逻辑混乱。开发板的程序往往是一个人完成...原创 2019-02-18 22:00:35 · 15134 阅读 · 1 评论 -
总结程序BUG原因
写程序多年,创造了很多BUG,总结一下这些BUG的原因。一、清零这个原因很常见,特别是底层驱动代码,不可避免需要一些全局变量,对于这些全局变量的清零要注意。一般可分为:1.应该清零的地方没有清零。 或者是忘记清零,或者是误以为不需要清零。2.不该清零的地方却清零了。 这会导致变量结果得不到累积。函数越长,或是越想节省临时变量一个变量多次无关使用,逻辑混乱,越是容...原创 2019-01-23 22:17:22 · 2151 阅读 · 0 评论 -
cJSON移植到STM32
项目中用到JSON接收网络数据,具体是STM32串口接收JSON数据,提取需要的内容。本来KEIL MDK是自带JSON的,但是我不习惯使用KEIL自带的那些第三方的东西,很杂乱的感觉。cJSON的移植比较简单,一下子就可以搞定。1.下载源文件。http://sourceforge.net/projects/cjson/只需要两个文件cJSON.c,cJSON.h;下载的包里面...原创 2018-12-20 23:51:29 · 6695 阅读 · 9 评论 -
浅谈C指针,数组,函数指针
工作中发现很多初入职场的同事不会使用指针,或者惧怕指针。作为C语言老鸟,在这里写一些有利于初学者理解C指针的东西,希望对他们有帮助吧。1.C语言里,指针可以说是地址变量。比如int n;int *p; n是一个变量。它的类型是int;p也是一个变量。可以这么理解:它的类型是(int*); 官方说法是:一个指向int的指针;直白说法是:p这个地址,是按照int的形式保存数据。本质上,...原创 2018-05-28 08:30:24 · 387 阅读 · 1 评论 -
STM32F4制作一个计算器(一) 大数运算
一、大数的运算算法使用原子的STM32F4开发板制作一个计算器,类似电脑上的标准型计算器。在制作界面之前,首先要解决大数运算问题。因为STM32为32位MCU,直接计算最大不过32位,按十进制也就是10位数,显然不够用。为了方便计算,使用数组储存各位数据,并且低位在前。下面数据结构中,使用指针代替数组,这是为了方便以后与界面函数部分对接。 #define THIS_MAXLE...原创 2017-09-16 18:59:26 · 11271 阅读 · 3 评论 -
数据传输中的双内存池使用
在使用串口或者其他接口进行传输数据时,通常我们会开辟一段内存空间以供作缓冲。假设,现在,程序开辟了一段内存A,某一时刻程序往A写待发送的数据,如果这时串口需要发送数据,必须等待A1写完,否则发送的数据将不是所期望的,并且,APP要么停下来等待串口,要么将待发送数据保存下来然后继续做事:这并很影响程序的健壮性。有一种解决方法是使用环形队列。环形队列需要一段内存,一个读指针,一个写指针,以及一原创 2016-08-18 14:53:03 · 528 阅读 · 1 评论 -
Cortex-M0模仿位带操作使用
Cortex-M3/M4有位带区(BIT-BAND),可以进行位带操作,而Cortex-M0是没有此功能区域的。必须说明一点,BIT-BAND的本质可以说是空间换时间。是为追求速度而设置的功能。像STM32F0XX这些Cortex-M0系列的MCU,如果追求速度,还是老老实实操作BSRR/BRR这类专门的寄存器。如果不介意速度损失,单纯想做出类似"位带"操作(比如:PAout(0)= 0,...原创 2019-04-22 21:19:00 · 4019 阅读 · 6 评论