STM32学习笔记
STM32学习笔记
cyang812
https://cyang.tech
展开
-
IAR开发STM32堆栈设置
一、前言关于堆栈的定义在此就不赘述,详细内容可以看这篇博客。堆栈溢出会导致野指针,返回地址错误等问题,通常程序已经无法正常运行,进入 HardFault 异常中断。为了避免这种情况,一般会分配较大的空间用做栈,可是如果仅仅为了安全就分配大空间的栈势必导致内存浪费。本文介绍两种获取栈最大消耗的方法,以方便合理设置栈的大小。二、方法1、方法一栈指针 SP 指向的位置可以反应出当前栈的消耗量。...原创 2018-10-25 22:28:12 · 3306 阅读 · 0 评论 -
I2C Bit-Bang 程序分析
一、Bit Bang关于 Bit Bang 的解释:Use software to control serial communication at general-purpose I/O pins,简单来讲就是使用软件通过 IO 脚去实现 I2C 的时序从而使用 I2C 协议进行通信。这样做的好处是可以突破硬件上的限制,例如芯片不具有硬件 I2C 模块,或者硬件 I2C 模块损坏,又或者使用硬件 I原创 2017-03-16 18:31:25 · 3661 阅读 · 0 评论 -
IAR DLIB Library heap usage statistics IAR heap 分析
翻译自 IAR Technical Note 28545 《IAR DLIB Library heap usage statistics》 update 2017/9/22介绍关于堆的描述在《IAR C/C++ Development Guide for ARM》的 Dynamic memory on the heap 一章中。本技术手册仅描述在应用程序中如何统计堆的使用量。通过跟踪 malloc原创 2018-01-03 20:47:56 · 1056 阅读 · 0 评论 -
STM32 延时函数解析
一、函数原型STM32官方提供的函数库中,可以找到类似于 HAL_Delay() 这样的函数。这个函数的就是通过使用定时器,达到一个较为精确的时间延迟,提供给用户调用。这个函数一般包含在类似于 stm32f4xx_hal.c 这样的函数中。函数原型如下:__weak void HAL_Delay(__IO uint32_t Delay){ uint32_t tickstart = 0U;原创 2017-02-28 15:29:23 · 21375 阅读 · 2 评论 -
STM32固件库 assert_param函数
本文同步至个人博客:cyang.tech一、知识点-1、固件函数库通过检查库函书的输入来实现运行时间错误侦测。通过使用宏assert_param来实现运行时间检测。所有要求输入参数的函数都使用这个宏。它可以检查输入参数是否在允许的范围之内。 例如通过定义#define IS_ADC_ALL_PERIPH(PERIPH) (((PERIPH) == ADC1) || \ ...原创 2016-10-24 12:20:56 · 1104 阅读 · 0 评论 -
static __inline 在IAR和keil开发环境下的差别
本文同步至个人博客:cyang.techstatic __inline这条语句在IAR和Keil下的需要写成不同的形式,否则会报错。 如下: 1、IAR错误 2、IAR正确 3、Keil错误 4、Keil正确 总结就是,在IAR环境下,需要写成static inline,而在keil环境下,需要写成static __inline原创 2016-10-29 18:58:19 · 7590 阅读 · 2 评论 -
STM32 BootLoader升级固件
BootLoader关于Bootloader,从书上的文字描述,很难理解这个名词是什么,有什么用。这次用到了,算是有了更进一步的认识。一、知识点1、BootLoader就是单片机启动时候运行的一段小程序,这段程序负责单片机固件的更新,也就是单片机选择性的自己给自己下程序。可以更新,也可以不更新,更新的话,BootLoader更新完程序后,跳转到新程序运行;不更新的话,BootLoader直接跳转到原创 2016-11-28 16:43:37 · 40763 阅读 · 11 评论 -
JRE运行环境出错导致无法安装STM32CubeMX解决方法
一、问题安装 STM32CubeMX 一直提示需要安装JAVA运行环境,提示界面如下: 但实际上已经正确安装了JRE,如下为JAVA版本。 问题原因:我的电脑上具有很多版本的JRE,并且有一个版本注册表信息出错,所以无法正常卸载。二、解决方法1、先完整卸载目前已安装的JAVA版本,可利用官方提供的卸载工具。 如上图所示,电脑里安装了4个版本的JRE,只需安装最新版的就好,其他直接卸载原创 2017-01-23 15:04:40 · 21210 阅读 · 1 评论 -
FatFs 使用中文长文件名
一、说明 使用长文件名,一般会是在使用 f_readdir() 这个函数时碰到,这个函数的功能就是获取上一步使用 f_opendir() 打开的文件夹中的内容,并将文件信息保存到定义的结构体。结构体内容如下, 里面包含有文件大小,上一次修改日期,文件属性,文件名等。可见,普通文件名是存在一个 fname[13] 的数组里的,这就使得长文件名无法正常显示。而长文件名是一个指针,这个指针指向的数原创 2017-02-24 13:41:06 · 4322 阅读 · 2 评论 -
STM32 延时函数高级用法分析
一、使用场景第一种情况,在使用普通 STM32 延迟函数,类似于 HAL_Delay(time),由于该函数是使用循环去判断及延时的,所以在执行该函数时整个程序会在此处等待定时器的中断服务函数修改参量使得循环判决条件不成立,从而继续程序的执行,同时也达到延迟时间的效果。由于使用的是系统的定时器进行延迟,所以时间相对准确。第二种情况,当需要周期性的执行一个任务时,将这个函数放在某个定时器的中断服务函数原创 2017-03-01 20:44:42 · 9119 阅读 · 0 评论 -
STM32 SysTick定时器
一、说明SysTick 定时器是实时操作系统专用的,但是也可以作为一个标准的递减计数器使用。它具有以下特点:1、24位递减计数器(16777216)2、自动装填能力3、计数器达到 0 时,有可屏蔽的系统中断产生。4、可编程时钟源 (HCLK 或者 HCLK/8)该定时器具有四个寄存器,如下表所示:一般,该定时器的计数周期为一毫秒,则寄存器LOAD中的值根据 MCU 主频的不同而不同。例如,原创 2017-03-02 19:12:27 · 1455 阅读 · 0 评论 -
f_open()使用错误记录
一、现象调用函数 f_open() 后,程序崩溃,调试后发现,单片机产生硬件中断,即软件跳入如下部分:void HardFault_Handler(void){ /* Go to infinite loop when Hard Fault exception occurs */ while (1) { BSP_LED_Toggle(LED3); }}...原创 2017-03-10 18:48:23 · 5193 阅读 · 2 评论 -
制作字库(Bin文件合并 C2BIN)
一、点阵文件生成1、使用点阵字库生成器生成文字的点阵信息,采用 UNICODE 编码批量生成。 2、如果具有 C 文件的字库,例如 STM32 开发板的库函数 x:\en.stm32cubef4\STM32Cube_FW_F4_V1.14.0\Utilities\Fonts 中的字库 C 文件,可以使用 C2B转换助手,这个软件可以将 C 文件中的字符数组信息转换成 bin 文件。结果如下图所示:原创 2017-04-06 20:04:01 · 7139 阅读 · 0 评论 -
WIN10 更新系统后,串口无法连接
一、问题1、WIN10 更新系统后,无法连接 ST 开发板上 USB 转串口,但可以正常的下载程序。 二、解决方法1、尝试更改 COM 口,例如从 COM3 转为 COM4。 2、尝试更新 ST-LINK 的固件版本,如下: 之后便可正常使用了:原创 2017-04-26 09:41:47 · 12366 阅读 · 3 评论 -
STM32 BSRR BRR ODR 寄存器解析
一、用法经常会看到类似如下的宏定义语句,用于对已经初始化后的 IO 口输出高、低电平。#define SET_BL_HIGH() GPIOA->BSRR=GPIO_Pin_0 #define SET_BL_LOW() GPIOA->BRR=GPIO_Pin_0其作用类似于如下两个库函数,void GPIO_SetBits(GPIO_Typedef* GPI原创 2017-08-01 11:54:09 · 6761 阅读 · 9 评论 -
STM32 定时器实现红外遥控数据接收
一、原理1、红外发射协议红外通信的协议有很多种。这个实验使用的是NEC协议。这个协议的采用PWM的方法进行调制,利用脉冲宽度来表示0和1。NEC 遥控指令的数据格式为:同步码头、地址码、地址反码、控制码、控制反码。同步码由一个9ms的低电平和一个4.5ms的高电平组成,地址码、地址反码、控制码、控制反码均是 8 位数据格式。按照低位在前,高位在后的顺序发送。采用反码是为了增加传输的可靠性(可用于原创 2017-08-08 23:11:06 · 15518 阅读 · 8 评论 -
STM32 定时器输入捕获实现红外遥控数据接收
之前已经写过了一个使用定时器普通计时功能来识别红外遥控数据的文章。本次是使用定时器输入捕获来实现,这种方法比起定时器普通计数来说要更加复杂一些,不过效果会更好。一、原理1、红外发射协议红外发射协议已经在之前的文章中写过,在此就不赘述。2、定时器计数和输入捕获定时器就是按照一个特定的频率对计数值进行加一或减一操作,当数值溢出时则产生一个标志或中断。定时器的输入捕获就是可以测量输入信号的脉冲宽原创 2017-09-11 16:47:59 · 12210 阅读 · 1 评论 -
STM32 USB无法连接电脑
一、说明在调试 STM32 USB device MSC 功能时,使用官方提供的库和示例项目,电脑可以正确识别设备,也可以正常操作。但是将 USB 部分的代码移植到自己的工程后,发现电脑无法正确识别设备,有时会在右下角显示无法识别设备。二、解决方法在main.c中添加 hal_delay() 函数的实现方式。在默认的模板工程里,一般使用如下的方式实现延迟函数。__weak uint32_t HAL原创 2017-12-06 22:26:10 · 13631 阅读 · 0 评论 -
STM32F469 CoreMark跑分测试
一、CoreMark 介绍CoreMark 是一项测试处理器性能的基准测试。代码使用 C 语言写出,包含:列表,数学矩阵操作和状态及 CRC 等运算法则。目前 CoreMark 已迅速成为测量与比较处理器性能的业界基准测试。CoreMark 的得分越高,意味着性能更高。二、代码移植移植 CoreMark 的测试代码到 STM32 平台非常简单。ST 官方资料文档就有移植步骤的详细说...原创 2018-02-27 19:52:13 · 4913 阅读 · 0 评论 -
STM32L432 CoreMark跑分测试
测试环境: IAR for ARM 7.80.4测试得分:277 官方给出的分数为:273.55 如下图:原创 2018-02-28 12:55:50 · 1416 阅读 · 0 评论 -
STM32 无法通过 %f 打印浮点数
一、问题使用 IAR 开发 STM32,发现无法通过 printf 重定向到串口打印出浮点数。代码如下: 输出结果如下: 可见,浮点数部分无法正常显示。二、解决方法这是由于 IAR 默认选择的 printf 库不支持浮点数的的输出。可在设置选项中修改。如下:默认使用 small,改为 auto 即可。 三、备注在不修改设置的情况下,尝试过如下两种代码解决。一种是通...原创 2018-03-02 14:54:06 · 15383 阅读 · 3 评论 -
STM32 硬件CRC和软件CRC速度比较
一、测试条件硬件: STM32L432KC 主频: 80MHz 编译器: IAR 8.20.1 编译选项: High Speed no size constraints CRC 生成多项式: 0x782f二、测试方法软件提前生成CRC表,用于查询。分别使用软件CRC算法和硬件CRC外设对一个缓存进行计算,目的是从该缓存中找到同步头。同步头共11字节,前两个字节为后九个字节的...原创 2018-03-12 22:46:18 · 15293 阅读 · 5 评论 -
IAR 和 keil 使用外部 SDRAM 的区别
当芯片内部的 SRAM 不够用时,就需要在外部扩展 SDRAM,然后在写程序时将一些比较大的 buffer 定义在外部内存中。在进行正确的配置之后,对外部 SDRAM 的使用,和芯片内部的 SRAM 是一样的,可以直接对 SDRAM 的地址进行读写访问。因此,最简单的方法就是,如下所示的代码,直接使用指针指到外部 SDRAM 的地址,之后对指针进行移动,便可以对全部 SDRAM 进行读写。使用...原创 2018-03-26 19:34:15 · 2467 阅读 · 0 评论 -
j-link v9 修复记录
j-link v9主控: stm32f205RC现象1、给 M0 下载固件的过程中经常出错,提示找不到M0。需要反复尝试很多次才可以下载。2、在一次正常的拔线断电后,再也无法识别,灯也不亮了。修复方法1、准备另一个可以使用的 j-link。这里使用的就是这种只有四根线,只支持 SWD 的 j-link OB。2、拆开坏了的 j-link v9, 可以看到 PCB ...原创 2018-09-13 12:05:46 · 7874 阅读 · 6 评论