STM32指针使用

 

CALCBILL_DATA_ST是个结构体占地址10个

uint8 txbuf1[10]={1,2,3,4,5,6,7,8,9,10};

uint8 txbuf2[10]={11,12,13,14,15,16,17,18,19,20};

uint8 *pbuf1 = txbuf1;

CALCBILL_DATA_ST  *pbuf2 = txbuf2;

如此pbuf1和pbuf2分别指向txbuf1和txbuf2空间

 

uint8 *pbuf1 = txbuf1;

CALCBILL_DATA_ST  *pbuf2 ;

memcpy(pbuf2 ,txbuf2,10);

pbuf2 指向的地址是系统分配的,分配只是个地址空间,后面的10个uint8空间可能和其他参数重叠不一定

pbuf2 指向空间地址数据就是txbuf2的数据指,但是空间地址不一样

pbuf1 原本指向txbuf1,地址数据应该是1-10,但是系统给pbuf2 分配的地址在pbuf1 前面一个地址的话

uint8 txbuf1[10]={12,13,14,15,16,17,18,19,20,10};

 

定义指针时一定要明确指针指向,否则就是野指针,尤其定义结构体或数组指针

### Keil STM32 指针使用教程 #### 定义与初始化指针变量 在嵌入式编程中,指针用于访问特定内存地址的数据。对于STM32微控制器而言,在Keil环境中操作指针可以提高程序效率和灵活性。 为了声明一个指向某种类型的指针,语法如下所示: ```c type *pointer_name; ``` 例如,要创建一个指向`int`类型的指针,则应编写: ```c int *ptr; // 声明名为 ptr 的 int 类型指针 ``` 当涉及到外设寄存器时,通常会用到硬件定义好的结构体来映射这些寄存器位置。这使得通过指针对它们进行读写变得简单而直观[^1]。 #### 动态分配存储空间 有时需要动态地为数据对象分配内存区域。此时可利用标准库函数如 `malloc()` 或者更安全的选择 `calloc()`. 这些函数返回的是 void* 类型的通用指针, 需要转换成目标类型以便后续处理. 下面是一个简单的例子展示如何申请一段连续字节作为缓冲区,并将其赋给字符数组形式的指针: ```c char *buffer = (char *) malloc(256); /* 请求一块大小为256个字节的空间 */ if(buffer != NULL){ free(buffer); /* 当不再需要该段内存时释放它 */ } ``` 需要注意的是,在实际项目开发过程中应当始终检查所请求资源是否成功获取到了有效地址;如果失败则采取适当措施防止潜在错误发生[^2]. #### 访问外部设备寄存器 STM32内部集成了丰富的片上外围模块(GPIO、USART等),其配置参数保存于相应基址处的一组特殊功能寄存器内。借助指针可以直接对该部分实施控制命令或查询状态信息。 假设有一个代表定时器TIM2计数值的32位无符号整数寄存器CNT位于地址0x40000024处,那么可以通过以下方式建立联系并修改其值: ```c #define TIM2_CNT_ADDR ((volatile uint32_t*)0x40000024) // 设置新的计数值 *(TIM2_CNT_ADDR) = new_value; // 获取当前计数值 current_value = *(TIM2_CNT_ADDR); ``` 这里采用了宏定义的方式简化了对固定物理地址的操作过程,同时也强调了易变性的特性以确保每次读取都能反映最新的硬件变化情况.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值