收藏 分销(赏)

第7章-CMSIS架构与STM32库开发方式6HPPT学习课件.ppt

上传人:丰**** 文档编号:10160860 上传时间:2025-04-24 格式:PPT 页数:61 大小:3.02MB
下载 相关 举报
第7章-CMSIS架构与STM32库开发方式6HPPT学习课件.ppt_第1页
第1页 / 共61页
第7章-CMSIS架构与STM32库开发方式6HPPT学习课件.ppt_第2页
第2页 / 共61页
点击查看更多>>
资源描述
,*,Click to edit Master text styles,Second Level,Third Level,Fourth Level,Fifth Level,Click to edit Master title style,Embedded System Development,聊城大学 理工学院,曹银杰,caoyinjie,嵌入式系统与应用,1,第,7,章,CMSIS,架构与,STM32,库开发方式,7.1 STM32,库简介,7.2 STM32,结构及库层次关系,7.3,库文件及使用简介,7.4 GPIO,7.5,stm32f10 x.h,中,GPIO,代码剖析,7.6 GPIO,控制,LED,灯实验,7.7,时钟设置与开启外设时钟,2,7.1 STM32,库简介,STM32,外设资源丰富,寄存器的数量多、设置复杂度高,直接配置寄存器方式开发程序效率低。,STM32,库是由,ST,公司针对,STM32,提供的函数接口,即,API(Application Program Interface),,,库是架设在寄存器与用户驱动层之间的代码,向下处理与寄存器直接相关的配置,向上为用户提供配置寄存器的接口。,3,STM32,库简介,开发者可调用这些函数接口来配置,STM32,的寄存器,开发快速,易于阅读,维护成本低等优点。,事实上,库函数的底层实现恰恰是直接配置寄存器方式的最佳例子,想深入了解芯片是如何工作的话,只要追踪到库的最底层实现就能理解。,想修炼,C,语言,就从,ST,的库开始。,4,7.2 STM32,结构及库层次关系,解决不同的芯片厂商生产的,Cortex,微控制器软件的兼容性问题,,ARM,与芯片厂商建立了一个软件抽象层。,CMSIS,标准:,Cortex MicroController Software Interface Standard,。,5,CMSIS,架构,6,STM32,结构及库层次关系,CMSIS,标准中最主要的为,CMSIS,核心层,它包括了:,内核函数层,:其中包含用于访问内核寄存器的名称、地址定义,主要由,ARM,公司提供。,设备外设访问层,:提供了片上的核外外设的地址和中断定义,主要由芯片生产商提供,可见,CMSIS,层位于硬件层与操作系统或用户层之间,提供了与芯片生产商无关的硬件抽象层,可以为接口外设、实时操作系统提供简单的处理器软件接口,屏蔽了硬件差异,这对软件的移植是有极大的好处的。,STM32,的库,就是按照,CMSIS,标准建立的。,7,7.3,库文件及使用简介,新建工程,-,选择芯片后,选择运行环境、用的库、驱动文件、,RTX,等,编译时自动添加其他用的库文件,8,库文件及使用简介,ARM,公司提供的:如,core_cm3.h,、及,core_,前缀,的头文件,核内设备函数层,进入,M3,内核的接口。,stdin.h,头文件,这是一个,ANSI C,文件,是独立于处理器之外的,就像我们熟知的,C,语言头文件,stdio.h,文件一样。,misc.h,和,misc.c,是和,CM3,内核有关的,NVIC,和,SysTick,的驱动代码。自行添加到工程。,ST,公司提供的:,stm32f10 x.h,重要文件,定义寄存器地址、寄存器数据结构、中断向量表。,stm32f10 x_adc.c,、,stm32f10 x_adc.h,,针对模数转换,(ADC),外设,还有很多其他设备外设的驱动程序。,每个外设对应一个,.c,和,.h,后缀的文件。,9,库文件及使用简介,startup_stm32f10 x_xx.s,启动文件,作用是:,1.,初始化堆栈指针,SP;,2.,初始化程序计数器指针,PC;,3.,设置堆、栈的大小,;,4.,设置异常向量表的入口地址,;,5.,配置外部,SRAM,作为数据存储器(这个由用户配置,一般的开发板可没有外部,SRAM,),;,6.,设置,C,库的分支入口,_main,(最终调用,main,函数),;,7.,启动文件还调用了在,system_stm32f10 x.c,文件中的,SystemIni(),函数配置系统时钟。,system_stm32f10 x.c,文件提供了两个函数和一个全局变量,10,库文件及使用简介,stm32f10 x.h,头文件,中重要的内容就是把,STM32,的所有寄存器进行地址映射。,如同,51,单片机的,头文件一样,,stm32f10 x.h,像一个大表格,我们在使用的时候就是通过宏定义进行类似查表的操作。,没有这个文件的话,,怎样,访问,STM32,的,寄存器,有,什么,缺点?,1,、需要查手册来确定哪个地址对应哪个寄存器。,2,、地址易写错、可读性差、易出错、开发效率低。,11,库文件及使用简介,库函数,就是,STM32,的库文件中为我们编写好的函数接口,调用这些库函数,就可以对,STM32,进行配置。我们可以不知道库函数是如何实现的,但必须要知道函数的功能、可传入的参数及其意义、和函数的返回值。,库函数很多,学会查阅库帮助文档就行!,库帮助文档:,stm32f10 x_stdperiph_lib_um.chm,层层打开文档的目录标签即可,。,在用库函数的地方,直接从库帮助文档复制即可。,12,思考题:,1,、没有,stm32f10 x.h,头文件的话,怎样访问,STM32,的寄存器,有什么缺点?,2,、从,STM32,库的实现原理上解答 库到底是什么?为什么要用库?用库函数与直接配置寄存器的区别等问题。,13,7.4 GPIO,GPIO,(,General Purpose I/O,)通用型输入,/,输出,主要用于需要用到,数字量输入,/,输出,的场合。,如:,继电器、,LED,、蜂鸣器等的控制;,传感器状态、高低电平等信息的输入等。,14,1,、,GPIO,简介,大部分,GPIO,为推挽输出,具有完整,I,2,C,功能的是开漏结构;,正常拉出灌入电流为,4mA,,短时间极限值,40mA,;,管脚可承受最大,5V,的输入电压。,GPIO,寄存器位于,AHB,总线上,可以进行高性能的,CPU,快速访问,支持,Cortex-M3,位带操作。,GPIO,允许进行,DMA,数据操作。,15,GPIO,简介,GPIO,引脚又被分为,GPIOA,、,GPIOB,GPIOG,不同的组,每组端口分为,015,,共,16,个不同的引脚,不同芯片的端口组数不同。,GPIO,结构图:,端口配置寄存器,16,GPIO,简介,I/O,引脚可通过,端口配置寄存器,设置,成不同的功能。,四种,输入模式(结构图上半部分):,上拉输入与下拉输入:与,VDD,相连的为上拉电阻,,与,VSS,相连的为下拉电阻。,再经施密特触发器,就,把信号,转化为,0,、,1,存储,在输入数据,寄存器。,浮空输入:不接上拉与下拉电阻,直接由触发器输入,由于其输入阻抗较大,一般把这种模式用于标准的通讯协议如,I2C,、,USART,的接收,端。,模拟输入:,把电压,信号直接传送,到片上外设,模块,如,ADC,。,17,GPIO,简介,结构图下半部分为输出模式结构:,推挽输出模式:在输出高电平时,,P-MOS,导通,低电平时,,N-MOS,管导通。,开漏输出模式:输出,0,时为低电平,,1,为高阻状态。,在使用任何一种开漏模式,都需要接上拉电阻。,18,GPIO,简介,STM32,P0.x,P2.x,GPIO,都可配置为中断功能,并可设置为上升沿、下降沿或边沿触发。,上升沿中断,下降沿中断,边沿中断,GPIO,中断还具,有掉电唤醒功能,19,2,、,GPIO,端口配置寄存器,端口配置低寄存器,GPIOx_CRL,(,配置,07,引脚,),,端口配置高寄存器,GPIOx_CRH(,配置,815,引脚,),(x=A,G),。,可将,I/O,口配置为输入、输出或模拟模式;,PIOx_CRL,复位值:,4444 4444h,,偏移地址:,00h,。,每个引脚的模式由寄存器的,4,个位控制,又分引脚配置,(CNFy1:0),,引脚的模式,(MODEy1:0),,其中,y,表示第,y,个引脚。,GPIOx_CRL,20,GPIO,端口配置寄存器,21,例:,CRH,高寄存器的配置,PIOx_CRH,复位值:,4444 4444h,,偏移地址:,04h,。,例:,GPIOx_CRH,寄存器的第,28,至,29,位设置为,11,,并在第,30,至,31,位设置为,00,答:则把,x,端口第,15,个引脚的模式配置成了:输出的最大速度为,50MHz,的 通用推挽输出模式。,22,3,、端口输入数据寄存器,GPIOx_IDR,端口输入数据寄存器,(GPIOx_IDR)(x=A.E),复位值:,4444 4444h,,地址偏移:,08h,高位,31:16,保留,始终读为,0,。,IDRx15:0,:端口输入数据,(x=0,15),这些位为只读并只能以字的形式读出。读出的值为对应,I/O,口的状态。,23,4,、端口输出数据寄存器,GPIOx_ODR,端口输出数据寄存器,(GPIOx_ODR)(x=A.E),设置,I/O,口的方向输入还是输出。,复位值:,4444 4444h,,地址偏移:,0Ch,高位,31:16,保留,始终为,0,。,ODRx15:0,:端口输出数据方向,(x=0,15),这些位可读可写并只能以字的形式操作。,通过,GPIOx_BSRR(x=A,E),,可以分别地对各个,ODR,位进行独立的置位,/,清零。,24,5,、端口置位,/,清零寄存器,GPIOx_BSRR,端口置位,/,清零寄存器,(GPIOx_BSRR)(x=A.E),复位值:,4444 4444h,,地址偏移:,10h,25,6,、端口位复位寄存器,(GPIOx_BRR),端口位复位寄存器,(GPIOx_BRR)(x=A.E),复位值:,4444 4444h,,地址偏移:,14h,26,7,、端口配置锁定寄存器,GPIOx_LCKR,端口配置锁定寄存器,(GPIOx_LCKR)(x=A.E),复位值:,4444 4444h,,地址偏移:,14h,当执行正确的写序列设置了位,16(LCKK),时,该寄存器用来锁定端口位的配置。,位,15:0,用于锁定,GPIO,端口的配置。在规定的写入操作期间,不能改变,LCKP15:0,。,当对相应的端口位执行了,LOCK,序列后,在下次系统复位之前将不能再更改端口位的配置。,每个锁定位锁定控制寄存器,(CRL,CRH),中相应的,4,个位。,27,例:,要控制引脚电平高低,需要对寄存器进行什么操作?,一个引脚,y,的输出数据由,GPIOx_BSRR,寄存器位的,2,个位来控制分别为,BRy(Bit Reset y),和,BSy(Bit Set y),,,BRy,位用于写,1,清零,使引脚输出低电平;,BSy,位用来写,1,置,1,,使引脚输出高电平。,28,8,、,GPIO,输入输出演示,GPIOx_IDR,1,0,BRy,写,1,Bsy,写,1,IN,OUT,1,0,GPIOx_ODR,GPIOx_PUPDR,vcc,GPIO,GPIOx_CRL,设置引脚为,GPIO,功能,1,配置引脚模式,2,设置,GPIO,的方向,3,设置,GPIO,输出电平,4,GPIO,输入,GPIO,输出,1,高电平,1,输出操作流程,输入操作流程,1,读取,GPIO,引脚电平,4,GPIOx_BSRR,29,7.5,stm32f10 x.h,库中,GPIO,代码剖析,以外设,GPIOC,为例,文件中包含如下宏定义:,#define GPIOC_BASE(APB2PERIPH_BASE+0 x1000),#define APB2PERIPH_BASE(PERIPH_BASE+0 x10000),#define PERIPH_BASE(uint32_t)0 x40000000),首先看外设基地址,PERIPH_BASE,这个宏,宏展开为,0 x4000 0000,并把它强制转换为,uint32_t,类型数据;,总线基地址宏,APB2PERIPH_BASE,指向地址,0 x4001 0000,;,最后到了宏,GPIOC_BASE,为,APB2PERIPH_BASE,加上偏移量,0 x1000,得到了,GPIOC,端口的寄存器组的基地址。,30,stm32f10 x.h,中,GPIO,代码剖析,stm32f10 x.h,文件,还可以发现以下类似的宏:,#define GPIOA_BASE(APB2PERIPH_BASE+0 x0800),#define GPIOB_BASE(APB2PERIPH_BASE+0 x0C00),#define GPIOC_BASE(APB2PERIPH_BASE+0 x1000),#define GPIOD_BASE(APB2PERIPH_BASE+0 x1400),GPIOA,、,GPIOB,、,GPIOC,、,GPIOD,寄存器组的起始地址,都对应着独立的一组寄存器。,31,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;,GPIO_TypeDef;,#define GPIOA(GPIO_TypeDef*)GPIOA_BASE),#define GPIOB(GPIO_TypeDef*)GPIOB_BASE),(,GPIO_TypeDef*),把,GPIOA_BASE,地址转换为,GPIO_TypeDef,结构体指针,类型。,对每个,GPIOx,是用,结构,封装了寄存器组,stm32f10 x.h,中代码:,GPIO_TypeDef,,这个结构体的首地址(变量,CRL,的地址)若为,0 x4001 1000,,那么结构体中第二个变量(,CRH,)地址为,0 x4001 1000+0 x04,加上的这个,0 x04,,正是,4,字节地址偏移量。,32,stm32f10 x.h,中,GPIO,代码剖析,有了这样的宏,就可用以下方式来修改,GPIO,寄存器:,GPIO_TypeDef*GPIOx;,/,定义一个,GPIO_TypeDef,型结构体指针,GPIOx,GPIOx=GPIOA;,/,把指针地址设置为宏,GPIOA,地址,GPIOx-CRL=0 xffffffff;,/,通过指针访问并修改,GPIOA_CRL,寄存器,通过类似的方式,我们就可以给具体的寄存器写上适当的参数,控制,STM32,了。,这只是库开发的皮毛,库提供了更简单的开发方式。,33,GPIO,1.,配置寄存器:选定,GPIO,的特定功能,最基本的如:选择作为输入还是输出端口。,2.,数据寄存器:保存了,GPIO,的输入电平 或 将要输出的电平。,3.,位控制寄存器:设置某引脚的数据 为,1,或,0,,控制输出的电平。,4.,锁定寄存器:设置某锁定引脚后,就不能修改其配置。,34,C,语言程序举例:,TESTc.C,#define uint32 unsigned int,#define N 10,uint32 sum;,/,使用加法运算来计算,1+2+3+.+(N-1)+N,的值。,(N0),int main(void),uint32 i;,sum=0;,for(i=0;i,就要选定需要控制的特定引脚,2.GPIO,功能如此丰富,-,配置需要的特定功能,3.,控制,LED,的亮和灭,-,设置,GPIO,输出电压的高低,与,GPIO,相关的寄存器了,可以通过,STM32,参考手册,来查看,40,LED,流水灯实验,LED,实验中用到了,RCC,跟,GPIO,这两个外设。环境配置如图:,main.c,led.c,led.h,41,Led,流水灯主程序:,main.c,#include led.h,void Delay(_IO uint32_t nCount)/,简单延时函数,for(;nCount!=0;nCount-);,int main(void),LED_GPIO_Config();,while(1),LED1(ON);,Delay(0 x0FFFFF);,LED1(OFF);,LED2(ON);,Delay(0 x0FFFFF);,LED2(OFF);,LED3(ON);,Delay(0 x0FFFFF);,LED3(OFF);,42,初始化,LED,函数,led.c,#include led.h,#include stm32f10 x_gpio.h,#include stm32f10 x_rcc.h,void LED_GPIO_Config(void),/*,利用库,定义一个,GPIO_InitTypeDef,类型的结构体*,/,GPIO_InitTypeDef GPIO_InitStructure;,/*,开启,GPIOC,的外设时钟*,/,RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);,/*,选择要控制的,GPIOC,引脚,GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;,/*,设置引脚模式为通用推挽输出*,/,GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;,43,初始化,LED,函数,led.c,/*,设置引脚速率为,50MHz*/,GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz,;,/*,调用库函数,初始化,GPIOC*/,GPIO_Init(GPIOC,/,关闭,led,灯,GPIO_SetBits(GPIOC,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);,个函数,LED_GPIO_Config(),实现了所有为点亮,led,的配置,44,led.h,#ifndef _LED_H,#define _LED_H,#include stm32f10 x.h,/*the macro definition to trigger the led on or off,*1-off,*0-on,*/,#define ON 0,#define OFF 1,/*,带参宏,可像内联函数一样使用,*/,#define LED1(a)if(a)GPIO_SetBits(GPIOC,GPIO_Pin_3);,else GPIO_ResetBits(GPIOC,GPIO_Pin_3),45,led.h,续,#define LED2(a)if(a)GPIO_SetBits(GPIOC,GPIO_Pin_4);,else GPIO_ResetBits(GPIOC,GPIO_Pin_4),#define LED3(a)if(a)GPIO_SetBits(GPIOC,GPIO_Pin_5);,else GPIO_ResetBits(GPIOC,GPIO_Pin_5),void LED_GPIO_Config(void);,#endif/*_LED_H*/,在编译过程,编译器会把带参宏展开,在相应的位置替换为宏展开代码。,其中的反斜杠符号,“,”,叫做续行符,,后面,不能有空格、注释等,46,led,用到,stm32f10 x_gpio.h,库的结构、宏定义,1,、,GPIO_InitTypeDef,结构,引脚初始化的结构,2,、,GPIO_Pin_x,引脚为,uint16_t,类型,宏定义:,1.#define GPIO_Pin_0(uint16_t)0 x0001)/*!Pin 0 selected*/,2.#define GPIO_Pin_1(uint16_t)0 x0002)/*!Pin 1 selected*/,3.#define GPIO_Pin_2(uint16_t)0 x0004)/*!Pin 2 selected*/,4.#define GPIO_Pin_3(uint16_t)0 x0008)/*!Pin 3 selected*/,例:,GPIO_Pin_0,(,0000 0000 0000 0001,),B,GPIO_Pin_1,(,0000 0000 0000 0010,),B,47,led,用到,stm32f10 x_gpio.h,库的结构、宏定义,3,、,GPIOSpeed_TypeDef,定义,GPIO,的输出速率:,typedef,enum,GPIO_Speed_10MHz,=1,/,枚举,常量值,1,,对应,10MHz,GPIO_Speed_2MHz,/,常量值为,2,,对应,2MHz,GPIO_Speed_50MHz,/,常量值为,3,,对应,50MHz,GPIOSpeed_TypeDef;,GPIO_Speed_10MHz,对应,(0001)B,GPIO_Speed_2MHz,对应,(0010)B,GPIO_Speed_50MHz,对应,(0011)B,Speed,控制参数,它的宏展开低,2,位的值,正好符合,寄存器,MODEy,中,2,位的控制值,。,直接,把这个参数写入,CRL,、,CRH,配置寄存器的,MODEy,位,其中,y,由,GPIO_Pin,参数,确定第几引脚。,48,led,用到,stm32f10 x_gpio.h,库的结构、宏定义,4,、,GPIOMode_TypeDef,结构定义,GPIO,引脚的功能:,typedef enum,GPIO_Mode_AIN=0 x0,/,模拟输入模式,GPIO_Mode_IN_FLOATING=0 x04,/,浮空输入模式,GPIO_Mode_IPD=0 x28,/,下拉输入模式,GPIO_Mode_IPU=0 x48,/,上拉输入模式,GPIO_Mode_Out_OD=0 x14,/,开漏输出模式,GPIO_Mode_Out_PP=0 x10,/,通用推挽输出模式,GPIO_Mode_AF_OD=0 x1C,/,复用功能开漏输出,GPIO_Mode_AF_PP=0 x18 /,复用功能推挽输出,GPIOMode_TypeDef;,49,用于初始化的库函数,GPIO_Init(),通过查找库帮助文档获得,50,Error:L6218E:,Error:L6218E:Undefined symbol assert_param(referred from stm32f10 x_gpio.o).,断言机制函数,assert_param,,,STM32,的函数:,assert_param(IS_GPIO_ALL_PERIPH(GPIOx);,刚开始学习的时候都遇到编译不过去的问题,通过在文件中添加,USE_STDPERIPH_DRIVER,来解决的:,51,error 65:,创建一个,STM32F103VE,核的项目,error 65:access violation at 0 x40021000:no read permission,是,Debug,里面的设置,有缺陷,不会自动匹配:,Dialog DLL,:,DCM3.DLL,Parameter,:,-,pCM3,应,手动,改为,:,Dialog DLL,:,DARMSTM.DLL,Parameter,:,-pSTM32F103VE,52,逻辑分析窗口使用,再点击,Setup,,输入,LED,灯对应的三个信号,PORTB.0,、,PORTF.7,、,PORTF.8,;,Display Type,选择,bit,,然后单击,Close,关闭该对话框;,53,逻辑分析窗口使用,点击,运行,按钮。运行一段时间之后,点击,停止,按钮,暂停仿真回到逻辑分析窗口,,可通过,Zoom,里面的,In,按钮来放大波形,通过,Out,按钮来缩小波形,或者按,All,显示全部波形。,54,7.7,时钟设置与开启外设时钟,外设初始化后,必须要开启外设时钟。,开启外设时钟之前,首先要配置好系统时钟,SYSCLK,。,在,startup_stm32f10 x_hd.s,启动文件中,调用,main,函数之前就先调用了,SystemInit(),函数,就是设置系统时钟,SYSCLK,:时钟来源、倍频、分频等控制参数。,这个函数的定义在,system_stm32f10 x.c,文件之中。,55,时钟设置与开启外设时钟,void SystemInit(void),函数的执行流程是先将与配置时钟相关的寄存器都复位为默认值,复位寄存器后,调用了另外一个函数,SetSysClock(),,其代码:,在,system_stm32f10 x.c,文件的开头,有条件编译定义。选择相应的时钟。,56,时钟设置与开启外设时钟,GPIO,所用的时钟,PCLK2,我们采用默认值,也为,72MHz,。,开启和关闭外设时钟也有封装好的库函数,RCC_APB2PeriphClockCmd(),。在,led.c,文件中调用了这个函数。,/*,开启,GPIOC,外设时钟,,参数,DISABLE,为关闭,*,/,RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);,如用到,I/O,引脚,复用功能,还要开启其复用功能时钟,。,如,GPIOC,的,Pin4,还,可作为,ADC1,的输入引脚,,把,它作为,ADC1,来用,,,除开启,GPIOC,时钟,,还要开启,ADC1,时钟:,RCC_APB2PeriphClockCmd,(RCC_APB2Periph_GPIOC,ENABLE);,RCC_APB2PeriphClockCmd,(RCC_APB2Periph_ADC1,ENABLE);,57,挂载在,APB2,上的外设,查手册可知挂载在,APB2,上的外设;,通过库函数控制相应的外设时钟状态。,58,几个规范的位操作方法,将,char,型变量,a,的第七位,(bit6),清,0,,其它位不变。,a,/,括号内,1,左移,6,位,得二进制数:,0100 0000,/,按位取,反得,1011 1111,,与,a,作,”,位与,&,”,运算,,/,a,的第,7,位(,bit6,)被置零,而其它位不变。,同理,将变量,a,的第七位,(bit6),置,1,,,a|=(16);,同理,将,变量,a,的第七位,(bit6),取反,a=(1CRL=0 x44333444;,内核执行效率最高的,方式,确定,这样的一个值,却是一件麻烦,事。,配置,寄存器还可以,用前面,提到的,三,种位操作,方式:,1,.GPIOC-CRL /,清空,Pin3,的,4,个控制位,2.GPIOC-CRL|=(uint32_t)(0011CRL /,清空,Pin4,的,4,个控制位,4.GPIOC-CRL|=(uint32_t)(0011CRL /,清空,Pin5,的,4,个控制位,6.GPIOC-CRL|=(uint32_t)(00114*5);/,配置,Pin5,的,4,个控制位,修改,起来比较,容易,执行效率低些,本章介绍的库开发方式,调用库函数耗时,但易快速编程;,CPU,高速了,一般不必担心耗时。,60,课下任务,作业:,1,、试述,STM32,的系统时钟,并说明是如何设置的?,2,、举例说明,STM32,的外设时钟是如何开启与关闭的。,3,、,LED,流水灯模拟实验,实验报告(包括每个语句的解释意义)。,思考简答:,在,stm32f10 x_conf.h,这个头文件中定义的函数声明还是宏定义,怎么在其它文件中应用呢?,自学:,GPIO_Init(),函数的定义代码分析,见野火,PDF,资料,P105-106.,61,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服