strongercjd
码龄9年
关注
提问 私信
  • 博客:1,859,659
    社区:1
    动态:37
    学院:3,031
    1,862,728
    总访问量
  • 136
    原创
  • 2,060,297
    排名
  • 74,881
    粉丝

个人简介:资深嵌入式软件开发工程师,分享嵌入式软硬件方面知识。

IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:江苏省
  • 加入CSDN时间: 2016-05-22
博客简介:

人生一路,点滴记录

博客描述:
思考,记录着人生的所思所想……
查看详细资料
个人成就
  • 获得1,274次点赞
  • 内容获得213次评论
  • 获得8,608次收藏
  • 代码片获得3,110次分享
创作历程
  • 17篇
    2022年
  • 37篇
    2021年
  • 34篇
    2020年
  • 17篇
    2018年
  • 13篇
    2017年
  • 21篇
    2016年
成就勋章
TA的专栏
  • STM32F207教程
    68篇
  • STM32网络开发LWIP
    34篇
  • 日常杂谈
    25篇
  • C语言进阶
    29篇
  • 开发工具
    5篇
  • 硬件相关
    11篇
兴趣领域 设置
  • 嵌入式
    单片机嵌入式硬件
  • 硬件开发
    硬件工程驱动开发arm开发硬件架构
创作活动更多

HarmonyOS开发者社区有奖征文来啦!

用文字记录下您与HarmonyOS的故事。参与活动,还有机会赢奖,快来加入我们吧!

0人参与 去创作
  • 最近
  • 文章
  • 代码仓
  • 资源
  • 视频
搜TA的内容
搜索 取消

预编译#error的使用

说到预编译,大家立刻就能想到#define、#if、#ifdef和#ifndef等熟悉的预编译命令。其实#include,我们通常放在源文件用来包含头文件,它也是预编译命令。当然这不是这篇文章的重点。这篇文章主要讲解下#error预编译命令,对于什么是预编译,预编译的作用等基础知识点不再讲解,不懂的同学请自行百度。在MCU的开发中,我们经常需要用到Flash存储一些参数,且通常情况下有很多参数需要存储。
原创
发布博客 2022.12.17 ·
1239 阅读 ·
2 点赞 ·
2 评论 ·
7 收藏

关于共享资源保护的思考

先聊聊分享这篇文章的原因,在使用STM32时,我发现对于GPIO输出操作,可以使用GPIOx_ODR寄存器,也可以使用GPIOx_BSRR寄存器。对应的标准外设库API接口有对于我来说,我一直在用GPIO_SetBits和GPIO_ResetBits接口,一直对GPIO_ToggleBits无感。最近注意的这个问题,经过查资料和FAE确认,这样做的,目的是防止同一个port的其他GPIO被篡改。看下GPIO_ToggleBits的具体实现。
原创
发布博客 2022.12.17 ·
381 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

表驱动法在STM32中的应用

所谓表驱动法(Table-Driven Approach)简而言之就是用查表的方法获取数据。此处的“表”通常为数组,但可视为数据库的一种体现。根据字典中的部首检字表查找读音未知的汉字就是典型的表驱动法,即以每个字的字形为依据,计算出一个索引值,并映射到对应的页数。相比一页一页地顺序翻字典查字,部首检字法效率极高。具体到编程方面,在数据不多时可用逻辑判断语句(if…else或switch…case)来获取值;但随着数据的增多,逻辑语句会越来越长,此时表驱动法的优势就开始显现。
原创
发布博客 2022.11.05 ·
3437 阅读 ·
7 点赞 ·
2 评论 ·
44 收藏

关于软件定时器的一些讨论

这里先介绍下软件定时器和硬件定时器的区别:CPU内部自带的定时器模块,通过初始化、配置可以实现定时,定时时间到以后就会执行相应的定时器中断处理函数。硬件定时器一般都带有其它功能,比如PWM输出、输入捕获等等功能。但是缺点是硬件定时器数量少!!:软件定时器允许设置一段时间,当设置的时间到达之后就执行指定的功能函数,被定时器调用的这个功能函数叫做定时器的回调函数。回调函数的两次执行间隔叫做定时器的定时周期,简而言之,当定时器的定时周期到了以后就会执行回调函数。
原创
发布博客 2022.09.26 ·
1750 阅读 ·
1 点赞 ·
2 评论 ·
7 收藏

聊聊数据溢出的事

聊聊数据溢出的事情
原创
发布博客 2022.07.09 ·
669 阅读 ·
0 点赞 ·
0 评论 ·
1 收藏

C语言为什么不检查数组下标

1、引言最近在查一个bug,查到最后发现是数组越界导致的。数组只有30个字节,代码却向这个数组填充了35个数据,这个bug还是偶现的,查到它确实废了一番功夫。我就突然想到:C语言为什么不检查数组下标呢???先来个demo验证下#include<stdio.h>#include<stdlib.h>int main(){ int data[5]={0}; for(int i=0;i<8;++i) { printf("%d "
原创
发布博客 2022.05.25 ·
446 阅读 ·
1 点赞 ·
1 评论 ·
0 收藏

回调函数在命令解析中的应用

1、回调函数关于回调函数,在之前的文章《回调函数》已经详解讲解过了,这个文章不再讲解,不太懂的同学请看之前的文章《回调函数》。在之前讲解回调函数中就使用串口作为示例,使用回调函数可以方便封装通讯库,芯片/模块厂家的SDK和部分开源库经常这样做,这样可以实现模块间的解耦,模块化编程。这篇文章主要讲解回调函数在命令解析中的应用,一般命令中都会有功能码,用于区分这条命令到底执行的什么动作,命令字后面的数据的意义。在这种场景中,使用回调函数是一个不错的选择。2、经典写法在命令解析中,经典的写法使用s
原创
发布博客 2022.05.08 ·
783 阅读 ·
0 点赞 ·
0 评论 ·
7 收藏

回调函数

1、函数指针学习回调函数,其实就是函数指针的应用,关于函数指针在之前的文章《指针与函数》中有详细的讲解,这里不再展开详解,重新贴一下之前文章中函数指针的示例代码#include <stdio.h>void MyFun1(int x);void MyFun2(int x);void MyFun3(int x);typedef void (*FunType)(int); /* ②. 定义一个函数指针类型FunType,与①函数类型一致 */void CallMyFun(FunTy
原创
发布博客 2022.04.16 ·
1369 阅读 ·
1 点赞 ·
1 评论 ·
21 收藏

指针与函数

1、指针函数指针函数,从名字上看它本质上是一个函数。指针函数:返回值类型是指针的函数。函数声明如下:int *plusfunction(int a,int b);当然也可以写成如下格式:int* plusfunction(int a,int b);让指针标志 * 与int紧贴在一起,而与函数名f间隔开,这样看起来就明了些了,plusfunction是函数名,返回值类型是一个int类型的指针。指针函数就是一个普通的函数,普通到仅仅是因为它的函数返回值是指针而已。#includ
原创
发布博客 2022.04.10 ·
1548 阅读 ·
3 点赞 ·
2 评论 ·
20 收藏

指针与数组

1、定义指针:C语言中某种数据类型的数据存储的内存地址,例如:指向各种整型的指针或者指向某个结构体的指针。数组:若干个相同C语言数据类型的元素在连续内存中储存的一种形态。数组在编译时就已经被确定下来,而指针直到运行时才能被真正的确定到底指向何方。所以数组的这些身份(内存)一旦确定下来就不能轻易的改变了,它们(内存)会伴随数组一生;而指针则有很多的选择,在其一生他可以选择不同的生活方式,比如一个字符指针可以指向单个字符同时也可代表多个字符等。指针和数组在C语言中使用频率是很高的,在极个别情
原创
发布博客 2022.03.29 ·
3980 阅读 ·
4 点赞 ·
1 评论 ·
23 收藏

VS Code调试C代码

1、前言首先说明的是vscode是代码编辑器,并不是编译器,它本身并不能编译C语言。在这里我们使用的是MinGW-w64作为C语言的编译器。MinGW-w64的前身是MinGW的全称是:Minimalist GNU on Windows。它实际上是将经典的开源 C语言 编译器 GCC 移植到了 Windows 平台下,并且包含了 Win32API ,因此可以将源代码编译为可在 Windows 中运行的可执行程序。而且还可以使用一些 Windows 不具备的,Linux平台下的开发工具。一句话来概
原创
发布博客 2022.03.13 ·
4287 阅读 ·
1 点赞 ·
0 评论 ·
12 收藏

单片机中volatile的应用

01、简述一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。简单来说,如果这变量很重要,且你不想它被编译器优化,就用volatile修饰。02、用处关于编译器优化如果你在编译器器开了优化
原创
发布博客 2022.03.01 ·
1463 阅读 ·
1 点赞 ·
2 评论 ·
20 收藏

C语言中static关键字详解

C语言中staic关键字很简单,简单到你的任何一个项目中可以不写一个staic关键字也是没有问题的。写这篇章主要是一下自己的staic的理解和应用,当然在章开头依旧要照本宣科简述一下static关键字。1、简述static关键字在嵌入式C语言当中很简单,它有三个作用:作用一:在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。void test1(void){ unsigned char a; static unsigned char b;…...
原创
发布博客 2022.02.16 ·
3820 阅读 ·
3 点赞 ·
0 评论 ·
18 收藏

深入聊一下const关键字

const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程序上可以提高程序的健壮性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解别人的程序有所帮助。1、const简介下面简单描述一下const,基本都是教科书的知识。const修饰的变量,其值存放在只读数据段中,其值不能被改变。称为只读变量。关于什么是数据段,什么是代码段,请看我之前的文章《C语言的内存分配》。int const a;const int a;上面两条语句都可以将a声明为一个整数,
原创
发布博客 2022.02.08 ·
1641 阅读 ·
1 点赞 ·
0 评论 ·
13 收藏

联合体在单片机编程中的应用

1、联合体之前的文章《枚举和结构体的结合》文中提到,结构体就像是打包封装,把一些有共同特征的变量封装在内部。结构体是一种构造类型或复杂类型,它可以包含多个类型不同的成员。在C语言中,还有另外一种和结构体非常类似的语法,叫做联合体(Union)(有些地方也叫做共用体)。联合体举例如下union data{ char n; char ch; char f;};union data a, b, c;结构体和联合体的区别在于:结构体的各个成员会占用不同的内存,互相之间没
原创
发布博客 2022.01.27 ·
2775 阅读 ·
5 点赞 ·
0 评论 ·
23 收藏

关于结构体中指针的一些探讨

1、起因在上篇文章《STM32编程中枚举和结构体的结合》中,有读者对下列代码有疑问typedef struct{ char *name; //姓名 int num; //学号 int age; //年龄 float score; //成绩}stuff_s;stuff_s xiaoming;void xiaoming_inf_init(){ xiaoming.name = "xiaoming"; xiaoming.num = 1; xiaoming.age
原创
发布博客 2022.01.25 ·
656 阅读 ·
0 点赞 ·
0 评论 ·
3 收藏

STM32编程中枚举和结构体的结合

01、结构体定义基本定义:结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合)的变量封装在内部,通过一定方法访问修改内部变量。结构体的定义:第一种:只有结构体定义struct stuff{ char *name; //姓名 int num; //学号 int age; //年龄 float score; //成绩};第二种:附加该结构体类型的“结构体变量”的初始化的结构体定义,如下代码也就是定义结构体时
原创
发布博客 2022.01.08 ·
813 阅读 ·
1 点赞 ·
0 评论 ·
20 收藏

C语言在STM32中的内存分配

01、前言不说废话,先上示例代码uint8_t num_byte[4];uint32_t num_word;const uint32_t num_word_const = 0x1234;uint32_t *point_heap;int main(void){ uint8_t num_byte_stack; static uint8_t num_byte_static; point_heap = (uint32_t *)malloc(4); *point_heap =
原创
发布博客 2021.12.22 ·
1419 阅读 ·
2 点赞 ·
0 评论 ·
16 收藏

C语言的内存分配

01、ANSI C在ANSI C中数据类型包括:整形,浮点型,指针和聚合型(如数组和结构等)整形:字符,短整型,整型和长整型,他们都分别有有符号(singed)和无符号(unsingned)取值范围:没有带signed或者unsigned,默认signed长整型至少应该和整型一样长,而整型至少应该和短整型一样长在32位环境中,各种数据类型的长度一般如下:02、ARM C具体我们以IAR为编译器,版本7.2注意:在32位ARM中,字是32位,半字是16位
原创
发布博客 2021.12.17 ·
2157 阅读 ·
1 点赞 ·
0 评论 ·
9 收藏

在大公司天天调参数,感觉快废了

01、基础知识 一个嵌入式工程师,很多都是从51单片机或者STM32单片机开始,对于单片机的开发环境,开发流程,基础外设都了解,做过一些实际的案例,比如点流水灯之类的。那么对于基本的中断的概念,寄存器的概念,看门狗,AD等基本原理能大概的讲出来。掌握硬件设计方法,能设计原理图PCB,至少两层板。能画出三极管及MOS管作为开关管的实际应用电路,对电源芯片的设计有基本的了解。能利用网络进行信息检索,能在理解别人图纸的基础上进行copy。这是一个本科嵌入式毕业生应该具备的水平。项目做的多...
转载
发布博客 2021.12.08 ·
426 阅读 ·
5 点赞 ·
0 评论 ·
6 收藏
加载更多