STM32
文章平均质量分 56
木十化
尽量写多点哈。
展开
-
STM32中关于串口中断的调试(不断进入发送中断的原因)
说来惭愧,前日在调试stm32f10系列的单片机的时候,想做一个关于串口发送的状态机,每隔100毫秒发送一次命令。没有用DMA,就是想单纯的使用发送中断来数据,结果在调试的时候一直死在了串口中断那里,然后查看sr寄存器,发现是TC位只要打开发送中断就会被置位,看到这里我嘴角微微上扬,轻蔑一笑,(ˉ▽ ̄~) 切~~清掉标志位就好啦。事实证明,我是愚蠢的,我在中断那里TC位清零后,再次仿真,呃,怎原创 2016-10-08 20:52:26 · 22593 阅读 · 5 评论 -
单片机的动态内存管理-一以链表为例
程序在运行时有时候会需要一个很大的空间去临时存储一些变量,如果一开始就分配一个很大的数组区的话,有可能会造成内存的浪费,有可能很长一段时间根本不需要这么大的内存,这就造成了一种情况,如果不分配这么大的空间,需要的时候内存不够,如果分配了,可能有一些功能就要被摒弃_(┐「ε:)_。动态内存管理就是在这样的背景下产生的,先说说编译器在编译时的内存分配,编译器在编译时会将内存分为 栈区、堆区、BSS原创 2016-10-13 22:44:10 · 12476 阅读 · 6 评论 -
栈使用量的一种检测方法
我又有想法辣,,今天的想法的目的是实现栈的使用量的检测方法。1、利用*.map文件定位栈顶地址,并且得到栈的使用量大小;2、定义一个全局变量,用于存储栈区内存上电时候的默认值,这个默认值我定义为栈顶内存值;3、在大循环里面从栈顶地址开始,将栈内存里面的值和第二步中的值进行比较,如果不相等,则认为该栈的内存被使用了,记下该地址值,用栈底地址和该地址相减,然后再和栈使用量大小相除,得到栈的原创 2016-11-03 22:28:40 · 2071 阅读 · 0 评论 -
单片机栈溢出的一种检测方法
裸奔的时候,一直担心栈会不会溢出。由于栈的使用量无法估测,导致栈的设置要么过大,要么过小。今天,我想了一种简单的检测方法,可以简单检测栈是否溢出,下面是我的具体的思想。1、查看*.map文件,查找栈顶地址;2、定义一个全局变量,用于存储栈顶上电时候的数据;3、在系统参数初始化的时候将栈顶数据赋给第二步定义的全局变量;4、在系统大循环里面检测栈顶数据是否有变化。下面将上述的思原创 2016-11-01 22:21:43 · 8396 阅读 · 0 评论 -
关于单片机内存溢出的查找方法
我所知道的内存溢出分为两种,一种是数组溢出,一种是堆栈溢出。一种内存溢出的定位方法,一般内存溢出多为数组,先查找到内存溢出的变量,然后查看mp1地址映射文件,按照序列,以溢出的变量为基地址,向上查找,找数组,然后在代码中查到该数组的地址填充,大约查找3至5个数组,如果均没有发现溢出,使用下面的方法。 另一种内存溢出的定位方法,类似于pcb板的割线,利用while死循环进行定位,这种方法原创 2016-05-15 23:31:18 · 11594 阅读 · 1 评论 -
STM32一直死在r1,[r0,#0x808]
今天在调试STM32的时候,程序一直死在一下代码中LDR r1,[r0,#0x808]LSLS r1,r1,#21BMI 0x1FFFF3B2原因,BOOT0引脚被拉高了。解决办法,将BOOT0引脚接地。没找到本质原因,一直在启动汇编、芯片IC选择、启动代码编译地址、中断向量表重定向那里找,统统不是,就是一个简单的开关引脚。问题都是自己搞复杂的……写于2017年8月14原创 2017-08-14 17:01:44 · 6869 阅读 · 6 评论 -
STM32 M0时钟配置
本文主要讲STM32 M0的时钟配置,也适用于M3内核。先来看看M0内核的时钟树(stm32f072)图中可以看出,M0芯片的时钟源有4个,一个高速内部RC时钟源,频率为8M;一个高速外部时钟源,频率为8到32MHz;一个低速外部时钟源,频率一般为32.768kHz;一个低速内部时钟源,频率为40kHz;一、HSI芯片上电的时候默认启用内部RC震荡,即8MHz的内部时钟源,原创 2017-10-08 15:29:50 · 2940 阅读 · 2 评论 -
STM32 串口驱动,分层通信
以前在使用串口的时候都是直接使用中断,每收发一个字节都要进一次中断,然后直接在中断进行封包,现在做了一个简单的分层设计,其实这个设计还是驱动设计,后期将逻辑层划分再细致一点,争取做到和linux的shell类似的分层。软件分层如下驱动层:串口、DMA、初始化,串口只开启接收空闲中断,DMA中断不开启。缓冲区:利用malloc和free函数创建的链表,缓冲区管理有两个,一个是接收缓冲区,每次进入接收...原创 2018-03-02 10:21:04 · 3103 阅读 · 0 评论 -
C语言好难——“_at()” 特殊地址定位指令
在keil里面,有一个特殊地址定位的指令,就是将一个变量或常量定位到一个指定的地址上面指令为 __at ,使用方法如下int variable __at(0x8000) = 100;意为将variable变量定位到0x8000这个地址。指令的目的是告诉链接器将指定变量定位到某个地址里面,在使用该功能的时候需要注意一点的是,地址的范围需要符合单片机的datasheet给出的地址映射表,注意,如果地址...原创 2017-03-19 23:27:48 · 6594 阅读 · 2 评论