
STM32
MC_J
一切从Hello,World开始
展开
-
STM32 EventRecorder printf不打印输出在调试窗口的问题解决
发现经过上述的操作后,进入调试界面,并没有把输出信息打印到窗口上,网上查找虽然也发现有人和我遇到一样的问题,但是都没有得到解决。找到EventRecorder对应重写的fputc函数,发现上面的宏定义导致部分程序是置灰的,也就是没有编译,才找到原因,是需要增加宏定义来打开对应的功能。也可以自己移植源码到工程里面,添加好后,工程中会多出几个文件,如下图所示,我这是自己移植的源码到工程中的,没有使用keil添加。把这个宏定义增加到RTE_Components.h中即可,就解决了没有输出的问题。原创 2022-09-23 14:43:23 · 1345 阅读 · 0 评论 -
STM32H7 SPI+DMA只发送一次,然后一直报busy的问题
首先我尝试的同时配置发送DMA和接收DMA,还是一直报busy,并不能解决问题;我又尝试调用前使用HAL_SPI_Abort函数,发现确实不报busy的问题了,但是如果连续执行DMA发送函数就会出现DMA发送不完数据的问题。网上看了很多讲SPI+DMA问题的帖子,有说必须发送DMA和接收DMA必须同时配置的,有的说DMA发送前需要手动调用HAL_SPI_Abort函数的。最后发现,并不需要同时配置发送和接收DMA,只需要同时打开DMA中断和SPI全局中断就可以了,如下图所示。原创 2022-09-08 13:57:37 · 5917 阅读 · 0 评论 -
关于STM32H7的16位ADC准确度测试以及使用中的问题
STM32H7 ADC使用问题原创 2022-06-08 16:40:49 · 10004 阅读 · 4 评论 -
STM32H7 ADC偏移校准以及线性度校准
一、问题之前编写ADC初始化都只是增加了偏移校准,无论是官方例程还是正点原子的例程都是只使用了偏移校准,但是在使用STM32H7芯片的时候发现个别的板子会出现线性度极差的情况。二、解决1.在初始化程序中增加线性度校准的功能,这是HAL库有提供的,就一行程序非常简单。HAL_ADCEx_Calibration_Start(&AdcHandle, ADC_CALIB_OFFSET_LINEARITY, ADC_SINGLE_ENDED);2.发现这个校准函数返回超时的错误,经查找发原创 2022-05-05 11:36:10 · 5429 阅读 · 2 评论 -
STM32使用RTOS BootLoader跳转app进入异常中断问题
一、问题描述在boot中不使用RTOS,跳转到APP中,APP可以正常运行。但是boot中使用RTOS跳转到APP中,程序配置完时钟后就会进入MemManage_Handler错误中断。二、解决方法1.在跳转APP前加__set_CONTROL(0);就不会出错了。2.如果出现hardfault,或者调试看到程序跳到汇编程序的B指令上,可以查一下是否在boot中用到的中断没有关闭。三、原因分析1.加__set_CONTROL(0);的原因是使用操作系统后系统内核会使用PSP模式,跳转原创 2022-02-18 16:49:33 · 5014 阅读 · 2 评论 -
STM32H7A3 ADC+DMA使用问题
解决STM32H7A3使用过程中遇到的一些奇怪的问题,并提供参考原创 2021-12-24 16:36:02 · 2486 阅读 · 1 评论 -
STM32H7系列FLASH出现HardFault的问题
一、问题描述在使用STM32内部FLASH时,发现有一次在读FLASH内容时直接就进入了HardFault,因为读内部FLASH是直接操作的内存,很简单的一句话,怎么也想不通是什么原因导致的。 然后调试模式下,用Keil直接看存储器的值,发现不是全A就是?号,这就确定应该是FLASH出了问题,然后擦除出问题的扇区就发现读取不会在进HardFault的。 通过读STM32H7的手册发现,H7系列和其他系列的FLASH不同,增加了ECC校验的功能,同时有状...原创 2021-10-11 15:45:24 · 3640 阅读 · 3 评论 -
STM32H7 PVD断电的使用
1.遇到的问题我使用的是STM32H747,在初始化后发现断电后并没有进入中断。最后查找到因为STM32H747是双核CPU,在HAL库源码中,有双核的宏定义将一些配置给屏蔽了,因为我只用到了单核,就把源码中的宏取消掉了,然后就可以正常进入中断了。使用不是双核的就不需要更改了。2.下面是PVD的程序void PVD_Init(void){ PWR_PVDTypeDef sConfigPVD = {0}; sConfigPVD.PVDLevel = PWR_PVDLEVEL_6...原创 2021-10-11 15:28:57 · 1077 阅读 · 1 评论 -
关于STM32 HAL库 串口DMA发送
问题1:在使用DMA+UART发送时,在死循环中发送DMA发现只发送一次就不发送了解决方法:这里必须开启DMA中断和UART全局中断,开启后就可以一直发送了。问题2:死循环发送,发现通过判断DMA发送完成标志,数据并没有发送完成就开始发送。解决方法:1.添加延时函数,但是这样显然不是最佳的解决方法。 2.通过判断串口发送完成标志位,可以实现。程序如下所示。HAL_UART_Transmit_DMA(&huart4,send,21);wh...原创 2021-02-01 16:34:45 · 2976 阅读 · 1 评论 -
关于STM32 CAN 发送失败问题解释
首先解释一下CAN几个配置的功能:1.CAN_InitStruct.CAN_TTCM = DISABLE;这个只在某些CAN标准中使用,就设置为DISABLE。2.CAN_InitStruct.CAN_ABOM = ENABLE;这个位我们使能该功能,使用该功能可以在节点出错离线后适时的自动恢复,不需要软件干预。3.CAN_InitStruct.CAN_AWUM = ENABLE;这个位我们使能该功能,使用该功能可以在监测到总线活动后自动唤醒。4.CAN_InitStru.原创 2020-11-25 13:15:28 · 14719 阅读 · 6 评论 -
STM32 FLASH擦写电压的问题,即编程/ 擦除并行位数设置
可以看到根据电压来设置PSIZE,但是看到的手册都说,使用的电压必须和擦写并行位数相匹配,正点原子给的编程手册也是这么写的,这就误导了许多人,任务电压使用3.3V就必须设置PSIZE为10。然后我查找了很多信息,终于找到了这个问题的解释,就是如果你使用3.3V,你最大可以操作的位数就是32位,如果你操作64位,就不保证数据的稳定性了,但是你操作16位和8位是没有问题的。数据手册DM00023388_ZHV1中说明了这个问题,我这里上传不了。可以百度查一下。...原创 2020-05-18 17:53:07 · 2169 阅读 · 4 评论 -
关于STM32使用DMA数据丢失的问题
一、最后两个字节丢失的问题这个我在使用之前就看了相关的资料,说是使用DMA发送完成中断来判断是否发送完成,就会出现最后两个字节丢失的问题。解决方法有说使用延时的,但是这种方式不是很好,对于自己做着玩可以,还有一个解决方式是使用UART发送完成中断来判断是否发送完成,我就使用了这种方法没有出现两字节丢失的问题。二、后半部分字节丢失的问题我使用RS485+DMA发送数据,但是发现很低的概率...原创 2020-05-08 10:19:30 · 4288 阅读 · 2 评论 -
FreeRTOS互斥信号量与二值信号量使用时的区别
1.互斥信号量互斥信号量的申请与释放是要在同一个任务中进行的,不能在一个任务中申请而在另一个任务中释放。互斥信号量主要解决的是,我在用的时候,别人都不能用。举个例子,我在像一段内存中写数据的时候,不允许别人去写和读的,这时候就需要互斥信号量,写之前获取信号量,写完之后再释放互斥信号量。2.二值信号量二值信号量允许在一个任务中申请,在另外一个任务中释放。二值信号量主要解决的是任务...原创 2020-04-26 16:13:38 · 3176 阅读 · 0 评论 -
STM32中错误使用malloc引发问题
做项目时,发现程序总是没规律的跑一段时间就挂掉了,排查了3个星期终于找到了原因。错误现象就是进入HardFault中,为了定位导致HardFault原因,就采用了我另一篇博客的方法。找到发现是malloc引起的错误,查阅资料发现,是因为在中断中使用malloc才导致的。所以不要在中断中使用malloc,很容易就导致问题,难以排查。...原创 2019-12-23 13:15:52 · 1790 阅读 · 10 评论 -
定位HardFault_Handler错误的方法
1.在while处打上断点,发生错误时会跳到这个断点上2.进入debug模式后打开Call Stack窗口,点击下图的第五个图标3.当发生错误跳到断点处后右击窗口空白处选择Show Caller Code,就可以看到main之后出现了很多函数,这就是在发生HardFault错误之前调用过的函数,然后检查这几个函数即可,看是否有指针使用错误、数组越界、堆栈溢出等情况的发生。...原创 2019-12-20 14:37:17 · 562 阅读 · 0 评论 -
STM32的UART检测到上溢错误
一、问题来源做项目的时候,发现程序莫名的就会死掉,因为采用了串口通信,需要不断的去接收数据,而且频率相对较快。二、发现问题用JLink进行硬件调试,发现死在了串口中断里面,不停的进入中断,查看寄存器状态,发现ORE控制位被使能,查阅资料后发现是检测到上溢错误,才导致的这种问题。三、产生这种错误的原因在接收数据时,如果RXNE还没有被复位,而这时又接收到一个字符就会发生溢出错误。...原创 2019-12-17 14:43:46 · 2897 阅读 · 0 评论 -
STM32F103的GPIO的工作方式以及相关寄存器配置
一、GPIO工作方式1.输入浮空模式:CPU可以读取到外部的高低电平,输入的高低是不确定的完全由外部输入决定。例如按键可以使用这个模式。2.输入上拉模式:就是在无信号状态默认是高电平,当我们输入的低电平是有效控制信号就使用此模式。3.输入下拉模式:就是在无信号状态默认是低电平,当我们输入的高电平是有效控制信号就使用此模式。4.输入模拟模式:输入的是模拟量,将其传送给片上外设,用于...原创 2019-05-06 15:29:10 · 5111 阅读 · 0 评论 -
STM32f103时钟系统简介
主要是讲解怎么看懂这个图。一、内置RC振荡器(HSI RC)频率是约为8MHz,因为其频率不是很稳定。其可作为系统时钟的一个选项。二、晶振振荡器(HSE OSC)从图中可以看到其是一个高速的外部时钟。一般接一个8MHz的晶振,这个晶振可以是4-16MHz这个范围,其可以作为选择器PLLXTPRE的输入,也可以两分频后作为选择器PLLXTPRE的输入,还可以作为系统时钟的一个时钟源。...原创 2019-05-09 20:36:51 · 9349 阅读 · 0 评论 -
Systick滴答定时器程序简介
一、简介 Systick滴答定时器常用来做延时,可以节省资源不用再浪费一个定时器器。ucos系统中采用的就是Systick作为心跳时钟。 Systick滴答定时器是一个24位的倒计数定时器,计时到0时,就从reload寄存器中重新装载定时初值。二、Systick的寄存器1.CTRL:Systick的控制和状态寄存器。2.LOAD:自动重装载寄存器。3.VAL:当...原创 2019-05-09 23:34:34 · 750 阅读 · 0 评论 -
Keil软件仿真
首先就是配置上面图中的debug,选择软件仿真。然后是选择芯片,根据自己的硬件芯片选择。8号标注是进入该图中的debyg模式。1号标注:这个是一个RST按钮,和硬件一样是复位的功能。2号标注:是执行到断点,在3标注处的那一栏双击就会出现个红点,那就是断点。4号标注:是执行函数内部。5号标注:是按行执行。6号标注:是跳出函数内部。7号标注:是执行光标处,4567这...原创 2019-05-10 14:06:28 · 11777 阅读 · 2 评论 -
STM32寄存器的地址名称映射
1.首先是一个IO口是如何找到个各寄存器的。typedef struct{__IO uint32_t CRL;__IO uint32_t CRH;__IO uint32_t IDR;__IO uint32_t ODR;__IO uint32_t BSRR;__IO uint32_t BRR;__IO uint32_t LCKR;}...原创 2019-05-07 22:22:52 · 1271 阅读 · 0 评论 -
STM32端口复用和重映射
一、端口复用1.什么是端口复用? STM32有很多内置外设,这些外设的外部引脚都是与GPIO复用的。也就是说,一个GPIO可以复用为内置外设的功能引脚。例如串口1对应的引脚为PA9、PA10,串口2对应的引脚为PA2、PA32.端口复用的配置 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPI...原创 2019-05-16 23:09:10 · 1095 阅读 · 0 评论 -
STM32F103系列NVIC中断优先级分组讲解
一、简介 CM3内核支持256个中断,16个内核中断,240个外部中断,并且拥有256级的可编程中断设置。 但是STM32只用到了CM3内核的一部分,STM32有84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程中断优先级。 STM32F103系列只有60个可屏蔽中断。二、中断管理1.对STM32进行中断分组,组0-4,同时对每个中断设置一个抢...原创 2019-05-17 16:29:33 · 14670 阅读 · 0 评论 -
STM32F103 UART通信讲解
一、串行通信的通信方式1.同步通信:带时钟同步信号传输,有一根线是同步时钟。例如SPI(全双功)、IIC(半双工)通信接口2.异步通信:不带时钟同步信号,必须约定好波特率。例如UART(全双功)二、STM32的串口通信接口UART:通用异步收发器。USART:通用同步异步收发器。STM32F10x系列包含3个USART和2个UART。都是TTL电平交叉相连即可...原创 2019-06-10 21:02:03 · 5042 阅读 · 3 评论 -
STM32 LED灯位带操作控制(以STM32F429为例)
/*LED0灯GPIO口以及引脚,时钟的宏定义,用于LED灯的初始化*/#define LED0_PIN GPIO_Pin_0#define LED0_PORT GPIOB#define LED0_CLK RCC_AHB1Periph_GPIOB/*LED1灯GPIO口以及引脚,时钟的宏定义,用于LED灯的初始化*/#define LED1_PIN GPIO_Pin_1#d...原创 2019-08-30 09:16:10 · 1363 阅读 · 0 评论 -
建立STM32F103ZE系列的keil工程
1.新建文件夹template,在template文件下再新建一个USER文件。2.打开keil5,新建工程,选择位置为USER并命名为template。3.选择stm32f103ze(图一所示),点击确定会弹出一个框,点击cancel即可。project会出现下图的结构。4.在USER同目录下建立三个文件OBJ、CORE、STM32F10x_FWLIB如图所示。5.复制文...原创 2019-05-05 22:29:47 · 6149 阅读 · 0 评论