MCU常用代码片段:数据缓冲、 整形转单精度 、定点数转单精度浮点型 、CRC 校验和计算 、位操作 、hex转bcd 、求字符串长度 、内存拷贝

}

/* EOF. */



#ifndef RBUF_H
#define RBUF_H

#include <stdint.h>
#include <stdbool.h>

/*!

  • @brief Define structure for Ring Buffer’s handler.
  • The Ring Buffer is origanized as FIFO based on a array of static memory.
    /
    typedef struct
    {
    uint32_t buff_size; /
    !< Keep the available count of byte in buffer’s array /
    uint8_t buff_mem; /!< Keep the first pointer to the buffer’s array. This pointer is used to handler the memory. /
    uint32_t read_idx; /
    !< Keep the index of item in static array for FIFO’s read pointer. /
    uint32_t write_idx; /
    !< Keep the index of item in static array for FIFO’s write pointer. /
    uint32_t count; /
    !< Record the current count of used item in the FIFO .
    /
    } rbuf_handler_t;

/*!

  • @brief Initialize the ring buffer.
  • This function fills the allocated static memory into ring buffer’s handle structure, and fills the
  • read and write pointers with initial value.
  • @param [out] handler Pointer to a empty ring buffer handle to be filled. See to #rbuf_handler_t.
  • @param [in] mem Pointer to allocated static memory.
  • @param [in] size Count of memory size in byte.
    */
    void rbuf_init(rbuf_handler_t *handler, uint8_t *mem, uint32_t size);

/*!

  • @brief Reset or Clean the ring buffer.
  • This function clear all the items in the fifo. Actually, it just resets the write index, read
  • index and the item count, then all the old data would be unavailable, while the new data would
  • cover them.
  • @param [in] handler Pointer to a ring buffer handle to be clean. See to #rbuf_handler_t.
    */
    void rbuf_reset(rbuf_handler_t *handler);

/*!

  • @brief Check if the buffer is empty.
  • @param [in] handler Pointer to an available handler to be operated.
  • @retval true The buffer is empty.
  • @retval false The buffer is not empty.
    */
    bool rbuf_is_empty(rbuf_handler_t *handler);

/*!

  • @brief Check if the buffer is full.
  • @param [in] handler Pointer to an available handler to be operated.
  • @retval true The buffer is full.
  • @retval false The buffer is not full.
    */
    bool rbuf_is_full(rbuf_handler_t *handler);

/*!

  • @brief Put data into buffer.
  • @param [in] handler Pointer to an available handler to be operated.
  • @param [in] dat The data to be put into buffer.
    */
    void rbuf_input(rbuf_handler_t *handler, uint8_t dat);

/*!

  • @brief Get out data from the buffer.
  • @param [in] handler Pointer to an available handler to be operated.
  • @retval The data from the buffer.
    */
    uint8_t rbuf_output(rbuf_handler_t *handler);

#endif /* RBUF_H */


### 2、整形转单精度



float uint32_to_float (uint32_t num)
{
float temp;
if (num >= (1 << 23))
{
temp = -(float)(((1 << 24) - num) / (float)(1 << 17));
} else
{
temp = (float)(num / (float)(1 << 17));
}
return temp;
}


例如,读取到的值为0x030000,转换为单精度类型即为1.50000。 


### 3、定点数转单精度浮点型



static float __uint16_to_float (uint32_t num)
{
float temp;
if (num >= (1 << 15))
{
temp = -(float)(((1 << 16) - num) / (float)(1 << 8));
} else
{
temp = (float)(num / (float)(1 << 8));
}
return temp;
}


### 4、CRC 校验和计算参考程序(X^{8}+X^{2}+X+1)



static uint8_t compute_crc8(uint8_t *data,uint8_t data_size)
{
uint8_t i;
uint8_t crc = 0;
while (data_size)
{
for (i = 0x80; i != 0; i >>= 1)
{
if (((crc & 0x80) != 0) != ((*data & i) != 0))
{
crc <<= 1;
crc ^= 0x07;
} else
{
crc <<= 1;
}
}
data++;
data_size–;
}
return crc;
}


### 5、位操作


##### Ⅰ、寄存器的第n位置1;其他位保持不变,可以使用 |= 操作符



NUM |= (1 << n);


##### Ⅱ、寄存器的第n位置0;其他位保持不变,可以使用 &= 操作符



NUM &= ~(1 << n);


##### Ⅲ、寄存器的第m位到第n位(m>=n)置1;其他位保持不变



NUM |= (((1 << (m - n + 1)) - 1) << n);


##### Ⅳ、寄存器中的第m位到第n位(m>=n)置0;其他位保持不变



NUM &= ~(((1 << (m - n + 1)) - 1) << n);


##### Ⅴ、寄存器中的第n位取反;其他位保持不变



NUM = NUM ^ (1 << n);


##### Ⅵ、判断寄存器中的第n位是否为0或1



if((NUM &(1<<n)) >= 1)
{
return 1;
}else
{
return 0;
}


##### Ⅶ、汇总



#include <stdio.h>
void printf_8bin(unsigned char num)
{
for (int i = 7; i >= 0; i–)
{
if (num & (1 << i))
{
printf(“1”);
}
else
{
printf(“0”);
}
}
printf(“\r\n”);
}

int main(void) {
int n=3,m=6;
unsigned char NUM=0xF0;
printf(“寄存器0x%x的二进制:”,NUM);
printf_8bin(NUM);

NUM |= (1 << n);
printf("寄存器的第%d位置1;其他位保持不变,可以使用 |= 操作符:",n);
printf_8bin(NUM);

NUM &= ~(1 << n);
printf("寄存器的第%d位置0;其他位保持不变,可以使用 &= 操作符:",n);
printf_8bin(NUM);

NUM |= (((1 << (m - n + 1)) - 1) << n);
printf("寄存器的第%d位到第%d位(m>=n)置1;其他位保持不变:",m,n);
printf_8bin(NUM);

NUM &= ~(((1 << (m - n + 1)) - 1) << n);
printf("寄存器的第%d位到第%d位(m>=n)置0;其他位保持不变:",m,n);
printf_8bin(NUM);

NUM = NUM ^ (1 << n);
printf("寄存器中的第%d位取反;其他位保持不变:",n);
printf_8bin(NUM);

if((NUM &(1<<n)) >= 1)
{
    printf("判断寄存器中的第%d位是%d\n",n,1);
}else {
    printf("判断寄存器中的第%d位是%d\n",n,0);
}

return 0;

}


开始运行...


寄存器0xf0的二进制:11110000  
 寄存器的第3位置1;其他位保持不变,可以使用 |= 操作符:11111000  
 寄存器的第3位置0;其他位保持不变,可以使用 &= 操作符:11110000  
 寄存器的第6位到第3位(m>=n)置1;其他位保持不变:11111000  
 寄存器的第6位到第3位(m>=n)置0;其他位保持不变:10000000  
 寄存器中的第3位取反;其他位保持不变:10001000  
 判断寄存器中的第3位是1


运行结束。


### 6、hex转bcd



unsigned char hex_to_bcd(unsigned char Value_H,unsigned char Value_L)
{
unsigned char bcd_value;

if((Value_H >= '0') && (Value_H <= '9'))
    Value_H -= '0';
else if((Value_H >= 'A') && (Value_H <= 'F'))
    Value_H = Value_H - 'A' + 10;
else if((Value_H >= 'a') && (Value_H <= 'f'))
    Value_H = Value_H - 'a' + 10;
 
bcd_value = Value_H & 0x0f;

bcd_value <<= 4;
if((Value_L >= '0') && (Value_L <= '9'))
    Value_L -= '0';
else if((Value_L >= 'A') && (Value_L <= 'F'))

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

132)]

[外链图片转存中…(img-C12RDCpr-1715590647133)]

[外链图片转存中…(img-FYvLDo5g-1715590647134)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值