![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C
文章平均质量分 56
大饼酱人
目前小白菜
展开
-
stm32操作SD卡的程序
使用SPI方式,用的cube库原创 2022-12-27 22:45:00 · 446 阅读 · 0 评论 -
代码review辅助工具
代码review辅助工具 SourceMonitor、SourceInsight_Scan、simian、cpp-check-lint、clang-format原创 2022-11-04 18:45:29 · 1102 阅读 · 0 评论 -
CPP文件和C文件中的函数互调
在vscode中两个文件都有且不做处理的话会出现,extern后可以跳转但是显示未定义的错误。原创 2022-10-09 19:15:00 · 1282 阅读 · 2 评论 -
对CMSIS的学习(第4-5部分)
_NO_RETURN:C11函数说明符,表明调用完成后函数不返回主调函数,以便编译器在优化时去掉不必要的函数返回代码,#define __NO_RETURN。__main() 和 main():__main()是编译系统提供的一个函数,负责完成库函数的初始化和初始化应用程序执行环境,最后自动跳转到main(),慎用__main()__VECTOR_TABLE_ATTRIBUTE:用于定义静态(编译器时)中断向量表,例如将表标记为已使用并强制将其放入特定的链接器部分。__GNUC__指的是GCC的版本。原创 2022-09-03 11:54:46 · 500 阅读 · 0 评论 -
对CMSIS的学习(第1-3部分)
CMSIS英文全称通用微控制器软件接口标准,适用于基于Arm Cortex处理器的微控制器,为处理器和外围设备、实时操作系统和中间件组件提供接口。CMSIS是工具、API、框架和工作流程的组合,最初是基于 Arm® Cortex®-M 的处理器的硬件抽象层,后来扩展到支持基于 Arm Cortex-A 的入门级处理器;是由各芯片和软件供应商合作定义,开源。原创 2022-08-20 12:07:10 · 3010 阅读 · 0 评论 -
测试驱动的嵌入式C语言开发(TDD)(第4-7章)
不兼容的头文件,不同的标记、函数名、定义和头文件路径,比如sprintf()和_snprintf(),解决平台独立的问题方法是适配器模式,即用C实现对不同服务的接口。CI 服务器会监控代码库的签入并在签入完成后触发一个完整的构建和测试过程。持续集成(CI),要写两套代码,代码合并要比较小,辅以自动化测试(由TDD产生),给遗留代码(没有测试的代码)建议的策略是一边产出新的产品功能,一边增量地添加。测试替身为被测代码提供间接输入(返回值),或者用来捕获,也可能是检查由被测代。码发向测试替身的间接输出(参数)原创 2022-08-20 11:59:36 · 647 阅读 · 0 评论 -
测试驱动的嵌入式C语言开发(TDD)(第1-3章)
过去所有关于 TDD的书使用的都是 Java 或是高端动态语言会帮助你打造更好的软件并让你从漫长的“测试再修正”过程中解放出来不是为软件测试人员而写的,为嵌入式软件开发者写的目标读者是嵌入式 C 语言程序员,但C 代码有浓郁的面向对象(C++)的风格“测试替身”和“仿制对象”的概念很重要。原创 2022-08-20 11:57:57 · 931 阅读 · 0 评论 -
stm32l4的OTP相关操作
OTP相关文章相关论坛stm32l4只能写一次,没有锁stm32f4 有锁OTP的读#define OTP_BASE_ADDRESS 0x1FFF7000U //最大1k空间--0x1FFF73FFU 以8个字节为单位进行写入#define DEFAULT_VALUE 0xFFFFFFFFFFFFFFFF#define FlashGetChar(addr) *((char*)(addr))#define FlashGetU8(addr) *((uint8_t*)(add原创 2022-05-07 18:15:46 · 1355 阅读 · 0 评论 -
使用keil5仿真时遇见的两个小问题
使用的keil 版本 V5.27.1.0(破解)问题1(未解决):通过添加path,引用了几个工程外部的文件,在main函数中应用了一个在外部文件中extern出来的全局变量,发现这个变量无法配置,但是将其返回原外部文件后,可以配置。问题2(已解决):一个公式,变量除以一个宏定义,宏定义内部是一个运算,例#define a 2#define b 20/a //正确为(20/a)int16_t c = 0, d = 69;c = d/b;结果c=1,原因是b没加括号,但是keil仿真时将原创 2022-04-22 19:21:15 · 572 阅读 · 0 评论 -
C语言常用的工具函数(FM0编码发送函数)
FM0导引头及0-1对应编码为:#define YES 1 //翻转#define NO 0 //不翻#define HEADER_LEN 18//FM0 HEADER#define RN16_LEN 16#define READ_LEN 33#define WRITE_LEN 17const char preamble_str[HEADER_LEN] = "000000000000101011";const char RN16_str[原创 2022-04-23 00:00:00 · 1148 阅读 · 0 评论 -
C语言常用的工具函数(PIE编码发送函数)
在国标GB29768源代码移植修改的符合ISO18000 - 6C协议的PIE发送编码例:导引头为:0-1编码为:其它详见协议规定。代码如下:#define PW 16600 //Tari / 2 = 83us#define MAX_RESPONSE_BYTES 64typedef struct{ uint32_t numBytes; // Nb of full bytes uint32_t numBits; // Nb原创 2022-04-20 21:45:00 · 645 阅读 · 0 评论 -
C语言常用的工具函数(模拟SPI)
C语言常用的工具函数(模拟SPI)#define CLK_DELAY 6 //us (1/2的SPI时钟周期 程序执行带来1us左右误差 1-2 2-3)#define DATA_DELAY 200 //同一帧读写指令之间的间隔#define CMD_DELAY 10000 //不同帧读写指令之间的间隔#define SET_CLK_LOW GPIOA->BRR = (uint32_t)GPIO_PIN_8#define SET_CLK_HIGH GPIOA->BS原创 2022-04-19 00:00:00 · 947 阅读 · 0 评论 -
C语言常用的工具函数(自用一)
C语言常用的工具函数(自用)文章目录C语言常用的工具函数(自用)@[toc]1、查表法计算crc1.1、crc161.2、crc52、字符转换3、长整型和8位字节数组转换3.1、将长整型中的某几位转为8位字节数组3.2、将8位字节数组转为长整型中的某几位4、延时相关函数(基于stm32)4.1、SysTick和nop延时4.2、DWT ns延时原创 2022-04-18 19:43:48 · 4050 阅读 · 0 评论 -
手写rtos视频记录
视频链接:https://www.bilibili.com/video/BV19L411N7NU?spm_id_from=333.999.0.0ARM架构过程调用的标准是AAPCS:参数超过4个变量,用栈传递,否则是R0-R3C函数:R0\R1\R2\R3 随意使用,无需保存R4~R11 先保存\入栈,用完要恢复故意使用R4:register in sum asm(“r4”);中断处理过程:1、保存:硬件自动保存以下寄存器上图,LR是被中断打断的函数所在的地址2、处理:保证不破坏原创 2022-03-26 15:49:31 · 520 阅读 · 2 评论 -
18000-6C整理-入门query/CRC-5
关于session协议包括物理层和标签识别层原创 2021-05-11 18:03:33 · 713 阅读 · 2 评论 -
STM32L4串口不定长接受数据
之前L4串口收到的数据要不有帧头、帧尾或者协议带帧长,纯不定长的想和之前F103一样用IDLE的方式,发现不行都是用IDLE的方式,和之前用的F103还是有区别的,寄存器不一样,改了寄存器还是收不到正确数据,L4系列所提供的固件库中没有对该标志位的检测,需要我们自行添加在stm32l4xx_hal_uart.c文件中添加以下代码:参考文章思路也是借助IDLE的方式,但没有用RXNE,直接库函数HAL_UART_Receive_IT,所以用的时候要开一下串口中断使用参考文章指针的.原创 2021-04-29 14:54:39 · 742 阅读 · 0 评论 -
nodemcu调试lua语言,esp8266和onenet通信
ESPlorer.jar点击open就闪退 https://www.jianshu.com/p/a2482b542f45原创 2021-04-08 21:21:45 · 921 阅读 · 0 评论 -
LORA SX1278做的收发设计 检测温湿度显示到oled
/*===========================================================================* 函数 :SPI_ExchangeByte() => 通过SPI进行数据交换 ** 输入 :需要写入SPI的值 ** 输出 :通过SPI读出的值 .原创 2021-04-07 18:47:48 · 676 阅读 · 1 评论 -
SYN531R 433M解码程序
#define _start_us_min 160 //9ms#define _start_us_max 240 //12ms#define _num0_us_min 18 //0.8ms#define _num0_us_max 28 //1.4ms#define _num1_us_min 4 //200us#define _num1_us_max 12 //600usvoid soft_count_433m(void);void so.原创 2021-03-04 11:43:29 · 3558 阅读 · 7 评论 -
rtthread AT指令下发程序
本来想用现成的AT组件的,结果发现添加后,程序压缩后还比原来大了20k,可能是因为下图几个服务层都选中了,AT和SAL是自动选中,libc不选中会出现[makefile:87: rtthread.elf] 的报错。程序太大了,单片机放不下了,只能自己写了一个简易的at下发程序,在之前串口不定长基础上,参考往期博客rtthread串口接收不定长数据 具体如下:struct rt_semaphore at_rx_sem2;char at_rx_data[50];/****at指令下发及检..原创 2021-02-25 18:18:23 · 1193 阅读 · 0 评论 -
rtthread iic读取M24C64的测试程序
先加软件包下面两个参数根据实际情况修改修改board.h里面的引脚定义添加驱动/********EEPROM掉电保存*********/uint8_t IIC2_WriteBuffer_Test[16], IIC2_ReadBuffer_Test[16];void iic_write_test(void)//iic写{ uint16_t i; for(i=0; i<16; i++) IIC2_WriteBuffer_Test[i原创 2021-02-23 11:32:33 · 1197 阅读 · 1 评论 -
rtthread串口接收不定长数据
之前做过DMA加串口空闲中断的方式接收不定长数据,想移植过来,但是那样的话就用不上rtthread自带的信号量这个内容了,于是基于信号量做了一个不定长接收的功能,基本思路是用两个字节间的时间间隔来做区分两帧的依据,用信号量好处不用另外开定时器,代码如下:#define SAMPLE_UART4_NAME "uart4" /* 需要操作的设备 */static struct rt_semaphore rx_sem4; /* 信号量 */static rt_原创 2021-02-03 19:56:32 · 4329 阅读 · 4 评论 -
RT-Thread完整版入门
先入门RT-ThreadStudio参考比较常用的项目编译碰到一些奇怪问题,可以清理一下再全部构建试一下常用的快捷键,鼠标放到在某个函数上点一下,按F3进入函数体内,或者按住ctrl点击函数;Alt+左键,返回上一级;ctrl+H进行搜索;ctrl+/进行注释,再点一次取消注释关于串口的dma,下面这么写,串口2是没问题的,串口4会报错'UART4_RX_DMA_INSTANCE' undeclared (first use in this function) ua...原创 2021-01-14 17:19:08 · 3607 阅读 · 1 评论 -
使用cubemx移植RT-Thread Nano
参考没有提到的是要把系统时钟源换一下,可以换到定时器1或其它,因为系统时钟被RTT用了,会冲突点击跳转时下图问题,.s文件是组合语言源代码,汇编居多,一般是C编译产生的中间代码 关于context_rvds.s参考解决方法:把文件类型换成二进制格式再编译一下注意在board.c上除了添加#include "main.h" 还要添加extern void SystemClock_Config(void);关于动态线程和静态线程参考关于时间片和线程优先级如果在主线程m..原创 2020-12-31 18:02:07 · 684 阅读 · 0 评论 -
单片机NV区连续读写的操作及 Segment XDATA_HEAP must be defined in a segment definition option (-Z, -b or -P)
stm32写: uint8_t* flash_buff; uint8_t flash_data[50]; HAL_FLASH_Unlock(); //HAL_FLASH_OB_Unlock(); flash_buff = (uint8_t *)malloc(200); // 分配200个字节的内存空间,用来存放wifi信息(100)和TCP信息(50) memcpy(flash_buff, CWJAP, strlen(CWJAP).原创 2020-12-11 11:14:03 · 610 阅读 · 1 评论 -
无线修改zigbee的panid和信道
先通过协调器修改终端panid,再通过串口修改协调器paniduint8 RstFlag = 0;void Send_PANID() { uint16 panid; uint8 channel; panid = (CMD_ID[9] << 8) + CMD_ID[10]; _NIB.nwkPanId = panid; NLME_Upd原创 2020-11-16 16:59:37 · 1265 阅读 · 0 评论 -
stm32L4的flash读写问题 CUBEMX
CB系列flash是128K,起始地址一般是0x08000000 考虑到前面要放代码 可以选在0x0801FC00,还差1K到边缘,即最后一页一般来说:HAL_FLASH_Unlock(); //擦除HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *PageError); //解锁HAL_FLASH_Program(uint32_t TypeProgram, uint32_.原创 2020-06-07 23:18:42 · 5624 阅读 · 0 评论 -
将指定长度的字符串插入到另一个字符串的指定位置-C语言
/******************************************************************************** @fn Insert_String ** @brief 将指定长度的字符串插入到另一个字符串的指定位置** @param oldstr 旧字符串; instr[] 插入的字符串;location 插入的位置; length 插入的数据长度** @return no***********************.原创 2020-06-05 20:31:57 · 1314 阅读 · 0 评论 -
一个可以蜂鸣器提示的小函数
void BUZ_PRO_FUN(uint8_t beep_num, uint8_t beep_per)//蜂鸣器处理函数 响次数和周期 100ms单位{ static uint8_t Beep_Num, Beep_Time, Beep_Flag;//响的次数,时钟,响的有效标志 if(beep_per != 0xff)//放在定时器下面时,形参就是0xff,只为了用定时器当时钟 Beep_Flag = 1; //收到有效形参,蜂鸣器开始工作 if(Beep_Flag == 1) { .原创 2020-06-04 18:21:48 · 1034 阅读 · 0 评论