
STM32
努力-养家
超越一切,限界突破
展开
-
HAL库学习——GPIO输入作为外部中断触发
一、介绍 通过GPIO输入电平变化,可直接触发外部中断,一般应用于按键检测以及其它脉冲检测。下面讲述外部中断的配置及使用。二、CubeMx配置1)配置GPIO为外部中断模式2)配置为上升沿触发外部中断模式。这里根据实际情况配置,博主是根据项目需要配置为捕捉上升沿。2)开启外部中断三、代码实现 MCU一检测到外部IO有上升沿产生,则会调用外部中断函数,该代码是由CubeMx配置自动生成。 中断函数里主要完成外部中断标志...原创 2021-07-15 20:13:29 · 11643 阅读 · 2 评论 -
FLASH页写入
一、简介 由于FLASH特性,页写入,扇区擦除。因此在写入时,需要考虑写入地址和写入长度并对其做相应处理,以下是代码实现。二、代码实现#define PAGE_SIZE 256void FLASH_WRITE(uint8_t* buf, uint32_t wICAddr, uint16_t numByteToWrite){ uint8_t numOfPage, numOfSingle, offsetAddr, count; //写入整页数 numOfPage...原创 2021-06-30 11:01:25 · 2568 阅读 · 0 评论 -
HAL库学习——ADC精度问题以及多通道采集
一、简介 博主在使用ADC测量电池电压时,发现测出来的AD值转换为实际电压不匹配,偏差大,因此通过网上收集资料,最终得知ADC采集精度提升的方法。前半部分主要是涉及多通道电压值采集,CubeMx的配置以及代码实现,以采集ADC1通道0、通道8和内部基准电压为例。后半部分讲解使用内部基准电压计算精确度较高的电压值。二、运行环境 MCU: STM32L071CBT6 配置工具:STM32CubeMx IDE:MDK5三、CubeMx配置时钟配置: ...原创 2021-06-22 20:04:44 · 10020 阅读 · 7 评论 -
printf函数封装
1、简介 当调试日志多,需要对调试日志进行简单管理时,这时就需要对printf函数进行封装。下面讲述如何用自定义函数打印LOG。2、代码实现#include <stdarg.h>#define DEBUG_OUTvoid printf_log(const char* fmt, ...);/********************************************************************************函 数 ...原创 2021-03-24 16:36:40 · 4428 阅读 · 0 评论 -
HAL库RTC时钟配置
一、说明 该链接主要包括RTC的配置和使用: https://pan.baidu.com/s/1ABQntcLNsffaXW8Slwc0pg 提取码:26yt原创 2020-12-18 11:22:11 · 640 阅读 · 0 评论 -
BC95AT命令响应格式的接收
一、开发环境 MCU型号:stm32l071cbtx 库:HAL库 IDE:stm32CubeMx、KEIL5 NB模组:BC95-B5二、分析 在使用串口接收模组回复的AT指令时,遇到个问题就是AT命令响应格式为: <CR><LF>+CMD1:<parameters><CR><LF> <CR><LF>OK<CR&...原创 2020-12-11 16:14:28 · 576 阅读 · 0 评论 -
安装STM32Cubemx-5.6.1报错,需要64位java1.8.0_45 (64-bit)JRE
一、使用环境 操作系统:win10 软件版本:stm32CubeMX Version5.6.1 Java版本:32bit二、现象 打开stm32CubeMX软件弹出如下消息提示框,之后在新建工程搜索MCU型号时经常发生闪退现象。 三、解决方法 升级Java为64位版本即可解决,但是登进去中文官网只有32位版本。经得知需要登入英文官网才能下载到64位版本。下载链接:https://www.java....转载 2020-11-27 11:26:29 · 1734 阅读 · 0 评论 -
STM32 局部数组使用过大溢出到全局影响代码运行
一、问题 在函数内定义局部数组大小为400,发现其影响了串口接收中断。二、原因 通过动态调试得知,其分配的局部数组地址与全局的串口结构体的空间部分重合造成了寄存器异常中断开启失败。出现此原因在于分配的栈不够造成局部数组溢出占用全局空间。...原创 2020-08-31 10:22:37 · 2868 阅读 · 0 评论 -
STM32 while语句奇怪的问题
一、现象 定义一个全局变量在while循环里一直去判断,然后在定时器中断里对其做加一操作。出现了这种现象,在while循环里该变量取 出来的值一直为0,在定时器这边取出来的值是一直在变化的。即同个全局变量在不同函数出现两个取值,这是不正常的。二、原因及解决方法 经上网查阅得知是编译器优化问题,认为在while循环里没有去改变该值,所以认为他是不变的则没有去取最新值来更新,解决方法是对变量加上关键字 volatile,表示其为易变的即可解决编译器优化问题,保证同个变量只有一个...原创 2020-08-31 10:17:34 · 2354 阅读 · 1 评论 -
HAL库学习——串口中断一些注意点
1、现象 最近在使用HAL库串口中断做数据接收时遇到了中断接收标志位开启,但是却收不到数据的问题。作者的代码时是在主程序初始化时使用HAL_UART_Receive_IT函数开启中断每次接收一个字符,由于HAL库的底层机制每接收一个字符后都会关闭中断并且进入中断回调函数,所以在中断回调函数里需要再次调用HAL_UART_Receive_IT函数开启中断。但是结果是重复开关单片机电源,出现偶尔串口数据会进不来(串口数据来源:外部模块上电后一直往串口吐)。2、开发环境 IDE:K...原创 2020-07-24 17:31:00 · 4570 阅读 · 5 评论 -
HAL库学习——中断嵌套及中断优先级
一、介绍 一般使用多个中断时,就会考虑中断的重要性及其之间的优先级关系。HAL库中可以通过HAL_NVIC_SetPriority函数来设置中断的优先级,决定中断是否能够被抢占。开发环境: MCU:STM32L071CBT6 IDE:KEIL5、STM32CubeMX二、函数的讲解 HAL_NVIC_SetPriority函数的定义如下:/** * @brief Sets the priority of an int...原创 2020-07-01 16:07:39 · 8822 阅读 · 0 评论 -
HAL库学习——独立看门狗的使用
一、开发环境 IDE:KEIL5 MCU:STM32L071CBT6 操作系统:win10二、介绍 看门狗的使用,一般是用来确保代码能够保持长时间工作不死机的问题。诸如:程序跑飞、数组溢出、代码逻辑错误进入死循环等都会造成代码停止工作,加入看门狗可以有效的解决这类错误问题,相当于是代码的最后一道防线。这里主要讲述的是独立看门狗的使用,即STM32Cube的配置以及代码内部的实现。STM32的独立看门狗由内部专门的 37Khz低速时钟驱动,...原创 2020-06-24 11:10:42 · 3577 阅读 · 2 评论 -
HAL库学习——串口中断
一、介绍 串口的传输方式包括:轮询、中断DMA,在此要介绍的是关于HAL库底层串口接收中断流程的讲解,包括串口错误的处理,中断回调函数以及错误中断回调函数的执行。二、配置流程 首先使用STM32CubeMX配置串口参数和工作方式。如下图: 配置好基础参数波特率和数据长度,校验位,停止位后,选择NVIC Settings点击Enabled使能全局中断。 这样整个串口配置就完成了。三、开启接收中断 ...原创 2020-06-23 15:30:00 · 18440 阅读 · 7 评论 -
HAL库写Flash操作引起的串口ORE错误不再接收的解决
一、问题 使用内部EEPROM(Flash的一部分)储存数据,在写入数据到STM32L0单片机时,出现串口接收数据丢失甚至串口不再接收的现象。在正常情况下在没有写数据到Flash中去的时候所有串口数据都能正常接收,没有数据丢包现象,但是当执行一次写入操作就会导致串口数据丢失,导致接收ORE错误或帧错误等。二、原因 经查阅手册得知在Flash写入操作过程中,系统时钟停止,这意味着写入Flash期间无法访问Flash中的代码和数据。造成了串口那边RDR寄存器有值了,来不及取出...原创 2020-06-22 11:15:19 · 2195 阅读 · 0 评论 -
HAL库的学习——串口中断接收不到数据或只能接收一两个字符
一、操作步骤 使用SMT32CubeMx配置指定引脚为UART后在右侧界面点击Connectivity->USART2->Mode选择异步模式Asynchronous,查看串口的基础配置-Parameter Settings,保持默认不变。 选择NVIC Settings点击Enabled使能全局中断。 这样整个串口配置就完成了。二、代码实现 在自动生成代码里点开MX_USART2_UART_Init(void)函数并...原创 2020-06-09 10:30:00 · 9319 阅读 · 2 评论 -
毕设题目:基于STM32的车牌识别系统
一、环境准备开发环境:KEIL5MCU:正点原子开发板精英版使用模块:OV7725、TFT4.3寸屏二、原理 首先通过OV7725将拍摄到的内容显示到TFT屏上,然后对图像进行二值化处理、车牌定位、字符分割、归一化处理(使得拍摄的图像转换为与所存字库的像素匹配)然后最终进行字符匹配把对应的字库数组显示出来。代码如下附件。...原创 2020-04-30 10:48:10 · 8541 阅读 · 24 评论 -
STM32 Keil新建工程报错“Loading PDSC Debug Description Failed for STMicroelectronics STM32Lxxxxxxx”
在使用STM32L0xx系列和STM32L4xx系列的单片机时都遇到了打开keil工程报“Loading PDSC Debug Description Failed for STMicroelectronics STM32Lxxxxxxx”错误的问题,具体现象和解决方法如下图文所示:找到keil的Build Output窗口提示的File路径,找到Keil.STM32Lxxx_...转载 2020-03-25 16:52:41 · 1845 阅读 · 0 评论 -
HAL库的学习 ——内部EEPROM的使用
关于内部EEPROM的使用:开发环境Keil5,单片机型号STM32L071CBT6。 EEPROM大小为6KByte,分为2块可以在hal库里的宏得知起始地址与结束地址。EEPROM的写分为三步:1、解锁EEPROM;2、将数据写入固定地址;3、上锁保护EEPROM;具体代码如下:HAL_FLASHEx_DATAEEPROM_Unlock();...原创 2019-10-29 20:36:59 · 3912 阅读 · 1 评论 -
HAL库的学习 —— PWM的配置及控制
1.配置RCC时钟2.配置定时器 如图所示,将PA6引脚配置为定时器3并将通道1作为PWM输出3.时钟的配置 这里将系统时钟配置为24M,后续的PWM的频率计算和占空比计算都是根据以下配置为例。4.预分频、分频和占空比配置 如图,配置出来的PWM频率为f = 24M/Pre/Per Hz,即24M/12/100 = 20kHZ...原创 2019-07-24 17:27:39 · 22182 阅读 · 8 评论 -
HAL库的学习 —— SPI配置和使用 发送16位和8位数据
1.SPI 8位 数据传输 这边以只作为主机发送为例,需要SPI_MOSI、SPI_SCK、SPI_CS Cube配置如下: 图中将SPI_CS 引脚设置为普通IO口便于直接控制。 要发送数据的话直接调用以下代码。unsigned char op_code = 0xcf;HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GP...原创 2019-07-25 10:03:00 · 24922 阅读 · 17 评论 -
HAL库的学习 —— 定时器的使用
首先配置时钟树,我的配置如下:接着选择时钟源,在这里选择内部时钟即24MHZ。并配置预分频和计数值:开启定时器全局中断:定时时间的计算公式如下: 定时时间 = (pre+1)*(per+1)/tclk;在这里pre = 2399,per = 999,tclk = 24MHZ。所以定时间为0....原创 2019-09-28 13:57:08 · 4242 阅读 · 0 评论 -
HAL库的学习 —— ADC的使用
首先将要进行AD采集的脚配置为AD通道:进行一些参数的配置在这里只配置了AD采集的位数以及数据对启齐方式其它保持默认:数据右对齐的话能保证AD采集的数组是以高位在前低位在后的存放方式 ADCH:ADCL。接着在代码里加入如下函数去读取采集的值: HAL_ADC_Start(&hadc); HAL_ADC_PollForC...原创 2019-09-28 14:09:48 · 19565 阅读 · 0 评论 -
HAL库的学习 —— 串口DMA配合空闲中断接收数据
首先将引脚配置为串口功能:接着配置串口的参数:点击ADD将UART5的接收设为DMA接收方式开启串口和DMA中断:使用DMA接收时在串口初始化后面加入如下函数: HAL_UART_Receive_DMA(&huart5, UsartType.RX_pData, RX_LEN); __HAL_UART_ENABLE_IT(&huar...原创 2019-09-28 14:43:28 · 5363 阅读 · 4 评论 -
HAL库串口HAL_LOCK的问题造成的串口半双工的解决
由于HAL库串口中断机制的问题,一进入中断就会自动的把中断使能标志位关掉所以要在进入中断后调用HAL_UART_Receive_IT();void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ if(huart->Instance==USART2) { if(mUART2.TEMP == '$' &a...原创 2019-09-28 15:03:44 · 3889 阅读 · 5 评论 -
Keil MDK编译器下查看占用Flash和SRAM空间大小
转载:https://blog.youkuaiyun.com/JohnnyTim/article/details/75384412转载 2019-09-28 17:08:37 · 803 阅读 · 0 评论 -
HAL库的学习 ——FLASH的使用
flash应用:将单片机未使用部分的flash来存储数据,以达到掉电保存数据的作用相当于EEPROM。这里的话主要是代码的实现STM32CubeMx不用去配置。flash.c文件如下:#include "flash.h"uint32_t startAddress;uint32_t endAddress;uint32_t Data = 0x12345678;//FLAS...原创 2019-09-30 17:27:28 · 4901 阅读 · 1 评论 -
STM32CubeMX的使用教程
【STM32】关于STM32CubeMX的使用打开Cube,点击File-》New Project搜索芯片型号这边选择的是STM32L071CB系列上面菜单Docs & Resources可以下载数据手册程序手册等,点击Start Project进行下一步的配置。配置GPIO引脚如图将PA9、PA10配置为USART1_TX、USART1_RX点击右侧的Con...原创 2019-07-04 11:53:08 · 29438 阅读 · 0 评论