stm32
文章平均质量分 61
我是标同学
我非常喜欢编程
展开
-
嵌入式单片机实现printf函数的原理
专门用arm的,比如我们的开发板没有 键盘和屏幕 ,但是,使用半主机模式后,我们就可以利用仿真器或其他连接到电脑(主机),使用电脑(即主机)的屏幕和键盘通过printf() 和 scanf() 来与开发板交互。是一个压缩库,而微库中的printf() 和 scanf() 函数 就不是工作在半主机模式下的),其实keil就是在编译参数里传入了一个。,我们只需要把这个字符输出函数给重新实现为我们的单片机串口输出函数,就可以实现 printf函数 功能了。标准库的 printf函数 能方便的输出格式化的字符串。.原创 2022-08-18 14:21:01 · 1357 阅读 · 1 评论 -
stm32中内联汇编内嵌汇编内在汇编使用
stm32在keil IDE中,默认使用的是armcc编译器,因此下面的语法,都是针对该编译器而言的,如果是针对gnu gcc编译器,有些不同,可以看我之前这两篇文章:https://biao2488890051.blog.csdn.net/article/details/118518236GCC内嵌汇编与C语言相互调用(一文读懂)_biao2488890051的博客-CSDN博客_arm c内嵌汇编内联汇编这是在c语言函数内部嵌入一段汇编指令,但是里面用到的寄存器必须先以变量形式声明,但是原创 2022-01-15 12:01:15 · 2425 阅读 · 0 评论 -
stm32 thumb指令BL label跳转转机器码c语言算法
BL label指令固定为32位的长度(thumb模式下的32位),因为这是一个长跳转指令BL label跳转原理是:BL 指令中,存储的是当前所在地址和目标地址label的偏移信息,因此这条指令对应的机器码依赖于当前所处的地址,和目标地址,转换算法如下://制作 BL xx 跳转指令的机器码,//address:执行这个 BL xx 指令时候,处于哪个地址//entry:跳转的目标地址,就是xxunsigned int NE_MakeBLmachineCode2(unsigned int原创 2022-01-14 19:31:39 · 1098 阅读 · 0 评论 -
arm cortex-m stm32启动说明和ram中运行程序特别注意点
cortex-m启动说明复位后,cotex-m3一定是从0x0取msp,从0x4取pc。stm32提供了boot0和boot1两个引脚,控制将哪儿的存储区域映射到0x00地址来,也就决定了cpu如何运行,原理为:根据这两个引脚电平不同,地址转换器(电路实现,只要通电的,这个地址转换器就在工作)映射(其实叫做取别名也行)不同的地址到0x00地址来,这样的话,0x00地址开始的内容就是我们映射过来的内容了。启动空间(boot space):就是上电后,要执行的代码这里举个例:当bo.原创 2022-01-14 14:34:08 · 2012 阅读 · 2 评论 -
stm32程序编译后map文件函数地址和函数实际运行地址不一致问题探究
1. 先描述一下情况stm32f103,keil-mdk编译后,生成的map文件如下,发现编译出来的所有函数地址,竟然是奇数地址运行调试,实际情况如下,发现调试器显示(或者直接查看内存区),显示的函数地址如下,竟然都是偶数地址了,和上面的地址相差1,每个函数都是如此。那么程序的编译地址和实际在存储器中运行的地址不一致?为什么呢。为了回答这个问题,我们先来学一下基本相关知识2. 基本相关知识指令集方面:arm一般高端处理器,比如cortex-a系列,都是32位的arm指原创 2022-01-08 00:40:02 · 3391 阅读 · 2 评论 -
stm32进入硬件错误中断hardfault的原因剖析以及如何定位(必看)
指令集方面:arm一般高端处理器,比如cortex-a系列,都是32位的arm指令。而cortex-m0,1,3,4等低端处理器,也叫做单片机,为了增加代码密度(同样存储器内可以存更多指令),用的是thumb指令集(而且仅支持这个指令集),这个指令集大多数指令是16位的,少数是32位的。这就是为什么上面的调试图中,看到指令都是两个字节,而有的是4个字节。比较老的arm7,arm9等处理器,支持thumb指令和arm指令,需要通过指令告诉处理器,显式的进行指令转换,这个因此需要编译器提供支持。注意:stm原创 2022-01-08 00:17:02 · 10632 阅读 · 0 评论 -
关于arm处理器stm32启动过程启动文件详解(本质刨析)
编译器编译后,生成的是一个xx.bin文件,如下图:左边的是编译器生成的目标文件,存放在外存中,其中Text_start等标识符,编译器会自动给出,汇编里面直接引用是可以的。启动的过程:(启动文件要做的,也是CPU上电后就运行的程序)CPU把Data段和Bss段分别搬运到内存RAM中即可,Text段不用搬,因为是代码段,只需要读取即可。 跳转到外部出口函数,一般就是main函数了,就进入了用户世界了。我们打开stm32官方的启动文件,发现如下:(是跳转到了__main函数,并没有..原创 2021-12-16 15:06:43 · 1607 阅读 · 1 评论 -
stm32f407探索者串口2无法发送数据问题
我们为了实现串口2通信,往往都是从原子的例程串口1通信改过来的,但是,特别要注意,时钟总线,是不一样的特别注意:上面是不对的,串口1挂在APB2上,而串口2应该是挂在APB1上的...原创 2021-10-27 16:52:42 · 1393 阅读 · 1 评论 -
keil5MDK中代码提示设置
把代码补全设置为1个字母,这样没敲一个字母,都会出来提示了,但是仍然有个问题,加入中途输错了,那么得删除完,重新输入这个单词,才会出现提示,很不方便的,其实,默认有个快捷键(无法在快捷键中设置的)ctr+alt+space,可以手动控制出现代码提示,非常方便,但是win10系统该快捷键刚好会发生输入法切换,导致代码提示不出来了,因此我们需要关闭系统中该快捷键导致的输入法切换,如下图:取消勾选即可...原创 2021-09-11 20:02:31 · 17123 阅读 · 13 评论 -
stm32修改编译链接地址烧录下载后照样能正常运行原因
如下图所示:我们修改为合理的地址,照样能直接运行,如果从理论分析,此时中断向量表位置不同了,cpu上电后怎么知道正确的复位中断起始地址呢?(我们设了中断向量表偏移也是等到了该程序运行起来才设置的呀),这个原因应该是烧录器ST-Link的功能,它能知道我们烧录的镜像文件的链接地址,从而直接把该文件烧录到单片机指定地址,然后让pc指针直接指向链接地址那儿???上述解释也不合理,因为开关机后,程序还是能正确运行(没有ST-Link介入),难道是stm32 cpu内部有固化的bootrom程序???原创 2021-06-30 23:50:31 · 566 阅读 · 0 评论 -
assert_param函数的用法,通俗易懂
assert_param函数的用法在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用。如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义;在固件库中,它的作用就是检测传递给函数的参数是否是有效的参数。举例说明: assert_param(IS_USART_ALL_PERIPH(USARTx)); 这句代码用于检查参数USARTx是否有效,其中IS_USART_ALL_PERIPH(US转载 2021-02-01 12:15:00 · 21830 阅读 · 2 评论 -
stm32液晶屏字符串显示自动换行精简版
我的是战舰开发板stm32f103,屏幕是320*480的,正点原子提供的驱动显示函数如下://显示字符串//x,y:起点坐标//width,height:区域大小 //size:字体大小//*p:字符串起始地址 void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p)//显示数字,高位为0,则不显示//x,y :起点坐标 //len :数字的位数//size:字体大小/...原创 2020-10-26 17:23:27 · 2289 阅读 · 0 评论 -
stm32函数内定义了大数组堆栈溢出tft液晶屏幕显示异常
笔记一我产生的奇怪现象是:外层循环i变量被自动改了值,各种调试后发现,是我不同头文件定义了相同宏MAX_NUM_TASK,各种调试精确定位后发现,是函数内申请了一个50元素的的结构体数组,大约1.5KB,超过了默认的栈大小。当超过了栈大小后,这个不会报错,但是运行时候相当于是把内存分配到了已经用到的变量或者区,就覆盖了,赋值后,就覆盖修改了其他变量的值,导致发生莫名其妙的现象发生。关于函数运行时候的栈动态变化过程,看我这篇文章C语言函数调用时候内存中栈的动态变化详细分析。可是,在startup原创 2020-10-26 00:16:39 · 1618 阅读 · 1 评论 -
keil mdk代码提示快捷键
ctrl+alt+空格原创 2020-10-25 17:55:42 · 2727 阅读 · 2 评论 -
stm32 keil MDK 调试窗口变量查看遇到的问题记录(重要!!!)
某个变量没用到,仅仅计算出来了而已,调试时候,在变量窗口不会显示出该变量的值,如果用到了,比如那句printf函数有效,那么窗口就能显示出此变量的值了,应该是该mdk软件智能化了?还是咋滴,反正我感觉反而这样不好用。反之我测试了visualstudio和qtcreator都不是这样,都是一样的正常显示变量的值。补充一句,visualstudio新建c++项目时候,就建一个win32控制台应用程序,然后不要选空项目,就让它自带一个stdafx.h这样的头文件,因为它里面给你包含了需要常用的头文...原创 2020-08-02 17:57:47 · 3211 阅读 · 6 评论 -
stm32中printf整形和浮点型会进入硬件错误中断
printf("%d,%lf",i+1,0.2);这样用,会进入硬件错误中断printf("%d,%f,%f",i+1,0.2,0.3);这样也会double dbl=0.2;printf("%f",dbl);也不行printf("%5f",dbl);也不行连着打印两个float或者double型变量就可以,反之就是很多异常,解决方法如下,把使用微库给勾上吧,这样应该就能很好的支持printffloat,double等类型了,补充一下,打印出来的都是6位小数,加了%lf也是6位,..原创 2020-08-02 12:00:41 · 2161 阅读 · 0 评论 -
stm32调试时候无法打断点且无法进入main函数
这是因为编译输出的文件中得勾选上Debug Information这个选项,如下图所示:原创 2020-01-08 22:32:14 · 1835 阅读 · 0 评论 -
STM32硬件错误HardFault_Handler的处理方法
在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真程序会停在HardFault_Handler函数里的死循环while(1)中。这说明STM32出现了硬件错误。STM32出现硬件错误可能有以下原因:(1)数组越界操作;(2)内存溢出,访问越界;(3)堆栈溢出,程序跑飞;(4)中断处理错...转载 2019-12-18 20:50:39 · 936 阅读 · 0 评论 -
“* error 35: undefined line number,BS \Template../../User/mp3.c\834, 1”错误
“*error 35: undefined line number,BS \Template../../User/mp3.c\834, 1”在线调试仿真这样的错误是因为编辑了代码,但是没有编译,就再次进入调试界面了,这样运行到这一行后就会提示这样的错误,那就编译一下再仿真就行了...原创 2019-12-13 21:48:45 · 8615 阅读 · 2 评论 -
关于stm32单片机开发的mdk配置和deepin qt配置
介绍几点:keil专门为ARM单片机开发了IDE,就叫做MDK,mdk是keil5+的版本,可以看作是keil3,4等版本的升级版。 mdk比较经典的是mdk5.14版本,好多stm32f103教程都是自带的这个版本,但是这个版本我觉得还是不够友好,比如没有变量选中高亮所有同名变量,这样就不太方便变量定位了,还有代码智能提示功能也不够强,可能是因为我用过了很多出色的IDE,vs,eclips...原创 2019-11-30 11:40:15 · 1406 阅读 · 0 评论 -
一段文件(或者flash芯片)数据如何加载进一个c语言结构体内
这是stm32h7汉字显示实验把一个结构体内的数据写入一个flash:W25QXX_Write((u8*)&ftinfo,FONTINFOADDR,sizeof(ftinfo)); //保存字库信息因为c语言一个结构体的数据(成员)在内存中式顺序连续存放的,那么我们只要知道这个结构体的首地址,就可以得到这个结构体变量的所有内容,然后写入外存(flash)指定的地址(FONTI...原创 2019-04-25 20:41:08 · 1006 阅读 · 0 评论 -
嵌入式处理器中Bootloader程序是什么以及IAP设备固件更新原理
Bootloader程序也是一个单片机程序,编译后也是一个hex文件,然后下载到内部flash的前面区域1.选择启动处在内部flash后面区域1的app1还是区域2的app2,然后把cpu运行指针加载到对应app的第一行代码那儿2.假如用户选择了读app2,但是cpu不断从flash(这里的flash应该是指外部flash,读取速度比较慢,就比如电脑的硬盘)那儿读取指令然后译码执行可能速度...原创 2019-04-27 00:34:10 · 1216 阅读 · 1 评论 -
嵌入式微处理器结构和上电启动到开始运行程序的过程讲解
我们首先来了解一下微处理器的结构:(原谅我把微处理器称为单片机,叫法有问题,我明天改,里面最核心运算单元称为cpu,可能这样术语不是很准确或者比较俗气,但是我都是为了我更加通熟易懂的解释清楚这些问题)现在的处理器内核基本上都是arm公司设计的,主要分为三种:context-A系列(属于应用处理器内核,主频很高,1Ghz左右(即每秒可以计算1亿次),运算性能很强,多核,但是中断响应慢毫秒级别...原创 2019-04-28 00:49:41 · 3075 阅读 · 4 评论 -
计算机内存保护原理
内存保护单元(memory protection unit),简称:MPU。使用 MPU 可以设置不同存储区域的存储器访问特性(如只支持特权访问或全访问)和存储器属性(如可缓存、可共享),从而提高嵌入式系统的健壮性,使系统更加安全MPU,即内存保护单元,可以设置不同存储区域的存储器访问特性(如只支持特权访问或全访问)和存储器属性(如可缓存、可缓冲、可共享),对存储器(主要是内存和外设)提...原创 2019-04-28 10:35:27 · 5469 阅读 · 0 评论 -
stm32h743单片机嵌入式学习笔记1-,DMA
Code:表示程序所占用 FLASH 的大小(FLASH)。RO-data:即 Read Only-data,表示程序定义的常量,如 const 类型(FLASH)。RW-data:即 Read Write-data,表示已被初始化的全局变量(SRAM)ZI-data:即 Zero Init-data,表示未被初始化的全局变量(SRAM)想了解具体stm32存储分配结果的,看我这篇文章,...原创 2019-04-23 20:02:08 · 675 阅读 · 0 评论 -
stm32h743单片机嵌入式学习笔记2-单片机获取电容触摸屏原理
* 单片机获取电容触摸屏(7寸 800x480为例)原理:液晶屏的显示和触摸是分开的两个东西,分开用数据线进行传输数据的,也就是他们两个是没有任何关系的。上图是液晶屏的触摸控制线应该是spi通信,用于返回触摸坐标数据的(那么触摸数据肯定是液晶上面有个IC芯片加工的),如果有触摸屏幕发生,T_PEN这根数据线会变成低电平,那么就可以通知单片机的引脚了,单片机可以通过外部io中断的方式获取...原创 2019-04-23 23:00:55 · 1179 阅读 · 0 评论 -
stm32之启动文件分析
https://mp.weixin.qq.com/s?__biz=MzU5MDg4MTIyNQ==&mid=2247483683&idx=1&sn=67b1d818bb881d978e59191ad9096eb4&chksm=fe36c985c941409332bd6994acdae0bd5557a0daa86f3e8571d8a0b31c021a5b452b6b3...转载 2019-05-03 21:18:46 · 813 阅读 · 0 评论 -
stm32h743单片机嵌入式学习笔记3-内存管理原理
都是要实现 2 个函数:malloc 和 free;malloc 函数用于内存申请,free 函数用于内存释放。从上图可以看出,分块式内存管理由内存池和内存管理表两部分组成。内存池被等分为 n块,对应的内存管理表,大小也为 n,内存管理表的每一个项对应内存池的一块内存。内存管理表的项值代表的意义为:当该项值为 0 的时候,代表对应的内存块未被占用,当该项值非零的时候,代表该项对应的内...原创 2019-04-24 09:49:26 · 3865 阅读 · 3 评论 -
stm32h743单片机嵌入式学习笔记4-文件系统FATFS
FAT32 文件系统 就是在格式化的时候 选择 FAT32 方式格式化。然后在 SD 卡存储区会产生一个类似于 目录 的文件系统。这样存入 SD 卡中的所有 文件 文件夹 都会在这个目录中找到。找到的是该文件或文件夹的 开始簇 和 结束簇 文件名 文件大小 文件类型(如.txt .bin .bmp)等等。所谓的这个目录 就是我们经常讲的 SD 卡根目录将整个 SD 卡根目录里的所有文件...原创 2019-04-24 10:39:27 · 1014 阅读 · 0 评论 -
stm32h743单片机嵌入式学习笔记5-液晶屏汉字库原理
液晶屏使用的汉字库的原理:*每个汉字由多个点组成,即点阵,比如16号字体(实际上电脑对字号的叫法和点阵大小不一样,实际上这个电脑成为12号字体,原谅下面我也叫16号字体),就是16*16的点阵,即32个字节的数据,那么每一个字体的点阵由点阵取模软件可以得到*同号大小字体所有汉字取模后的点阵数据顺序往后存放,那么我们怎么找到每一个汉字对应的点阵数据呢,然后进行液晶屏画点函数即可显示出该函数,...原创 2019-04-24 17:35:54 · 1256 阅读 · 5 评论 -
stm32h743单片机嵌入式学习笔记6-压缩图片解码原理
软件解码:JPEG/JPG 的解码过程可以简单的概述为如下几个部分:1 、从文件头读出文件的相关信息。JPEG 文件数据分为文件头和图像数据两大部分,其中文件头记录了图像的版本、长宽、采样因子、量化表、哈夫曼表等重要信息。所以解码前必须将文件头信息读出,以备图像数据解码过程之用。2 、从图像数据流读取一个最小编码单元(MCU) ,并提取出里边的各个颜色分量单元。3 、将颜色分量...原创 2019-04-25 00:07:13 · 2005 阅读 · 0 评论 -
stm32h743单片机嵌入式学习笔记7-FPU
* FPU 即浮点运算单元(Float Point Unit)。浮点运算,对于定点 CPU(没有 FPU 的 CPU)来说必须要按照 IEEE-754 标准的算法来完成运算,是相当耗费时间的。而对于有 FPU 的 CPU来说,浮点运算则只是几条指令的事情,速度相当快LDR.W R0, =0xE000ED88 ; 使能浮点运算 CP10,CP11LDR R1,[R0]ORR R1,R1,...原创 2019-04-25 00:45:30 · 2748 阅读 · 2 评论 -
stm32h743单片机嵌入式学习笔记8-avi视频解码
*AVI 格式允许视频和音频交错在一起同步播放,支持 256 色和 RLE 压缩,但 AVI 文件并未限定压缩标准,AVI 仅仅是一个容器,用不同压缩算法生成的 AVI 文件,必须使用相应的解压缩算法才能播放出来。比如本章,我们使用的 AVI,其音频数据采用 16 位线性 PCM 格式(未压缩),而视频数据,则采用 MJPG 编码方式。* 视频文件信息头这里有很多我们要用到的信息,比如...原创 2019-04-25 11:17:44 · 3415 阅读 · 0 评论 -
Error: Encountered an improper argument”的解决方法
最近在使用MDK调试STM32控制器,当下载完成,需要使用ST-LINK进行程序仿真时。MDK偶尔会出现错误提示“Error: Encountered an improper argument”。大概意思是说“错误:遇到不正确的参数”。出现这种情况时,对话框关掉之后会再次出现,只能使用任务管理器强制停止才行。我使用的MDK的版本是V5.25.2.0。在官网上查一下这个错误信息,原来是Keil软件的...原创 2019-05-09 21:03:26 · 2524 阅读 · 0 评论 -
正点原子液晶屏汉字显示实验的最低端字符无法显示问题的程序bug
这里用的正点原子的例程汉字显示实验屏幕分辨率是480*800的,按道理说,我这样是在最低端显示出来我们可以看到字幕S并没有显示出来,汉字倒是显示出来了,让我觉得很奇怪,后来去看了源码,发现是例程的bug,原子的程序写错了一点首先来看Show_Str函数会调用到什么函数,显示字符串里的字母调用的是LCD_ShowChar函数,显示汉字调用的是Show_Font函数,如下:...原创 2019-05-09 22:58:10 · 1955 阅读 · 0 评论 -
stm32驱动液晶屏如何实现字符串自动换行和翻页循环显示源码
我写了大半天的程序,从像素位置显示字符串函数开始一点点调试改来的,我这里只做了32*32的字体实现,可以参考本程序,实现12,16,24等字体的这个功能,先看一下使用说明:我封装出来的函数:// x:0-14,y:0-24,单位是每个字32像素的个数,改造成LCD1525这样的屏幕,我的屏幕是480*800,总共显示15x25个汉字(类似带字库的LCD12864屏幕那样的显示方式),支持自...原创 2019-05-10 00:48:24 · 6286 阅读 · 1 评论 -
stm32驱动LCD12864液晶屏驱动程序,亲测可行,复制直接能用!
废话不多说,直接贴程序,你自己复制过去即可,免得我通过把工程上传的方式,你下载还得需要c币,这个现在很贵呀!!!就两个文件,LCD12864.h和LCD12864.c,自己复制过去后,改一下引脚即可(如果你连改引脚都不会,那你看来是初初学者,那你自己百度吧),单片机主频:72MHZLCD12864.h如下所示#ifndef __LCD12864_H#define __LCD12...原创 2018-11-14 20:31:17 · 37999 阅读 · 32 评论