- 博客(23)
- 收藏
- 关注
原创 【Python】用python实现编译脚本
这个脚本可以自动扫描目录下的.c和.s文件并编译,同时生成hex和bin文件。,可以代替Makefile工作。cortex-m 单片机。
2024-04-18 19:02:09
370
原创 【C语言算法】C语言实现信号槽
前段时间使用qt做了个项目,了解到信号槽这种机制,在解耦合和程序设计的方便程度上体现出极度的优雅与从容.现在回到单片机程序开发上来,感受到之前的单片机程序写的还不够优雅,使用函数指针能够实现解耦合,但需要设置回调函数,而且不同的模块设计的回调函数不尽相同,最大的痛点是实现异步调用非常复杂,与优雅二字基本是毫无关联了.本文旨在优雅地实现信号槽机制.
2023-04-30 11:49:26
770
原创 【C语言算法】前馈神经网络实现手写数字识别
前馈神经网络是一个最简单的神经网络模型,每层神经元采用全连接的方式与下一层神经元相连接,信号的传递方向是单向的.如图所示:本文主要介绍使用C语言实现前馈神经网络的方法并通过训练实现一个识别手写数字的效果.
2023-02-15 23:02:54
1751
11
原创 STM32关于使用定时器来实现串口通信的整活实验
目录一、整活说明二、原理简介先说接收发送数据优化三、实验条件和目标条件目标四、掉头发环节1.定义串口类2.定义简单宏3.定义私有数据4.init 函数5.其他接口函数6.中断函数7.接口导出五、验证一、整活说明在帮别人做项目的时候,写着代码唱着歌,突然就遇到硬件工程师把线连错了,串口模块连接的不是UART引脚,项目就这样暂停了吗?这能忍吗????这不能忍啊!作为一个资深(咸鱼)软件工程师务必不能被这种小事绊住手脚,项目还是要进行下去,所以就有了这次整活。二、原理简介串口原理就不重复了,直接网上随便一
2022-04-23 11:34:43
8286
3
原创 RPC(远程过程调用)基于单片机的极简实现
目录一、定义二、应用场景三、验证1、实验条件2、制定协议1)数据传输协议2)函数调用协议3、传输层4、RPC协议解析程序1)从机端程序2)主机端程序5、编写RPC函数1)从机端函数编写2)主机端函数编写6、RPC函数调用示例四、现象一、定义RPC(Remote Procedure Call)远程过程调用。假设一个系统中有两个cpu,暂且称为A和B,分别运行着自己的应用程序,当A执行到某功能时需要B配合才能完成,这在程序里就体现为A需要调用B中的方法。RPC就是实现这种CPU间方法调用的协议。二、应用场
2021-05-13 11:59:26
2573
原创 STM32 实现类似手机运行APP的方法(篇五:动态链接)
目录一、简介二、系统程序修改1、添加 sys_api.h 文件2、建立系统API函数表三、APP程序修改1、api_table.s2、sys_api.h3、api调用一、简介动态链接 是一种在运行时链接函数地址的技术,程序运行时在内存中建立函数表,其他程序可以通过这个函数表来调用函数。据我了解,windows、linux使用的动态库就是使用这个方式实现的。由前面几篇文章了解到,单片机环境中app调用系统函数api可以使用 --symdefs=syscall.sym 命令来输出函数符号表,这种方式的缺点
2021-03-12 11:55:19
3853
8
原创 keil环境下实现C语言基本输入输出库
目录一、前言二、编写前的软硬件环境三、分段加载四、头文件编写五、C文件编写1、类型定义、全局变量定义和库初始化2、定义 fopen 函数3、定义 fclose 函数4、定义 fgetc 函数5、定义 fputc 函数6、定义 fread 函数7、定义 fwrite 函数8、定义 fseek 函数9、定义 ftell 函数10、定义 feof 函数11、一些其他函数的定义六、设备文件示例一、前言在基于单片机软件开发一些比较大的项目的时候,难免需要移植一些开源软件,由于开源软件都是基于c语言标准库开发的。由
2021-03-10 11:11:54
2278
3
原创 使用单片机给nrf52832蓝牙芯片软件升级
目录需求原理简单介绍流程电路要求软件编写简要说明1、编写 ram BootLoader2、编写 SWD接口驱动3、编写从机用户程序代码4、编写下载从机程序的代码需求在实际项目中使用MCU+蓝牙芯片的方式给产品添加蓝牙功能,由于蓝牙芯片要跑协议栈和一些用户代码,MCU也要跑应用代码,这样一来软件升级就成了一个棘手的问题,分别给蓝牙芯片和主控MCU做软件升级显然对量产十分不友好。例如:笔者在一个腕表产品的项目中使用了GD32F450+NRF52832的方案,而生产时给蓝牙芯片升级软件非常繁琐,需要在电路板
2021-02-14 15:56:06
1877
原创 Cortex-M单片机中 setjmp、longjmp原理探究及实现
setjmp、longjmp原理探究及实现一、原理1、实验2、猜想二、实现三、调用四、总结一、原理C语言中包含头文件 <setjump.h> 即可实现跨函数跳转,通常用于异常处理,在运行代码出现异常时可以自动跳转到调用setjump函数的位置。1、实验#include "setjmp.h"jmp_buf g_jmp_buf;int div__(int a,int b){ if(b==0) { longjmp(g_jmp_buf,1); }
2020-10-25 14:32:17
1697
原创 C语言实现中文BGK、UNICODE、UTF8之间的编码转换
C语言实现中文编码转换一、GBK、UNICODE、UTF8之间编码的关系二、UNICODE、UTF8之间转化实现三、UNICODE、GBK之间的转化四、编码对照表五、完整代码一、GBK、UNICODE、UTF8之间编码的关系GBK:GBK全名为汉字内码扩展规范,英文名Chinese Internal Code Specification。GBK 采用双字节表示,总体编码范围为8140-FEFE,首字节在81-FE 之间,尾字节在40-FE 之间,剔除 xx7F一条线。总计23940 个码位,共收入218
2020-10-24 19:37:13
16495
5
原创 STM32 实现类似手机运行APP的方法(篇四:中断服务)
目录一、APP中的中断函数二、系统工程的修改三、APP工程的修改四、实验现象一、APP中的中断函数1、本来以为经过前3篇文章的说明,stm32运行APP的功能已经实现了,但是在今天编写app代码的时候总感觉差点什么,由于需要写一个支持串口收发数据功能的app,发现不能实现接收串口数据,因为app不能定义中断服务函数(中断服务函数全部弱定义在stm32_startup.s文件中),想到安卓手机app开发有一种叫做监听的做法,监听到某事件发生是自动执行一段代码,本文将实现类似功能。二、系统工程的修改新建
2020-09-04 22:59:13
1533
2
原创 STM32 实现类似手机运行APP的方法(篇三:示例程序)
目录一、前提二、编写并编译示例代码三、运行一、前提1、要保证编写的app文件能够正常运行除了前面所提到的设置之外,编译程序的先后顺序也非常重要,系统程序先编译,然后再编译APP程序,如果系统程序因为一些修改而重新编译,则APP程序也必须重新编译,因为生成的syscall.sym文件中的函数地址会随着系统工程的重新编译而更新。2、如果要在APP中调用在系统程序中声明过但未使用的函数,为了防止被编译器优化掉,可以在系统工程中"C/C++"选项卡中去掉 One ELF section par functio
2020-09-03 22:37:31
3392
原创 STM32 实现类似手机运行APP的方法(篇二:ELF文件解析和APP调用)
一、调用APP遇到的问题在实验中,系统可以直接运行Keil编译出来的bin文件,并且可以正常运行如下代码:include "main_inc.h"const char g_txt[]="g_txt from app\r\n"int my_main(void){ printf("txt from app\r\n"); printf(g_txt); return;}在我重定向printf函数到串口之后,在电脑端的串口助手正常收到了字符串。但是运行如下代码时却不能打印正确的字符串..
2020-09-03 19:09:24
2771
4
原创 STM32 实现类似手机运行APP的方法(篇一:位置无关和系统函数调用)
目录一、原理二、环境三、编译器配置一、原理运行APP的原理是把程序从存储器加载到内存中,然后调用其入口函数运行,这样做是因为一般存储器(如SD卡,硬盘等)CPU无法直接寻址,必须先加载到内存等可以直接寻址的存储器上才能运行。单片机的FLASH也可以直接寻址,所以存储在单片机FLASH中的程序不用加载到内存也可以运行。既然要运行APP,有两个问题需要解决:一、如何告知APP,其需要调用的系统函数的地址;二、加载到内存的区域是动态分配的,这意味着每次加载的内存地址不固定,这需要APP代码的运行与其加载位
2020-09-03 16:51:12
4999
5
原创 基于stm32使用NRF24l01广播蓝牙数据
目录前言一、硬件平台二、编写蓝牙兼容代码三、调用四、现象五、总结前言经过分析,发现nrf24l01的无线频段和调制方式和蓝牙是相同的,都是2.4Ghz和高斯键控频移,由此产生了是否可以使用nrf24l01发送蓝牙数据的想法,在网络上搜索发现有人在Arduino上实现了发送蓝牙广播,由此确信使用nrf24l01发送蓝牙数据是可行的。本文章参考了:http://www.github.com/floe/BTLE一、硬件平台为了方便,减少不必要的工作,本文使用正点原子的探索者开发板,并且在《nrf24l0
2020-06-25 18:55:04
4270
3
原创 FreeType移植到 STM32 单片机以支持矢量字体
目录一、准备工作二、复制文件三、添加C文件到Keil中四、修改接口五、调用六、优化七、效果一、准备工作下载Freetype源码 ----- 下载FreeType以移植到Keil 的STM32工程为例移植前的软件环境:1,实现了内存分配函数2,实现了文件系统3,使用了TR-Theard操作系统4,实现了GUI界面,并支持点阵字体的显示5,实现了Unicode,GBK,UTF8字符编码的相互转换二、复制文件解压源码压缩包得到如下文件复制以下文件到单片机工程下如图三、添加C文
2020-05-28 21:14:22
8561
17
原创 在keil环境下实现类似linux中 module_exit module_init的效果
这里写自定义目录标题一,设置keil为使用加载文件二,编写链接脚本三,定义module_exit module_init 宏四,编写统一初始化函数五,编写驱动时在文件中加入类似代码六,在main函数中调用在使用keil开发较大的项目时常常存在驱动之间耦合性太大,增加或减少驱动会涉及到对工程中其他部分代码的更改,比如新增一个驱动需要把初始化代码放到main函数中执行,去除一个驱动又需要在main函数中去掉对应的函数调用,本例方法可降低驱动代码之间的耦合性。一,设置keil为使用加载文件二,编写链接脚本
2020-05-21 21:54:19
1000
1
原创 使用KEIL下载文件到单片机外置存储器的方法
使用KEIL下载文件到单片机外置存储器给单片机下载程序的原理实用性要解决的难点怎样编写bootloader使用KEIL下载文件给单片机下载程序的原理给单片机下载程序一般有两种方法:1,使用厂家提供的bootloader,使用特定软件通过串口等方式下载二进制文件到单片机的内置flash,这种方法的局限性是只能下载到厂家bootloader定义的存储器上;2,使用调试器通过SWD/JTAG接口...
2020-04-02 11:18:18
4935
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人