STM32 学习笔记 -- 字、半字、字节和sizeof()详解

【stm32f103学习笔记】字、半字、字节和sizeof()

分类专栏: stm32 嵌入式c语言
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.youkuaiyun.com/qq_27334499/article/details/52190829

定义

-字、半字是根据处理器的特性决定的;字节则都是8bit。
-sizeof()返回一个数据类型的占用地址长度,增强程序在不同处理器间的兼容性;

1CPU按照其处理信息的字长可以分为:八位微处理器、十六位微处理器、三十二位微处理器以及六十四位微处理器等。
2CPU最大能查找多大范围的地址叫做寻址能力 ,CPU的寻址能力以字节为单位 ,如32位寻址的CPU可以寻址232次方大小的地址也就是4G,这也是为什么32位的CPU最大能搭配4G内存的原因 ,再多的话CPU就找不到了。

几个处理器比较

1)stm32是32bit处理器,所以它的字是32bit的(一次处理4字节长度的数据)。半字自然就是16bit(2字节);字节是8bit。

1、stm32和传统的arm相比最大的好处就是不需要对齐,三种类型的数据可以在内存中无缝的存放。而传统的arm7或arm9等是照着地址对齐的,就是说不管8bit或者16bit的数据都要占用4个字节的空间,这样的结果就是造成内存的浪费。

寄存器的访问

1、半字型的寄存器用u16类型的变量访问,u8只能访问低8位,u32读的时候没问题,写的时候会因编译器的不同而出现偏差。
2、在MSP430上,由于它是16bit处理器,所以它的字是16bit的。半字=字节=8bit。
……

sizeof()

看两个例子:
(1) int应该是2还是4?

VC++ 默认 int 是 long int,  长度是4
TC   默认 int 是 short int, 长度是2

int类型所占的字节数依赖于机器的字长, 有16位, 32位, 64位.我们现在买电脑时所说的32位机, 64位机就是指这个, 在16位机上int长度是2, 在32位机上长度是4, 所以在编码的时候需要写int长度时, 我们不能想当然的写2或4, 而应使用sizeof来计算, sizeof(int)这样就不会错了, 而且提高了程序的兼容性。

(2) A机器int占用2个字节,B机器占用4字节,申请内存存放一个int数据。
如写入:

int *i=(int*)malloc(2);

那么在A机器中能正常运行,在B上则会报错
应写成:

int *i=(int*)malloc(sizeof());

这样A、B机器中都能兼容。

### STM32 驱动 ESP-01 模块 #### 硬件连接配置 为了使 STM32 成功驱动 ESP-01 WiFi 模块,硬件连接至关重要。通常情况下,ESP-01 STM32 的连接依赖于 UART 接口来传输命令数据。 | STM32 Pin | ESP-01 Pin | |-----------|------------| | VCC | VCC | | GND | GND | | TX | RX | | RX | TX | 注意,在某些应用场景中可能还需要额外的电平转换电路以匹配不同的电压标准[^1]。 #### 初始化设置与 AT 命令集 初始化过程中,STM32 应该向 ESP-01 发送一系列预定义的 AT 命令来进行基本参数设定以及确认设备状态。这些命令可以用来切换工作模式(如 Station 或者 AP)、查询当前 Wi-Fi 连接状况等操作。例如: ```c // 设置为Station模式 char cmd[] = "AT+CWMODE=1\r\n"; HAL_UART_Transmit(&huart1, (uint8_t*)cmd, strlen(cmd), HAL_MAX_DELAY); ``` 此段代码用于将 ESP-01 设定为仅作为客户端尝试接入现有无线网络的工作模式[^3]。 #### 示例程序结构 下面给出一段简化版 C 语言伪代码片段展示如何利用 STM32 控制 ESP-01 实现基础功能调用: ```c #include "stm32f1xx_hal.h" UART_HandleTypeDef huart1; void SystemClock_Config(void){ /* ... */ } static void MX_GPIO_Init(void){ /* ... */ } static void MX_USART1_UART_Init(void){ /* ... */ } int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); char *wifi_setup_commands[]={ "ATE0\r\n", // 关闭回显 "AT+RST\r\n", // 复位模块 "AT+CWMODE=1\r\n", // 设置为STA模式 "AT+CWJAP=\"SSID\",\"PASSWORD\"\r\n" // 连接到指定Wi-Fi热点 }; for(int i=0; i<sizeof(wifi_setup_commands)/sizeof(char*); ++i){ HAL_UART_Transmit(&huart1,(uint8_t *)wifi_setup_commands[i],strlen(wifi_setup_commands[i]),HAL_MAX_DELAY); HAL_Delay(1000); // 给予足够的时间等待响应 } while (1){ // 主循环逻辑... } } ``` 上述代码实现了对 ESP-01 的初步配置并试图建立至特定 SSID 的 Wi-Fi 连接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值