首页 > 电路 > 电路设计 > STM32库函数总共多少,STM32 库函数疑问

STM32库函数总共多少,STM32 库函数疑问

来源:整理 时间:2023-10-29 14:55:14 编辑:亚灵电子网 手机版

本文目录一览

1,STM32 库函数疑问

exti_getflagstatus只是纯粹读取中断标志位的状态,但是不一定会响应中断(ext_imr寄存器对该中断进行屏蔽);而exti_getitstatus除了读取中断标志位,还查看ext_imr寄存器是否对该中断进行屏蔽,在中断挂起&没有屏蔽的情况下就会响应中断。仔细看看代码就知道区别了flagstatus exti_getflagstatus(uint32_t exti_line) flagstatus bitstatus = reset; /* check the parameters */ assert_param(is_get_exti_line(exti_line)); if ((exti->pr & exti_line) != (uint32_t)reset) bitstatus = set; } else bitstatus = reset; } return bitstatus;}itstatus exti_getitstatus(uint32_t exti_line) itstatus bitstatus = reset; uint32_t enablestatus = 0; /* check the parameters */ assert_param(is_get_exti_line(exti_line)); enablestatus = exti->imr & exti_line; if (((exti->pr & exti_line) != (uint32_t)reset) && (enablestatus != (uint32_t)reset)) bitstatus = set; } else bitstatus = reset; } return bitstatus;}
如果是8位数据并且带奇偶校验,那么bit8就有用了,所以采用掩码0x01FF.

STM32 库函数疑问

2,小弟最近在学习stm32请问是不是要把每个库函数中的函数都要背下来才能

不是要背库文件,而是要理解每个外设的功能,库函数只是说把操作寄存器的代码封装成了函数;这些函数不用背,背了也没什么用。主要学习怎么配置各个外设的参数,和怎么配置的,这才是学习的重点;库函数是一个糖衣炮弹,有好处也有坏处;好处是代码整齐了,坏处是把底层隐藏了;我们要学的精髓就是隐藏的那一部分。我最开始学的时候直接写的寄存器,没有用库函数;所以重在理解,不是背诵。

小弟最近在学习stm32请问是不是要把每个库函数中的函数都要背下来才能

3,stm32 用库函数操作和寄存器操作

首先,两个都是C语言。从51过渡过来的话,就先说寄存器操作。每个MCU都有自己的寄存器,51是功能比较简单的一种,相应的寄存器也比较少,我们常用的就那么几个,像P0 P1 SMOD TMOD之类的,这些存在于标准头文件reg.h里面,因为少,所以大家就直接这么去操作了,每一位对应的意义随便翻一下手册就看得到,甚至做几个小项目就记的很清楚了。所以做51开发的时候大多数都是直接操作寄存器。到了STM32,原理一样,也是有自己的寄存器,但是作为一款ARM内核的芯片,功能多了非常多,寄存器自然也就多了很多,STM32的手册有一千多页,这时候想去像51那样记住每个寄存器已经不现实了,所以ST的工程师就给大家提供了库函数这么一个东西。这是个神器。库函数里面把STM32的所有寄存器用结构体一一对应并且封装起来,而且提供了基本的配置函数。我们要去操作配置某个外设的时候不需要再去翻眼花缭乱的数据手册,直接找到库函数描述拿来就可以用,这样就能把精力放在逻辑代码的开发上,而不是去费力的研究一个芯片的外设要怎么配置寄存器才能驱动起来。简单讲就是这些了,库函数是为了让开发者从大量繁琐的寄存器操作中脱离出来的一个文件包,在使用一个外设的时候让开发者直接去调用相应的驱动函数而不是自己去翻手册一个一个配置寄存器。有人说用库函数掌握不到芯片的精髓,见仁见智了。熟悉一款芯片是在不断的开发使用中逐渐了解并掌握的,调试的过程中会遇到很多问题,会要求我们去跟踪相关寄存器的状态,在整个框架都已经建立起来的基础上再去对照手册做具体到寄存器每一位的分析,代码对照现象,很快就能积累起来经验,祝成功。
寄存器操作:51就是寄存器操作,你用51需要自己写驱动。STM32如果不用库也是跟51一样直接操作寄存器的。库函数操作:STM32的库已经帮你把驱动写好了,你要做的只是配置参数,然后使能。寄存器的优缺点:速度快,但是可读性差,你要改动配置需要去查芯片手册。库函数的优缺点:速度慢,但是可读性强,用GPIO_PIN_5这类可读性强的英文字母,去替代0x0101这类可读性差的数字。
库函数操作简单,但是效率不如寄存器操作的高;寄存器操作很复杂,因为要熟悉上百个寄存器,但是程序效率很高

stm32 用库函数操作和寄存器操作

4,STM32如何使用Systic库函数

systick的中断是系统开辟了的 对于他的配置建议看下core_m3.h里面的SysTick_Config(uint32_t ticks)这个函数 调用这个函数以后 初始化状态就是 使用AHB ticks的值为VAL,也就是计数的滴答值,这个值减到了0就会中断,同时VAL值重新装填 还有 调用了函数以后,默认是开启了滴答计时器,所以要在调用函数之后关闭计时器,在要用的时候开启。对于滴答的开启与关闭是用寄存器做的

5,STM32库函数

EXTI_GetFlagStatus只是纯粹读取中断标志位的状态,但是不一定会响应中断(EXT_IMR寄存器对该中断进行屏蔽);而EXTI_GetITStatus除了读取中断标志位,还查看EXT_IMR寄存器是否对该中断进行屏蔽,在中断挂起&没有屏蔽的情况下就会响应中断。仔细看看代码就知道区别了FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line) FlagStatus bitstatus = RESET; /* Check the parameters */ assert_param(IS_GET_EXTI_LINE(EXTI_Line)); if ((EXTI->PR & EXTI_Line) != (uint32_t)RESET) bitstatus = SET; } else bitstatus = RESET; } return bitstatus;}ITStatus EXTI_GetITStatus(uint32_t EXTI_Line) ITStatus bitstatus = RESET; uint32_t enablestatus = 0; /* Check the parameters */ assert_param(IS_GET_EXTI_LINE(EXTI_Line)); enablestatus = EXTI->IMR & EXTI_Line; if (((EXTI->PR & EXTI_Line) != (uint32_t)RESET) && (enablestatus != (uint32_t)RESET)) bitstatus = SET; } else bitstatus = RESET; } return bitstatus;}
我用的是官方库,平时写程序的时候,是在官方给的例程目录下,找相应的例程进行修改和学习。将看不懂的库函数在库手册里检索,然后必要的时候看一下寄存器手册。我个人觉得,能将库函数大致看懂,当你要写程序的时候知道去哪里找例程,应该找和什么有关的例程(比如写pwm的程序,应该要知道是去目录下找timer相关的例程进行学习和修改)就好了。学得透彻比较难的,因为库函数下面的底层很难懂,你只需要学会查找、修改,能够看懂,能够灵活调用就好了。

6,STM32库函数

EXTI_GetFlagStatus只是纯粹读取中断标志位的状态,但是不一定会响应中断(EXT_IMR寄存器对该中断进行屏蔽);而EXTI_GetITStatus除了读取中断标志位,还查看EXT_IMR寄存器是否对该中断进行屏蔽,在中断挂起&没有屏蔽的情况下就会响应中断。仔细看看代码就知道区别了FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line) FlagStatus bitstatus = RESET; /* Check the parameters */ assert_param(IS_GET_EXTI_LINE(EXTI_Line)); if ((EXTI->PR & EXTI_Line) != (uint32_t)RESET) bitstatus = SET; } else bitstatus = RESET; } return bitstatus;} ITStatus EXTI_GetITStatus(uint32_t EXTI_Line) ITStatus bitstatus = RESET; uint32_t enablestatus = 0; /* Check the parameters */ assert_param(IS_GET_EXTI_LINE(EXTI_Line)); enablestatus = EXTI->IMR & EXTI_Line; if (((EXTI->PR & EXTI_Line) != (uint32_t)RESET) && (enablestatus != (uint32_t)RESET)) bitstatus = SET; } else bitstatus = RESET; } return bitstatus;}

7,关于STM32库函数问题

你说的是3.0以上的固件库吗? SystemInit()函数在主程序中被RCC_Configuration()函数调用,完成系统时钟的配置功能。我看过这个函数的具体内容,是直接操作寄存器来完成配置。如果使用stm32f10x_rcc.c文件中的函数来完成时钟配置,和SystemInit()的顺序和效果一样。 当然,为了保证兼容性,使低版本固件库写的程序运行,就还有stm32f10x_rcc.c存在,像早期版本的RCC_Configuration()函数就是使用这个文件中提供的函数来完成时钟配置的。 补充:是的,Systeminit()函数完成了时钟初始化的功能。另外systick的使用也变简单了,以前要几个函数完成初始化,现在只要一个就行。 你看看3.0版本固件system_stm32f10x.c中的代码是怎样的吧。其中是对RCC寄存器直接赋值操作,和stm32f10x_rcc.c中相关的函数作用一样。 如果在程序中要使用端口、外设等,由于这些东西需要时钟才能工作,所以还是需要stm32f10x_rcc.c中的函数来完成时钟的控制。
一般不行必须要调用stm32f10x_rcc.c,systeminit()只是将系统的时钟帮你配置好,其实你也可以不调用它,你可以自己调用stm32f10x_rcc.c中的函数自己来配置,不过这样的话就要记得配置好flash的等待周期,两种方式之间没什么太大区别。另外一般你会需要开启外设的时钟或者其他一些功能就需要调用stm32f10x_rcc.c中的函数。还有如果你使用的是3.2.0以上的库的话,systeminit()其实不需要你自己调用,startup_stm32f10x_xx.s中有这样的代码reset_handler ldr r0, =systeminit意思就是上电(reset)后执行的第一段代码就是systeminit(),这是在main函数之前调用的,所以不需你自己再去调用了systeminit()在调用的时候要注意你自己板子上的外部晶振是多少,默认是25mhz,如果你板子上的晶振的不是这么大的话,你需要修改stm32f10x.h里面的hse_value 补充:system_stm32f10x.c里的函数的功能仅仅是完成系统时钟的配置,如果你不使用任何外设或者用系统时钟做其他用的话是可以不用stm32f10x_rcc.c stm32f10x_rcc.c中的函数不仅仅是完成分频倍频的功能,还有开启外设时钟,检测rcc中断,配置rtc时钟等功能,不是单单配置一个系统时钟那么简单

8,求助STM32库函数RCC

看模板中main函数里这么一段代码int main(void) /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f10x_xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f10x.c file */ 也就是说,进入main函数前,系统已经做了时钟配置,调用的是SystemInit()函数,那么我们就进入此函数看过究竟。void SystemInit (void) /* Reset the RCC clock configuration to the default reset state(for debug purpose) */ /* Set HSION bit */ RCC->CR |= (uint32_t)0x00000001; /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */#ifndef STM32F10X_CL RCC->CFGR &= (uint32_t)0xF8FF0000;#else RCC->CFGR &= (uint32_t)0xF0FF0000;#endif /* STM32F10X_CL */ /* Reset HSEON, CSSON and PLLON bits */ RCC->CR &= (uint32_t)0xFEF6FFFF; /* Reset HSEBYP bit */ RCC->CR &= (uint32_t)0xFFFBFFFF; /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */ RCC->CFGR &= (uint32_t)0xFF80FFFF;#ifdef STM32F10X_CL /* Reset PLL2ON and PLL3ON bits */ RCC->CR &= (uint32_t)0xEBFFFFFF; /* Disable all interrupts and clear pending bits */ RCC->CIR = 0x00FF0000; /* Reset CFGR2 register */ RCC->CFGR2 = 0x00000000;#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL) /* Disable all interrupts and clear pending bits */ RCC->CIR = 0x009F0000; /* Reset CFGR2 register */ RCC->CFGR2 = 0x00000000; #else /* Disable all interrupts and clear pending bits */ RCC->CIR = 0x009F0000;#endif /* STM32F10X_CL */#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL) #ifdef DATA_IN_ExtSRAM SystemInit_ExtMemCtl(); #endif /* DATA_IN_ExtSRAM */#endif /* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */ /* Configure the Flash Latency cycles and enable prefetch buffer */ SetSysClock();#ifdef VECT_TAB_SRAM SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */#else SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */#endif} 其他的我先都不想管,我就看准了这几句: /* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */那么就是告诉我们,给HCLK、PCLK1和PCLK2的配置是调用 SetSysClock()函数了。继续跟进此函数,如下:static void SetSysClock(void)#ifdef SYSCLK_FREQ_HSE SetSysClockToHSE();#elif defined SYSCLK_FREQ_24MHz SetSysClockTo24();#elif defined SYSCLK_FREQ_36MHz SetSysClockTo36();#elif defined SYSCLK_FREQ_48MHz SetSysClockTo48();#elif defined SYSCLK_FREQ_56MHz SetSysClockTo56(); #elif defined SYSCLK_FREQ_72MHz SetSysClockTo72();#endif /* If none of the define above is enabled, the HSI is used as System clock source (default after reset) */}这其实就告诉我们,SYSCLK的设置就是根据我们定义来设定,如果定义了SYSCLK_FREQ_HSE,那么SYSCLK就是HSE(默认8MHz),如果定义了SYSCLK_FREQ_24MHz,那么SYSCLK就是24MHz,一次类推。而设置时钟是靠SetSysClockToXX()函数来实现的!好了,既然这样,我就想继续跟进,去找SetSysClockToXX(),但是惊讶地发现,提示此函数没有定义!为啥,那是因为我去找的刚好是未被编译的,当然找不到定义,事实上这些XX函数都存在在system_stm32f10x.c文件中,但是只有一个能被跟踪找到,那就是对应的宏被定义了的那个。这些定义到底在哪?跟进!得到如下://system_stm32f10x.c文件#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)/* #define SYSCLK_FREQ_HSE HSE_VALUE */ #define SYSCLK_FREQ_24MHz 24000000#else/* #define SYSCLK_FREQ_HSE HSE_VALUE *//* #define SYSCLK_FREQ_24MHz 24000000 *//* #define SYSCLK_FREQ_36MHz 36000000 *//* #define SYSCLK_FREQ_48MHz 48000000 *//* #define SYSCLK_FREQ_56MHz 56000000 */#define SYSCLK_FREQ_72MHz 72000000#endif这下我想起来了,每次用keil建立工程,总是要求预先定义两个宏:USE_STDPERIPH_DRIVER和STM32F10X_MD,原来这儿就体现出作用了!因为我的芯片是STM32F10X_MD型,所以SYSCLK就被选择了72MHz!至于static void SetSysClockTo72(void)此函数到底是怎么把SYSCLK设置成为72MHz的,我懒得去管了,代码很长,也在system_stm32f10x.c文件中,说实话我真没兴趣去搞明白,但要知道,在这个函数里,顺便把HLCK、PCLK1和PCLK2都做了默认设置!话说回来,我真不想去看寄存器操作的,但是,这个函数里面有一个我认为是ST公司的工程师们大意写错了的地方,如下: /* HCLK = SYSCLK */ RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; /* PCLK2 = HCLK */ RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; /* PCLK1 = HCLK */ RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;从时钟布局图中可以知道,PCLK1的最大时钟为36MHz,PCLK1怎么能等于HCLK呢?此时的HCLK可是72MHz,从下面代码也可看到,确实2分频嘛,那就是36MHz,肯定是注释错了!
文章TAG:STM32库函数总共多少stm32库函数函数

最近更新

  • 电压 电流围成的面积,电流与电压的比值是多少?电压 电流围成的面积,电流与电压的比值是多少?

    电流、电压和功率之间的关系是功率-电流=电压。电压越高,电流越小,所用导线的横截面积越小,相反,电压越小,电流越大,所用导线的横截面积越大,电流是指电荷的定向运动,工作电流,以保证感性电器的.....

    电路设计 日期:2024-04-11

  • 起辉器多少钱,请问空调启动器多少钱一个起辉器多少钱,请问空调启动器多少钱一个

    请问空调启动器多少钱一个付费内容限时免费查看回答很多空调都有空调启动器,一般空调启动机的价格,是在50元到300元左右,具体的价格要看空调启动器的材质来决定,它的材质不一样,价格也是不.....

    电路设计 日期:2024-04-11

  • 飞腾芯片的笔记本,国产电脑处理器有哪些品牌?飞腾芯片的笔记本,国产电脑处理器有哪些品牌?

    在车身尾部,飞腾龙E2000Q芯片和基于该芯片的车内智能终端的图案令人印象深刻,成为了这辆324路公交车最亮眼的核心亮点。今年由腾飞跨境联合品牌广州交信投资有限公司推出的“龙”主题公.....

    电路设计 日期:2024-04-11

  • 电压环路响应速度,电源环路响应电压环路响应速度,电源环路响应

    电压调节器的控制回路的响应速度越快。限制响应速度,可以先放慢环路速度和增益,待电路稳定后再观察伯德图调整环路以满足动态响应的要求,闭环的响应越慢,稳压电路的时间常数:稳压电路中的.....

    电路设计 日期:2024-04-10

  • 红外遥控音乐插座电路,智能红外遥控插座怎么设置?红外遥控音乐插座电路,智能红外遥控插座怎么设置?

    如果只是遥控音响的电源开关,在淘宝上买一套“带继电器的红外遥控套装”就行了,十几块钱。红外遥控系统通用红外遥控系统由发射和接收两部分组成,由编码/解码ASIC芯片进行控制操作,如图所.....

    电路设计 日期:2024-04-10

  • 单差分电路图,差分通道单端输出单差分电路图,差分通道单端输出

    输入级采用双差分通道。该机器将OCL的差分输入和电压放大部分与其后面的驱动输出分开,并将其与前端电路一起设置在电路板上,这是该功率放大器的特点之一,这种布置可以有效地降低大电流电.....

    电路设计 日期:2024-04-10

  • 电路板油脂用什么,油性电路板电路板油脂用什么,油性电路板

    什么是PCB润滑脂?因为电路板是一个敏感部件,清洗时必须使用水,一旦电路板变湿,就会出现问题。应拆下控制电路板,在受污染的印制板上喷洒清洗剂,然后用干净的牙刷刷去污垢和油渍,PCB润滑脂是指.....

    电路设计 日期:2024-04-10

  • 射频mos驱动电路,MOS开关电路怎么接?射频mos驱动电路,MOS开关电路怎么接?

    Mosfet不需要驱动电路。电压和电流太小,芯片无法驱动,例如,dsp的输出只有以下原因:RC时间常数:在驱动电路中,驱动电阻和驱动电容之间形成RC并联网络,pwm驱动mos晶体管的电路提供以下特性:用.....

    电路设计 日期:2024-04-10