![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C基础与单片机
文章平均质量分 62
GuoFengZhuo
作为30出头的硬件工程师,我在2024年寻求突破性的成长。
展开
-
C语言指针
指针是一种变量,其值为内存地址。它指向内存中存储的数据,允许直接访问或操作内存中的数据。通过指针,可以实现对内存的动态管理,以及在程序中传递复杂数据结构的能力。在C及类似的编程语言中,指针提供了对内存的底层访问,使得程序能够更加灵活和高效地操作内存。指针的大小取决于计算机架构和操作系统。在32位系统中,指针一般占用4个字节(32位),而在64位系统中,指针通常占用8个字节(64位)。这是因为指针需要存储一个内存地址,而内存地址的长度与系统的寻址能力有关。因此,不同的系统架构会影响指针变量的字节大小。原创 2024-07-03 22:41:13 · 473 阅读 · 0 评论 -
字符数组1
字符数组是元素的数据类型为字符类型的数组。原创 2024-07-03 22:47:15 · 130 阅读 · 0 评论 -
条件编译1
条件编译是一项源代码技术,它可以根据设定的条件选择性地包含或排除代码部分。在C/C++中,我们可以使用预处理器指令如#if/#else来实现条件编译。编译器会根据条件表达式的结果,决定是否编译某个代码块。通过在源代码中插入这些条件编译指令,我们就可以根据不同的环境、平台或者配置需求,灵活地构建程序。这让同一份代码可以生成针对不同场景优化后的可执行文件。比如,我们可以根据操作系统类型,#if定义不同的代码实现;或者根据硬件能力,#if内联更高效的算法部分。这大大提高了源代码的可维护性和可移植性。1。原创 2024-07-03 22:46:26 · 135 阅读 · 0 评论 -
二维数组1
二维数组的定义方式: 数组名[常量表达式][常量表达式]二维数组定义允许在声明时指定数组的行数和列数。其中,常量表达式可以是一个整数常量、宏定义、枚举常量或者由这些构成的表达式,用于确定数组的大小。需要注意的是,这种方式中声明时列数不能省略,而行数可以省略。原创 2024-07-03 22:47:57 · 331 阅读 · 0 评论 -
一维数组1
当谈及一维数组时,指的是在计算机内存中连续存储8的仅含有一个下标的数组。C语言中,一维数组通常以以下形式进行说明:<存储类型> <数据类型> <数据名>[<表达式>]。例如:int a[6]编译时,内存会被分配成连续的空间,其分配空间的字节数=数组维数*sizeof(元素数据类型)。另外,数组名表示内存的首地址,即为地址常量。int a[6],i;for(i=0;i<6;for(i=0;i<6;i++)a=a+1;原创 2024-07-03 22:48:37 · 297 阅读 · 0 评论 -
存储读写之FLASH篇2-本篇内容来自野火文档
在STM32芯片内部,存在一个重要的FLASH存储器,其主要用途是存储应用程序代码。编写完应用程序后,通常需要使用下载工具将已编译的代码文件写入内部FLASH。不可忽视的是,内部FLASH具有非易失性存储的特性,这意味着在断电后存储的数据不会丢失。每次芯片重新上 电并复位后,内核可以从内部FLASH中加载并执行存储的代码。除了使用外部工具(如下载器)来读写内部FLASH之外,STM32芯片在运行时也可以对其自身的内部FLASH进行读写操作。原创 2024-07-03 22:24:30 · 1005 阅读 · 0 评论 -
线性回归之基础篇
通常在C编程中,我们会采用线性回归或多项式拟合方法,用于拟合多个坐标点的数据。而线性回归是一种最为常见的拟合技术,它通过最小二乘法来估计回归系数,以找到使误差函数最小化的参数值。在这个过程中,我们需要运用偏导数和链式法则等微积分概念,以计算参数的导数,从而优化误差函数。需要特别注意的是,线性回归的导数计算与一元函数的导数计算在方法上存在差异。原创 2024-07-03 22:23:01 · 784 阅读 · 0 评论 -
内存映射地址机制的原理与应用
存储器映射(MemoryMapping)是指将存储器空间映射到更大的逻辑地址空间的一种技术。也就是逻辑地址是存储在代码区的。2. 将不同速度、不同功能的存储器映射到逻辑地址空间的不同区域,优化访问性能。4. 将外设寄存器等IO设备映射到CPU的地址空间,通过内存操作实现IO访问。1.将存储器模块映射到连续的逻辑地址空间,避免实际物理地址之间的间隙。逻辑地址是无符号整数,存在代码区,不占用实际物理存储。逻辑地址空间是相对于物理地址空间的更大连续抽象空间。定义:将存储器模块映射到连续逻辑地址的技术。原创 2024-07-03 22:22:05 · 395 阅读 · 0 评论 -
异或操作笔记
取反第0位:运算数据 ^0x01。取反第1位:运算数据 ^0x02。取反第2位:运算数据 ^0x04。取反第3位:运算数据 ^0x08。取反第4位:运算数据 ^0x10。取反第5位:运算数据 ^0x20。取反第6位:运算数据 ^0x40。取反第7位:运算数据 ^0x80。原创 2024-07-03 22:21:13 · 195 阅读 · 0 评论 -
逻辑运算左移与右移
设置 GPIOD 引脚为输出模式。流水灯程序实现 - 延时函数。- 定义函数 delay_ms。- 使能 GPIOD 时钟。- for 循环控制流水灯。- 使用循环实现延时功能。- 使用左移操作控制引脚。- GPIO 初始化。原创 2024-07-03 22:20:09 · 338 阅读 · 0 评论 -
STM32固件库各文件含义
STM32固件库文件分析1.Startup_stm32f10x_hd.s :汇编编写的启动文件,包含堆栈指针设置、PC指针设置、初始化中断向量表、系统时钟配置、调用C库main函数2.system_stm32f10x.c:时钟配置文件,外部时钟HSE=8M,经PLL倍频为72M 3.外设相关文件stm32f10x.h:实现了内核之外的寄存器映射stm32f10x_xx.c :外设的驱动函数库文件stm32f10x_xx.h:存放外设的初始化结构体,外设初始化结构i成员的参数列表,外设固件函数声明原创 2024-01-20 12:38:01 · 850 阅读 · 0 评论 -
STM32F103RET6 ADC配置流程
完成以上步骤后,可通过触发ADC中断,调用ADC_GetConversionValue函数来读取ADC转换的结果(ADC_DR)。然后需要配置ADC转换完成后的中断。可以使用NVIC库中的函数,将ADC的中断优先级设置为适当的级别,从而实现中断的处理。首先,使用RCC库函数RCC_APB2PeriphClockCmd使能ADC时钟。然后,需要配置ADC模块的基本参数,配置ADC通道、转换顺序、采样时间。最后,启动ADC转换并等待转换完成。STM32F103RET6 ADC配置流程。原创 2023-04-05 19:12:53 · 2076 阅读 · 0 评论 -
结构体基础知识梳理
在结构体类型中,成员名是结构体类型内部的标识符,用于标识结构体的各个成员。例如,在结构体定义之外,我们也可以定义一个独立的变量名为age,表示一个人的年龄。这里的大括号中的内容被称为"成员列表"或"域表",它包含了结构体的各个成员。举个例子,我们可以定义一个名为"worker"的结构体,在该结构体中包含职工的编号、姓名、性别、年龄、工资、家庭住址和联系电话等数据项。在C程序中,同一结构体类型的结构变量之间允许相互赋值,但不同结构体类型的结构体变量之间不允许相互赋值,即使它们包含有相同的成员。原创 2024-01-20 12:13:41 · 332 阅读 · 0 评论