- 博客(38)
- 收藏
- 关注
原创 如何理解函数里涉及的指针
输入指针pBuf用于存储读取的数据,指向调用者分配的缓冲区。指针操作:通过解引用存储数据并递增指针,实现数据连续存储。输出结果:读取的数据存储在调用者提供的缓冲区中,由调用者通过pBuf的原始地址访问。
2024-12-11 11:26:48
330
原创 BCD和BIN什么区别
BCD(Binary-Coded Decimal)和 BIN(二进制)是两种不同的编码方式,它们的主要区别在于编码方法和表示方式:
2024-10-29 15:01:40
951
1
原创 char *buf_ip4 = buf + sizeof(IP4MAPPED_HEADER) - 1;
这段代码的目的是通过调整指针buf_ip4,使它指向buf中紧接着后的内存位置,方便存储对应的 IPv4 地址部分。
2024-09-14 16:39:53
276
原创 PP_HTONL(x)
这个宏用于将一个 32 位无符号整数x转换为网络字节序(大端序)。在计算机系统中,不同的处理器可能采用不同的字节序:小端序(Little-Endian)或大端序(Big-Endian)。而网络协议通常要求使用大端序,因此需要将本地字节序转换为网络字节序。
2024-09-14 16:01:00
349
原创 如何理解wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); esp_wifi_init(&cfg) &cfg;
【代码】如何理解wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
2024-09-13 17:24:47
334
原创 C语言 条件编译
ifdef#ifdef用来检查某个宏是否已被定义。如果宏被定义,#ifdef之后的代码会被编译;如果宏没有定义,代码则会被忽略。例如:#endif如果DEBUG已定义,printf语句会被编译;如果DEBUG没有定义,这段代码就不会被编译。#endif(end if)#endif用来结束#ifdef块,表示条件编译的结束。它标志着条件编译的结束位置。#ifdef和#endif用于条件编译,根据宏是否定义来决定是否编译某段代码。
2024-09-13 14:51:38
976
原创 extern wm_event_group_t const my_event_group;中extern的作用
是的别名,用于表示事件组名称。它的主要作用是提高代码的可读性,明确指明这是与事件组相关的标识符,而不是普通的字符串。问题2:既然wm_event_group_t代表了const char * 那为什么wm_event_group_t修饰的 my_event_group还要加上const呢?第一个const(在typedef中定义的):确保指针指向的字符串内容是只读的,不能被修改。第二个const(在中的const):确保指针本身是只读的,不能被重新指向其他地址。保护指针指向的字符串(即。
2024-09-10 22:11:36
1022
原创 带参宏定义
define:这是C语言中的预处理指令,用来定义宏。宏的作用是替换代码中的特定部分,类似于全局的文本替换。这里定义的宏名称是。group:这是宏的参数。你可以将group理解为一个占位符,调用这个宏时传递的参数会替换宏中的group。extern:表示这个变量是在别的文件中定义的,而不是当前文件。它只是在当前文件中声明这个变量,实际定义在其他地方。:这是类型,来自于你之前看到的,即事件组类型。const:表示这个变量是常量,值不能被修改。group:这是变量名,代表事件组的名字。
2024-09-10 21:54:07
373
原创 i2c_slave_cb_register(&slave_user);假如此时是接收数据那 这里的&slave_user是什么
是slave_user结构体的地址,传递这个地址给后,I2C 驱动就知道当接收到数据时,应该调用slave_user中定义的on_receive函数(即),实现从设备数据接收的处理。
2024-09-07 11:33:19
315
原创 结构体的 定义和声明
使用提高了代码的可读性,明确了结构体成员的含义。使初始化顺序无关紧要,更灵活。可以部分初始化结构体成员,避免不必要的赋值。降低了顺序相关错误的风险。这是 C 语言中初始化结构体成员的常见好习惯,特别是在结构体包含多个成员或多个函数指针时。
2024-09-07 11:30:43
486
原创 i2c_on_slave_transmit_user是一个函数 不应该加上()吗
函数指针本质上保存了某个函数的地址,所以你可以通过它来调用这个函数。调用函数指针时也要加上。是一个函数名,如果你想直接调用这个函数,应该加上。
2024-09-07 11:08:36
190
原创 slave_cb->on_transmit 中 ->是什么意思
是通过结构体指针slave_cb访问成员,它指向了一个处理I2C数据发送的函数。在这个例子中,它最终指向并调用了函数。
2024-09-07 11:06:48
309
原创 I2C 事件中断有哪些
I2C 事件中断是指 I2C 硬件在发生特定事件时触发的中断。不同的 I2C 事件会影响通信过程,这些事件可以在 I2C 状态寄存器中监测。通常,这些事件与 I2C 总线的状态变化有关,例如生成START、接收ACK、完成数据传输等。
2024-09-06 10:30:07
1500
原创 I2C_FLAG &= FLAG_Mask;
在函数中使用FLAG_Mask对I2C_FLAG进行掩码操作的目的是确保只保留感兴趣的标志位,而忽略其他不相关的位。让我们具体看看FLAG_Mask为0x00FFFFFFFLAG_Mask。
2024-09-03 16:43:27
330
原创 i2creg = I2C_FLAG >> 28作用
这个逻辑是基于以下几个假设: 1. 标志位掩码 在 `SR1` 和 `SR2` 寄存器的位定义中具有不同的高位模式。2. 寄存器偏移:`SR1` 和 `SR2` 寄存器的地址偏移量不同,这使得你可以通过计算寄存器地址来确定标志位的寄存器。这个技巧的背景是寄存器标志位的掩码值在位掩码定义中已经进行了编码,其中高 4 位(即右移 28 位后的结果)指示了标志位属于哪个寄存器。假设 `I2C_FLAG` 是 `0x10000040`,这意味着标志位属于 `SR1` 寄存器。标志位和寄存器的映射。
2024-09-03 16:37:54
249
原创 if(((*(__IO uint32_t *)i2cxbase) & I2C_FLAG) != (uint32_t)RESET) 分析下这行代码
1. `(__IO uint32_t *)i2cxbase` • `(__IO uint32_t *)` 是一个类型转换,将 `i2cxbase` 地址转换为一个指向 32 位无符号整数(`uint32_t`)的指针。• 如果 `((*(__IO uint32_t *)i2cxbase) & I2C_FLAG)` 不等于 `0`,表示在读取的寄存器值中 `I2C_FLAG` 掩码对应的位被设置了。这实际上是读取 I2C 的状态寄存器 `SR1` 或 `SR2` 的值。
2024-09-03 15:44:16
363
原创 基地址和偏移量用于定位寄存器 而掩码则是寄存器内部的地址
基地址(BA_I2C)定义了 I2C 外设的起始地址。偏移量(如0x14)用于定位具体的寄存器(如SR1)相对于基地址的地址位置。通过基地址加上偏移量,我们可以计算出该寄存器的实际内存地址。BA_I2C0x14SR1掩码(如0x00000001)用于在寄存器的值中访问特定位。掩码通常通过位运算(如等)来检查、设置或清除寄存器中的某个位。
2024-09-03 15:25:25
501
原创 基地址和偏移量与寄存器某一位bit的关系
是 I2C 状态寄存器 1(SR1) 中的一个标志位。寄存器与偏移量 假设 I2C 外设基地址 `BA_I2C` 为 `0x40004800`,在这个基地址的基础上,各寄存器的偏移量如下: • 状态寄存器 1(SR1) 的偏移量:`0x14` • 状态寄存器 2(SR2) 的偏移量:`0x18` `I2C_FLAG_SB` 的解释 `I2C_FLAG_SB`(`0x10000001`)实际上是一个 32 位值,其中: • 高 4 位(`0x1`)指定寄存器类型或组。
2024-09-03 14:41:08
512
原创 FLAG_Mask=0x00FFFFFF, I2C_FLAG &= FLAG_Mask的意义
通过与操作符,所有不在FLAG_Mask掩码范围内的位(高 8 位)都被置为 0,而保留了低 24 位。
2024-09-03 13:47:05
391
原创 CH592 UART收发数据 FIFO THR TSR
在数据发送过程中,FIFO(First In, First Out)缓冲区起着重要的作用,主要用于缓冲待发送的数据,以提高数据传输的效率和稳定性。
2024-08-07 11:23:33
436
原创 R8_UART2_FCR & ~RB_FCR_FIFO_TRIG寄存器&上它的取反后的某位 是什么作用
操作用于清除寄存器中与掩码对应的位。这样的操作通常用于初始化或配置寄存器,以确保特定位处于已知状态。
2024-08-06 15:31:39
344
原创 为什么说通过按位或运算使能选择的通道;通过按位与运算禁用选择的通道。能举个例子说明吗
与一个取反后的掩码结合使用,用于禁用选择的通道,因为它可以将特定位设置为0,而不改变其他位的值。)用于启用选择的通道,因为它可以将特定位设置为1,而不改变其他位的值。),我们要启用通道2(对应的二进制掩码是。),我们要禁用通道2(对应的二进制掩码是。通道2被禁用,同时其他位保持不变。通道2被启用,同时其他位保持不变。
2024-07-19 16:04:17
343
原创 怎么理解if (strcmp((char *)RxData, “turnon“) == 0) 呢 RxData是字符串数组 数组又是指针 指针本质是地址
(null 终止符)结尾的字符数组。)是一个字符数组的首地址,指向字符串的第一个字符。函数用来比较两个字符串。返回 0,条件成立,进入 if 语句块。在 C 语言中,字符串实际上是一个以。是一个指针,指向这个字符串的首地址。是一个字符数组,包含。
2024-06-17 15:19:44
206
原创 中微8位单片机学习笔记0527
将16位的level值的高8位的最低2位设置到PWMD01H寄存器。将16位的level值的低8位设置到PWMD0L寄存器。
2024-05-27 10:04:21
892
原创 PWM 周期、脉冲宽度、占空比 中微8位单片机学习笔记
根据公式3 占空比=(PWMDx[9:0]+1)/(PWMT[9:0]+1),可以计算出占空比为(79+1)/(399+1)=20%根据这个公式,首先你需要将PWMDx[9:0]的值加1,然后乘以TOSC和时钟分频器的分频值,就可以得到脉冲的宽度。根据这个公式,首先你需要计算[PWMT+1]*Tosc,然后乘以时钟分频器的分频值,就可以得到PWM的周期。以PWM0为例,PWM0的占空比高2位是00,低8位是0100 1111,即0x04F,十进制为79,
2024-05-25 09:51:44
2824
1
原创 51单片机里 引脚、变量、数组的定义问题
通常情况下,你会使用类似于Keil C51这样的集成开发环境,它会提供一组默认的头文件,你也可以自己创建或修改头文件以适应你的项目需求。这些头文件会包含引脚的宏定义,例如引脚名称、端口号等,以便你在编写程序时可以直观地使用这些名称,而不是直接写入具体的引脚号码。这些头文件包含了与硬件相关的信息,例如引脚的名称、功能等。在源文件中,你会引用这些头文件,并使用其中定义的引脚来编写你的程序。这样做的好处是,如果你需要改变LED连接的引脚,你只需要修改头文件中的定义,而不需要修改源文件中的每个引用。
2024-05-24 11:56:16
687
原创 单片机中 频率 时钟周期 周期 中断频率各代表什么意思
在计时器应用中,周期是指计时器从0计数到设定值(通常由周期寄存器PR决定)所需要的时间。周期=(1999+1)×0.125 𝜇𝑠=2000×0.125 𝜇𝑠=250 𝜇𝑠周期=(1999+1)×0.125μs=2000×0.125μs=250μs。在计时器和微控制器应用中,频率通常指系统时钟频率(Fosc),即微控制器的时钟源每秒的振荡次数。周期=(PR+1)×计时器时钟周期周期=(PR+1)×计时器时钟周期。时钟周期是时钟信号的一个完整振荡周期的时间长度。它是计时器周期的倒数。
2024-05-23 15:29:16
1420
1
原创 (X >> 8) & 0x01 用于提取 16 位数X 的高 8 位中的最低有效位
0000 0000 0001 0010& 0000 0000 0000 0001 结果是:0000 0000 0000 0000 即 `0x00`。
2024-05-22 18:18:07
392
1
原创 一个数与0xFF与的结果
当一个数与0xFF按位与操作时,结果是这个数的最低 8 位(即低字节),因为0xFF的二进制表示是11111111。按位与操作会保留这个数的最低 8 位,其余高位会被清零。
2024-05-22 18:05:49
544
1
原创 2进制转10进制数
二进制数 0B00000001 是一个 8 位的二进制数。因此,二进制数 0B00000001 转换为十进制数就是 1。表示的是一个十六进制数。其中,F 在十六进制中代表 15。因此,0xFF 转换为十进制数就是 255。
2024-05-22 16:24:34
222
原创 PWMD01H = (level >> 8) & 0x01;PWMD0L = level & 0xFF
假设level的值为0x01FF0x01FF右移 8 位得到0x0001。0x0001与0x01按位与得到0x01。所以PWMD01H0x01。0x01FF与0xFF按位与得到0xFF。所以PWMD0L0xFF。这样,通过这两个操作,我们将 16 位的level分成了两个部分,高位的1被赋值给PWMD01H,低位的FF被赋值给PWMD0L。这是为了将 16 位的数据正确分配到两个 8 位寄存器中,从而正确地设置占空比。
2024-05-22 16:13:46
215
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人