初学STM32,在RealView MDK 环境中使用STM32固件库建立工程时,初学者可能会遇到编译不通过的问题。出现如下警告或错误提示:
warning: #223-D: function "assert_param" declared implicitly;assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
这时候我们需要在“Target Options”中的“C/C++”选项卡中添加USE_STDPERIPH_DRIVER、STM32F10X_HD。这样才能使编顺利通过。
知其然了,我们还得知其所以然。下面就一一道来。我们知道,程序的执行是从“main.c”文件开始的,其中必须包含有头文件“stm32f10x.h”。我们打开“stm32f10x.h”,按下“Ctrl+F”键,查找USE_STDPERIPH_DRIVER,在“Find What”栏中输入“USE_STDPERIPH_DRIVER”。点击“Find Next”,出现“USE_STDPERIPH_DRIVER”对应的代码行,重复上边操作三次,第三次的时候我们能在第8296-8298行找到
#ifdef USE_STDPERIPH_DRIVER
#include "stm32f10x_conf.h"
#endif
这段代码的意思是,只有用预编译指令预定义了“USE_STDPERIPH_DRIVER”,才会将"stm32f10x_conf.h"包含进“stm32f10x.h”中,从而被"main.c"用到。这就解释了,为什么我们没有在“main.c”中包含"stm32f10x_conf.h",而在编译之后却被包含进了"main.c"中。"stm32f10x_conf.h"文件相当于一个开关文件,如果要用到STM32固件库驱动标准外设,则外设驱动头文件是必不可少的,如“stm32f10x_gpio.h”。在"stm32f10x_conf.h"中我们通过代码
#include "stm32f10x_gpio.h"
来实现这个操作。
说到这儿估计大家已经对“USE_STDPERIPH_DRIVER”的来龙去脉有个清晰的认识了吧?其实单从字面意思理解就是“使用标准外设驱动”,在C/C++预定义中加入“USE_STDPERIPH_DRIVER”就是允许“使用标准外设驱动”了。至于加入的“STM32F10X_HD“同样能在文件”stm32f10x.h“通过如上所述的方法通过功能查找来进行解释,其实它也是对于对应硬件的某些定义起开关作用罢了。
另外需要注意的是,在使用不同版本库的时候,因为有所不同(当然包括MDK自带的库),所以我们需要在包含的时候一定要注意选对路径,免得不同版本之间的一些定义由于所处的文件不同而产生冲突。
关键字:STM32 MDK
引用地址:
关于STM32 MDK中USE_STDPERIPH_DRIVER问题
推荐阅读最新更新时间:2024-03-16 14:49
STM32用IO口控制步进电机的简单程序
练习IO口库函数操作。 //相序 uint16_t phasecw ={0x2000,0x0001,0x0004,0x0008};// D-C-B-A uint16_t phaseccw ={0x0008,0x0004,0x0001,0x2000};// A-B-C-D //步进电机相关IO口初始化 // IN4: PC13 // IN3: PC0 // IN2: PC2 // IN1: PC3 void Moto_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph
[单片机]
调通STM32的串口ISP的经验-eagleCom
1、Boot0需接高(注意不要超过3.6V,非5V容忍脚),Boot1(PB2)需接低(电阻下拉或直接接地)。 2、VDDA/VSSA一定要接好,电压符合要求(2.4~3.6V).即使不用ADC也要接,因为VDDA还为POR/OSC/PLL等“模拟”部分供电。 3、检查复位脚的电位是否正常,JTAG仿真器有可能复位系统。 4、检查TXD/RXD信号通路。当然要畅通,呵呵。 5、如果用非mcuisp的软件,最好在TXD/RXD上加上拉电阻到MAX232电源,防止产生干扰信号。mcuisp从软件上处理了这个干扰,可不考虑这点。 6、波特率先设为9600bps或更低,调通读器件ID后再提高到115200。波特率是否能
[单片机]
STM32程序的烧录方式 与 ISP一键下载
一、启动模式(Boot modes) 阅读:STM32中文参考手册_V10.pdf 查看启动配置(Boot modes)。 在STM32F10xxx里,可以通过BOOT 引脚选择三种不同启动模式。 STM32三种启动模式对应的存储介质均是芯片内置的,它们是: 1)用户闪存 = 芯片内置的Flash。 2)系统存储器 = 芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区 域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM区。 3)SRAM = 芯片内置的RAM区,就是内存啦。 在每个STM32的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时的电平
[单片机]
STM32单片机编程方式及工作原理
STM32单片机编程可以使用多种不同的编程语言和工具,下面是一些常用的编程方式: C语言编程:C语言是STM32单片机编程中最常用的编程语言之一,STM32提供了官方的标准外设库和HAL库来简化编程过程。 Keil:Keil是一款集成开发环境(IDE),它可以与多种编译器和调试器一起使用,包括ARM编译器和CMSIS-DAP调试器,使得开发者可以方便地进行编程、编译和调试。 STM32CubeIDE:STM32CubeIDE是STMicroelectronics提供的官方集成开发环境,可以使用C/C++语言编程,支持多种STM32单片机系列,提供了一系列的图形化工具和代码生成器,使得开发者可以更加方便地进行开发、调试和优化。
[单片机]
STM32-USART HAL库接收任意长度数据详细解析
前言: 最近在调试STM32L152 HAL库串口接收任意长度数据程序,详细解析下接收任意长度数据的方法。 硬件平台:STM32L152 软件平台:keil v5+cubeMX 函数库:HAL库 STM32L152 —USART STM32L152 USART 的HAL库中接收函数: HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); 该函数的参数Size固定,使用时很不方便,只能接收固定长度的数据。 本文详细解析HAL库UASRT接收函数并修改成接收任意长度。P
[单片机]
stm32之定时器彻底研究
这里介绍两种方式使用stm32的定时器:直接操作寄存器和使用st的官方的库文件。 相比较而言,直接操作定时器比较简洁,对着寄存器看十分明了。而使用库文件有一点晕头转向。 (个人观点) 程序如下:(以下程序在DX32的例程修改而来,使用的是比较古老的3.0固件库) 1、timer.c文件 #include STM32Lib\stm32f10x.h void TIM2_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; u16 CCR1_Val = 4000; u16
[单片机]
stm32驱动lora模块sx1278
开发环境 keil5 子设备读取Ds18b20数据,通过iic显示到OLED 屏幕上,同时用spi协议发送给lora,再传给网关。 网关接收到数据在OLED 屏幕上显示。 单片机源码: #include stdio.h #include DELAY/Delay.h #include UART/uart.h #include ADC/ADC.h #include LED/LED.h #include IIC/IIC.h #include OLED/OLED.h #include SPIx/SPIx.h #include SX1278/SX1278.h #define ALARM 22 int ma
[单片机]
基于STM32的全彩LED显示屏系统的设计
LED显示屏是利用LED点阵模块或像素单元组成的一种现代平面显示屏幕,具有发光效率高、使用寿命长、视角范围大、色彩丰富以及对室内外环境适应能力强等优点。20世纪80年代后期,它在全世界迅速发展起来,并很快成为大屏幕平板显示的代表性主流产品;近年来,随着蓝色LED产品价格的快速下降,全彩色LED显示屏的价格逐步降低,市场需求急剧增长,应用日益普遍。目前的LED显示屏控制系统多采用ARM处理器来完成整个系统的功能,这种控制系统在数据处理速度上存在很大的局限,影响显示效果的连续性。基于此,在分析了STM32微处理器总线结构特点的基础上,提出了STM32+FPGA的控制系统方案,该方案充分了利用STM32微处理器的灵活的储器控制技术和
[电源管理]