- 博客(29)
- 收藏
- 关注
原创 关键字static\extern
1.什么定义:定义是给变量或函数分配内存空间,在这同时可以为变量赋初值。2.什么是声明:声明是用来告诉编译器变量的名称和类型,使编译器知道存在着这个变量和类型,且不分配内存。3.结论由此我们可以得出以下两种结论:1.定义会对变量分配内存空间,而声明不会2.由于一个变量的存储空间是唯一的,因此定义不能重复定义,而声明可以重复声明。
2025-06-06 09:32:10
881
原创 结构体指针与非指针 问题及解决
项目使用结构体指针不使用结构体指针(结构体数组)内存管理需自己分配、释放(可能内存泄漏)编译期静态分配,自动管理数据共享可在多个模块间共享同一结构体是拷贝副本,无法共享拷贝开销拷贝指针,开销小拷贝整个结构体,开销可能更大安全性易出错(空指针、悬空指针)更安全,逻辑更直观灵活性灵活,可实现动态注册、释放等功能结构固定,适合数据量已知、场景简单。
2025-06-05 22:38:04
574
原创 LINUX_LCD编程 TFT LCD
一帧数据由多行组成,一行数据由多个像素点组成,每个像素由若干个数据位组成。对于单色显示器,每个像素为1位,称为1bpp,对于256色显示器,每个像素为8位,为8bpp。显示是从左上方开始,一行一行的将每个像素的颜色显示出来,当一行显示数据到最右边是,自动跳至下一列最左边开始执行,当数据至右下角时,调至左上方显示下一帧数据。该图结合下面时序图一起理解LCD时序图其中,VSYNC表示每一帧数据的开始,HSYNC表示每一行数据的开始,VCLK表示传输一个像素的数据。
2025-06-04 16:06:19
679
原创 STM32的BootLoader代码跳转原理
在下面启动文件的向量表中,我们可以可以看到,当系统启动时,第一块访问的地址为__initial_sp,那么在跳转至A区之后,我们首先要做的就是让SP默认值为0x0800A000.在这里SP的大小我们是不知道的,因为这是程序所定义的,但是这个初始值是必须要为A区起始地址处的值,即 *A区起始地址。在Bootoader中,我们将0X08000000作为B区起始地址,将0X0800A000作为A区起始地址,B区负责监测是否需要更新A区程序,若不更新程序,则跳转至A区代码进行运行。然后返回继续执行C代码。
2025-04-26 21:59:19
918
原创 STM32OT固件升级(0)
1:当不存在OTA事件时:运行板子当前程序。2:当存在OTA事件时,对程序进行更新。流程分析:首先需要将STM32的flash分为BA两个区域。B区为bootloader程序。A区域为应用程序。
2025-04-23 09:56:13
294
原创 STM32OTA固件升级(六)xmodem协议
XMODEM协议是一种使用拨号调制解调器的个人计算机通信中广泛使用的异步文件运输协议。这种协议以128字节块的形式传输数据,并且每个块都使用一个校验和过程来进行错误检测。其实就是一种传输协议,对你要传输的文件进行分包,通过串口、SPI、I2C、USB、BLE(低功耗蓝牙协议)、WIFI等各种各样的方式进行传输文件。经过多年的更新迭代,Xmodem衍生出了一下几种系列协议:Xmodem-1kXmodem-CRCYmodemXmodem-1kXmodem-1k。
2025-04-14 17:00:33
608
原创 STM32OTA固件升级(五)
定义一个uint32_t BootStaFlag;他的每一位发生变化,都会导致相应事件的发生。当 BootStaFlag |= UpData_A_Flag;时,代表着更新A区事件的发生,并在main.c中执行相应操作//更新A区//OTA_Info.FireLen[]的每一位代表着一个更新的函数的大小, 比如【1】是电灯函数10KB【2】是串口。。。
2025-04-14 17:00:20
992
原创 STM32OTA固件升级(四)读写内部Flash
在 STM32 芯片内部有一个 FLASH 存储器,它主要用于存储代码,我们在电脑上编写好应用程序 后,使用下载器把编译后的代码文件烧录到该内部 FLASH 中,由于 FLASH 存储器的内容在掉电 后不会丢失,芯片重新上电复位后,内核可从内部 FLASH 中加载代码并运行。
2025-04-14 16:59:48
723
原创 STM32OTA固件升级(一)UART
1)下面两个函数可以实现使用C库的printf和scanf函数,来实现数据的收发///重定向c库函数printf到串口,重定向后可使用printf函数/* 发送一个字节数据到串口 *//* 等待发送完毕 *////重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数/* 等待串口输入数据 */2)下面函数可以实现使用我们自己的u1_printf函数来模拟使用C库的printf函数,二者用法相同uint16_t i;
2025-04-14 16:59:38
824
原创 STM32OTA固件升级(三)SPI读写外部存储W25Q64
*** @brief 对FLASH写入数据,调用本函数写入数据前需要先擦除扇区* @param pBuffer,要写入数据的指针* @param WriteAddr,写入地址* @param NumByteToWrite,写入数据长度* @retval 无*//*mod运算求余,若writeAddr是SPI_FLASH_PageSize整数倍,运算结果Addr值为0*/
2025-04-14 16:59:00
866
原创 LINUX时钟-S3C2440
由以上可知,我们先想要设置FCLK:HCLK:PCLK = 400M:100M:50M = 8:2:1,需要对MPLL(LOCKTIME),CLKDIVN,MPLLCON三个寄存器进行操作。例如:设置MPLLCON寄存器,我们设置MPLL,使得FCLK:HCLK:PCLK = 400M:100M:50M = 8:2:1,有表可知,MDIV=92,PDIV=1,SDIV=1.* 则FCLK = 2*M*Fin/(P*2^S) = 2*100*12/(3*2^0) = 400M。
2023-07-30 20:44:48
265
1
原创 LINUX按键控制LED
由原理图可知,当按键按下时,IO口为低电平,判断按键是否按下,则需要我们对按键所在的IO口进行高低电平的检测,如果为低电平,则表示按键按下。而三个按键EINT0与GPF0相连,EINT2与GPF2相连,EINT11与GPG3相连,所以我们只需要对这三个引脚进行初始化即可。由LINUX点亮LED可知,LED的点亮可以说是IO口进行输出,那么对于按键来说,便是对IO口输入功能的配置。链接:https://pan.baidu.com/s/1lNElpsQEtmNIeUbdVm5pDQ。
2023-07-28 15:38:53
389
1
原创 关于中断标志位清零
今天在使用中断设置按键单双击用法时,第一次编程如下void KEY2_IRQHandler(void){ int a=0; //确保是否产生了EXTI Line中断 if(EXTI_GetITStatus(KEY2_INT_EXTI_LINE) != RESET) { key_2++; //检测key1按键 是否松开 while(GPIO_ReadInputDataBit(KEY2_INT_GPIO_PORT,KEY1_INT_GPIO_PIN) == 1); whi
2022-01-03 21:19:00
5819
原创 Linux文件搜索命令
(在Linux中,以#开始的行,都是配置文件的注释行)1)find文件搜索2)locate在文件库中搜索3)which查找一个文件所在的目录,别名4)grep对文本文件内容进行搜索 文件搜索命令 find 从指定目录向下递归地遍历各个子目录,将满足条件的目录或文件显示在终端1)按名字查找find /etc -name init只会搜索init的内容f...
2021-11-29 21:50:59
990
原创 Linux文件管理命令
命令格式 命令 【-选项】【参数】 例如:ls -la /etc 注:个别命令不遵循此 当有多个选项时,可以写在一起 简化选项与完整选项 -a == --all1)pwd显示当前目录的绝对路径2)cd切换目录3)ls 显示目录文件4)mkdir新建一个目录 touch新建一个...
2021-11-15 23:02:56
425
原创 Linux时间管理指令
1)date 查看系统当前时间2)cal 查看日历 date date观看服务器系统的时间date +%Y显示当前年份date +%m显示当前月份date +%d显示当前时那一天date "+%Y-%m-%d %H:%M%S"显示年月日时分秒date -s "2021-11-11 11:22:22"将日期设置位2021年11月11日11时22分22秒 2)cal ca...
2021-11-11 22:03:32
571
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人