STM32时钟与GPIO设计.ppt

上传人:牧羊曲112 文档编号:5449598 上传时间:2023-07-08 格式:PPT 页数:55 大小:1.41MB
返回 下载 相关 举报
STM32时钟与GPIO设计.ppt_第1页
第1页 / 共55页
STM32时钟与GPIO设计.ppt_第2页
第2页 / 共55页
STM32时钟与GPIO设计.ppt_第3页
第3页 / 共55页
STM32时钟与GPIO设计.ppt_第4页
第4页 / 共55页
STM32时钟与GPIO设计.ppt_第5页
第5页 / 共55页
点击查看更多>>
资源描述

《STM32时钟与GPIO设计.ppt》由会员分享,可在线阅读,更多相关《STM32时钟与GPIO设计.ppt(55页珍藏版)》请在三一办公上搜索。

1、Embedded System Development,嵌入式系统与应用,第8章 STM32时钟与GPIO设计,8.1 时钟设置与开启外设时钟 8.2 GPIO简介8.3 GPIO端口配置寄存器8.4 stm32f10 x.h库中GPIO代码剖析8.6 GPIO控制LED灯实验,8.1 系统时钟配置与外设时钟开启,在startup_stm32f10 x_hd.s启动文件中,调用_main函数之前先调用了SystemInit()初始化函数,其中系统时钟SYSCLK设置:时钟源、倍频、分频等控制参数。,SystemInit()定义在system_stm32f10 x.c文件中,其他的配置主要在st

2、m32f10 x_rcc.c中。使用外设时,配置初始化后,必须也要开启外设时钟。,8.1.1 时钟设置解析,系统时钟SYSCLK是SystemInit()先将配置时钟相关的寄存器都复位为默认值,再调用SetSysClock()选择使用频率,而具体设置是通过宏定义设置的。函数调用顺序:启动文件 SystemInit()SetSysClock()SetSysClockTo72()。,1、SystemInit(),STM32时钟系统的SystemInit()中设置:SYSCLK(系统时钟)=72MHzAHB总线时钟(使用SYSCLK)=72MHzAPB1总线时钟(PCLK1)=36MHzAPB2总线

3、时钟(PCLK2)=72MHzPLL时钟=72MHz用到的RCC寄存器复位值:RCC_CR=0 x0000 xx83;RCC_CFGR=0 x0000 0000;RCC_CIR=0 x0000 0000;RCC_CFGR2=0 x0000 0000;这些RCC时钟寄存器组名的宏定义与其他外设寄存器名定义都在stm32f10 x.h文件中。,RCC时钟寄存器组在stm32f10 x.h中的定义,typedef struct_IO uint32_t CR;_IO uint32_t CFGR;_IO uint32_t CIR;_IO uint32_t APB2RSTR;_IO uint32_t AP

4、B1RSTR;_IO uint32_t AHBENR;_IO uint32_t APB2ENR;_IO uint32_t APB1ENR;_IO uint32_t BDCR;_IO uint32_t CSR;#ifdef STM32F10X_CL _IO uint32_t AHBRSTR;_IO uint32_t CFGR2;#endif/*STM32F10X_CL*/#if defined(STM32F10X_LD_VL)|defined(STM32F10X_MD_VL)|defined(STM32F10X_HD_VL)uint32_t RESERVED0;_IO uint32_t CFGR

5、2;#endif/*STM32F10X_LD_VL|STM32F10X_MD_VL|STM32F10X_HD_VL*/RCC_TypeDef;,_IO 宏定义core_cm3.h中:#define_IOvolatile;volatile,易变的,用变量时需到原地址重新存取。uint32_t定义在stdin.h里。typedef unsigned int uint32_t;知道了结构体首地址就确定RCC寄存器组所有32位寄存器的地址,0 x04正好是地址偏移量,所以把连续的寄存器组定义为结构。,2、SetSysClock()函数如下,此函数中选择调用确定使用频率的函数。static void S

6、etSysClock(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/使用此项 SetSy

7、sClockTo72();#endif,3、SetSysClockTo72()函数,各个SetSysClockToXX(void)函数,配置了具体的系统时钟,PLL倍频以及分频系数。采用寄存器直接配置方式,如:static void SetSysClockTo72(void)_IO uint32_t StartUpCounter=0,HSEStatus=0;/*SYSCLK,HCLK,PCLK2 and PCLK1 configuration*/*Enable HSE*/RCC-CR|=(uint32_t)RCC_CR_HSEON);do HSEStatus=RCC-CR 欲深入分析时钟配置,

8、就仔细阅读这些最底层的库函数!,8.1.2 开启关闭外设时钟,外设都是挂在AHB、APB1、APB2总线上,要想使用某个外设,必须初始化外设后,再开启使用开启外设的时钟,不用时再关闭外设时钟,从而降低STM32的整体功耗。stm32f10 x_rcc.c文件中有开启和关闭外设时钟的库函数,如下:RCC_AHBPeriphClockCmd(外设名,ENABLE|DISABLE)挂在AHB总线外设的开启与关闭函数,ENABLE开启,DISABLE关闭外设时钟;RCC_APB1PeriphClockCmd(外设名,ENABLE|DISABLE)挂在APB1总线外设的开启与关闭函数;RCC_APB2P

9、eriphClockCmd(外设名,ENABLE|DISABLE)挂在APB2总线外设的开启与关闭函数;,挂载在AHB的外设名,stm32f10 x_rcc.h中对外设名进行了宏定义,看名即知设备。#define RCC_AHBPeriph_DMA1(uint32_t)0 x00000001)#define RCC_AHBPeriph_DMA2(uint32_t)0 x00000002)#define RCC_AHBPeriph_SRAM(uint32_t)0 x00000004)#define RCC_AHBPeriph_FLITF(uint32_t)0 x00000010)#define

10、RCC_AHBPeriph_CRC(uint32_t)0 x00000040)#define RCC_AHBPeriph_FSMC(uint32_t)0 x00000100)#define RCC_AHBPeriph_SDIO(uint32_t)0 x00000400)#define RCC_AHBPeriph_OTG_FS(uint32_t)0 x00001000)#define RCC_AHBPeriph_ETH_MAC(uint32_t)0 x00004000)#define RCC_AHBPeriph_ETH_MAC_Tx(uint32_t)0 x00008000)#define RC

11、C_AHBPeriph_ETH_MAC_Rx(uint32_t)0 x00010000),挂载在APB2上的外设名,#define RCC_APB2Periph_AFIO(uint32_t)0 x00000001)#define RCC_APB2Periph_GPIOA(uint32_t)0 x00000004)#define RCC_APB2Periph_GPIOB(uint32_t)0 x00000008)#define RCC_APB2Periph_GPIOG(uint32_t)0 x00000100)#define RCC_APB2Periph_ADC1(uint32_t)0 x000

12、00200)#define RCC_APB2Periph_ADC2(uint32_t)0 x00000400)#define RCC_APB2Periph_TIM1(uint32_t)0 x00000800)#define RCC_APB2Periph_SPI1(uint32_t)0 x00001000)#define RCC_APB2Periph_TIM8(uint32_t)0 x00002000)#define RCC_APB2Periph_USART1(uint32_t)0 x00004000)#define RCC_APB2Periph_ADC3(uint32_t)0 x0000800

13、0)#define RCC_APB2Periph_TIM15(uint32_t)0 x00010000)#define RCC_APB2Periph_TIM16(uint32_t)0 x00020000)#define RCC_APB2Periph_TIM17(uint32_t)0 x00040000)#define RCC_APB2Periph_TIM9(uint32_t)0 x00080000)#define RCC_APB2Periph_TIM10(uint32_t)0 x00100000)#define RCC_APB2Periph_TIM11(uint32_t)0 x00200000

14、),挂载在APB1上的外设名,#define RCC_APB1Periph_TIM2(uint32_t)0 x00000001)#define RCC_APB1Periph_TIM3(uint32_t)0 x00000002)#define RCC_APB1Periph_TIM14(uint32_t)0 x00000100)#define RCC_APB1Periph_WWDG(uint32_t)0 x00000800)#define RCC_APB1Periph_SPI2(uint32_t)0 x00004000)#define RCC_APB1Periph_SPI3(uint32_t)0

15、x00008000)#define RCC_APB1Periph_USART2(uint32_t)0 x00020000)#define RCC_APB1Periph_USART3(uint32_t)0 x00040000)#define RCC_APB1Periph_UART4(uint32_t)0 x00080000)#define RCC_APB1Periph_UART5(uint32_t)0 x00100000)#define RCC_APB1Periph_I2C1(uint32_t)0 x00200000)#define RCC_APB1Periph_I2C2(uint32_t)0

16、x00400000)#define RCC_APB1Periph_USB(uint32_t)0 x00800000)#define RCC_APB1Periph_CAN1(uint32_t)0 x02000000)#define RCC_APB1Periph_CAN2(uint32_t)0 x04000000)#define RCC_APB1Periph_BKP(uint32_t)0 x08000000)#define RCC_APB1Periph_PWR(uint32_t)0 x10000000)#define RCC_APB1Periph_DAC(uint32_t)0 x20000000)

17、#define RCC_APB1Periph_CEC(uint32_t)0 x40000000),开启外设时钟举例:,GPIO的C口挂在APB2总线,所用的时钟PCLK2为72MHz。开启GPIOC外设时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE)如用到I/O引脚复用功能,还要开启其复用功能时钟。如GPIOC的Pin4还可作为ADC1的输入引脚,把它作为ADC1来用,除开启GPIOC时钟,还要开启ADC1时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE)RCC_APB2Per

18、iphClockCmd(RCC_APB2Periph_ADC1,ENABLE)开启关闭外设时钟的三个函数,内部对外设时钟的使能寄存器操作,达到开启和关闭的目的。,8.2 GPIO简介,GPIO(General Purpose I/O)通用型输入/输出,主要用于需要用到数字量输入/输出的场合。如:继电器、LED、蜂鸣器等的控制;传感器状态、高低电平等信息的输入等。管脚可承受最大5V的输入电压,电流为4mA,短时间极限值40mA;。,GPIO简介,GPIO引脚又被分为GPIOA、GPIOBGPIOG不同的组,每组端口分为015,共16个引脚,不同芯片的端口组数不同。GPIO结构图:,端口配置寄存器

19、,GPIO简介,I/O引脚可通过端口配置寄存器设置成不同的功能。四种输入模式(图上半部分):上拉输入与下拉输入:与VDD相连的为上拉电阻,与VSS相连的为下拉电阻。再经施密特触发器就把信号转化为0、1存储在输入数据寄存器。浮空输入:不接上拉与下拉电阻,直接由触发器输入,由于其输入阻抗较大,一般把这种模式用于标准的通讯协议如I2C、USART的接收端。模拟输入:把电压信号直接传送到片上外设模块,如ADC,GPIO简介,推挽输出模式:输出1时P-MOS导通输出高电平1,0时N-MOS管导通输出低电平0。开漏输出模式:只有N-MOS管,外部需接上拉电阻,输出0时导通,为低电平0;输出1时截止,为高阻

20、状态。复用功能的推挽式输出模式。复用功能的开漏输出模式。,一只三极管放大信号正半周,另一只放大负半周,故称推挽放大器,四种输出模式(图下半部分):,GPIO简介,GPIO都可配置为中断功能,并可设置为上升沿、下降沿或边沿触发。,GPIO中断还具有掉电唤醒功能,8.3 GPIO端口配置寄存器,1、端口配置低寄存器GPIOx_CRL(配置07引脚)x=AG,芯片的GPIO端口。PIOx_CRL地址偏移量:0 x00h,复位值:0 x4444 4444,第y个引脚的模式由寄存器的4个位控制,MODEy1:0引脚模式位,CNFy1:0引脚配置位。可配置为4种输入、4种输出模式。,GPIO端口配置寄存器

21、,CNFy1:0:端口y配置位输入模式(MODE1:0=00):00:模拟输入01:浮空输入(复位默认值)10:上拉/下拉输入11:保留输出模式(MODE1:000):00:通用推挽输出01:通用开漏输出10:复用功能推挽输出11:复用功能开漏输出,MODEy1:0:端口y模式位输入模式00:复位默认值输出模式01:最大速度10MHz10:最大速度2MHz11:最大速度50MHz,PIOx_CRL复位值4444 4444h,即CNFy1:001、MODEy1:000,复位后端口配置为什么口?,2、端口配置高寄存器GPIOx_CRH,GPIOx_CRH(配置815引脚)与端口配置低寄存器类似。地

22、址偏移量:0 x04h,复位值:0 x4444 4444例1:GPIOx_CRH寄存器的第28至29位设置为11,并在第30至31位设置为00:答:则把x端口第15个引脚的模式配置成了:输出的最大速度为50MHz的 通用推挽输出模式。例2:上题反过来。,3、端口输入数据寄存器GPIOx_IDR,端口输入数据寄存器(GPIOx_IDR)(x=A.G),读该寄存器可看某个IO口的输入状态。地址偏移量:0 x08h,复位值:0 x0000 XXXX高位31:16保留,始终读为0。IDRy15:0(y=015)每个位对应I/O口的输入状态。GPIOx_IDR为只读并只能以字的形式读出。,4、端口输出数

23、据寄存器GPIOx_ODR,GPIOx_ODR(x=A.E)位。写该寄存器可控制某个IO口的输出电平,读该寄存器可以判断IO口的输出状态。地址偏移量:0 x0Ch,复位值:0 x0000 0000高位31:16保留,始终为0。ODRy15:0:端口输出数据(y=015)这些位可读可写并只能以字的形式操作。通过GPIOx_BSRR(x=AG),可以分别地对各个ODR位进行独立的置位/清零。,5、端口位置位/清零寄存器GPIOx_BSRR,GPIOx_BSRR(x=A.G),对GPIOx的端口置位/清零。地址偏移量:0 x10,复位值:0 x0000 0000,位31:16为BRy(y=015),

24、清零,只能以字写入:0:对应的ODRx位不产生影响;1:对应的ODRx位清零;位15:0为BSy(y=015),置位,只能以字写入:0:对对应的ODRx位不产生影响;1:对应的ODRx位置位;注:如果同时设置BSy和BRy的对应位,BSx位起作用。,6、端口位清零寄存器(GPIOx_BRR),GPIOx_BRR(x=A.G)对GPIOx的端口清零。注意:相当于GPIOx_BSRR寄存器的清零功能。地址偏移量:0 x14,复位值:0 x0000 0000,Bits 31:16 Reserved位15:0为BRy(y=015):只能以字写入:0:对应的ODRx位不产生影响;1:对应的ODRx位清零

25、;,7、端口配置锁定寄存器GPIOx_LCKR,端口配置锁定寄存器(GPIOx_LCKR)(x=A.G)地址偏移量:0 x18,复位值:0 x0000 0000,位16(LCKK):当执行正确的写序入列(写1-写0-写1-写0-写1),置1下次系统复位前该寄存器被锁住。位15:0:在LCKK位为0时:LCKy写1锁定对应端口y脚配置寄存器(CRL或CRH)中相应的4个位;LCKy写0不锁;,例:,要控制引脚电平高低,需要对寄存器进行什么操作?一个引脚y的输出数据由GPIOx_BSRR寄存器位的2个位来控制分别为BRy(Bit Reset y)和BSy(Bit Set y),BRy位用于写1清零

26、,使引脚输出低电平;BSy位用来写1置1,使引脚输出高电平。,8.4 stm32f10 x.h库中GPIO代码剖析,以外设GPIOC为例,文件中包含如下宏定义:#define PERIPH_BASE(uint32_t)0 x40000000)#define APB2PERIPH_BASE(PERIPH_BASE+0 x10000)#define GPIOC_BASE(APB2PERIPH_BASE+0 x1000)先看外设基地址宏PERIPH_BASE,宏展开为uint32_t类型 0 x4000 0000;总线基地址宏APB2PERIPH_BASE指向地址0 x4001 0000;最后到了宏

27、GPIOC_BASE为APB2PERIPH_BASE加上地址偏移量0 x1000得到了GPIOC端口的寄存器组的基地址为0 x4001 1000。,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

28、、GPIOB、GPIOC、GPIOD寄存器组的起始地址,都对应着独立的一组寄存器。,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 地址转

29、换为GPIO_TypeDef 结构体指针类型。,对每个GPIOx是用结构封装了寄存器组,stm32f10 x.h中代码:,结构体首地址即CRL地址若为0 x4001 1000,那么第二个变量CRH为0 x4001 1000+0 x04,0 x04正好是寄存器组中的地址偏移量。所以把连续的寄存器组定义为结构。,stm32f10 x.h中GPIO代码剖析,有了这样的宏,就可用以下方式来修改GPIO寄存器:GPIO_TypeDef*GPIOx;/*定义GPIOx指针变量为GPIO_TypeDef结构体型GPIOx=GPIOA;/把指针地址设置为宏GPIOA地址 GPIOx-CRL=0 xFFFF F

30、FFF;/“-”通过指针访问并修改GPIOA_CRL寄存器 通过类似的方式,我们就可以给具体的寄存器写上适当的参数,控制STM32了。这只是库开发的皮毛,库提供了更简单的开发方式。,使用GPIO,1.配置寄存器:选定GPIO的特定功能,最基本的如:选择作为输入还是输出端口。2.数据寄存器:保存了GPIO的输入电平 或 将要输出的电平。3.位控制寄存器:设置某引脚的数据 为1或0,控制输出的电平。4.锁定寄存器:设置某锁定引脚后,就不能修改其配置。,关于GPIO库函数,7.6 LED流水灯实验,实验学习方法,先学习例程编写方法,掌握后,在实验过程中改写程序、逐渐编写程序!想要控制LED灯,当然是

31、通过控制STM32芯片的I/O引脚电平的高低来实现。,LED流水灯实验,LED流水灯实验,LED实验中用到了RCC跟GPIO这两个外设。环境配置如图:用到的源程序:main.cled.cled.h,Led流水灯主程序:main.c,#include led.hvoid Delay(_IO uint32_t nCount)/简单延时函数 for(;nCount!=0;nCount-);int main(void)LED_GPIO_Config();/函数在led.c中定义while(1)LED1(ON);/函数在头文件led.h中定义Delay(0 x0FFFFF);LED1(OFF);LED2

32、(ON);Delay(0 x0FFFFF);LED2(OFF);LED3(ON);Delay(0 x0FFFFF);LED3(OFF);,led.c-初始化函数 LED_GPIO_Config(),#include led.h#include stm32f10 x_gpio.h#include stm32f10 x_rcc.hvoid LED_GPIO_Config(void)/*用库定义一个GPIO_InitTypeDef类型的结构体*/GPIO_InitTypeDef GPIO_InitStructure;/*开启GPIOC的外设时钟*/RCC_APB2PeriphClockCmd(RCC

33、_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;,led.c,/设置引脚速率为50MHz GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;/端口初始化库函数,利用上面设置的参数初始化GPIOCGPIO_Init(GPIOC,函数LED_GPIO_Config()实现了所

34、有为点亮led的配置,led.h头文件,#ifndef _LED_H/条件编译,防止头文件重复包含#define _LED_H/独立写头文件,方便以后扩展使用#include stm32f10 x.h/*the macro definition to trigger the led on or off*0-on*1-off*/#define ON 0#define OFF 1/*带参宏,可像内联函数一样使用*/#define LED1(a)if(a)GPIO_SetBits(GPIOC,GPIO_Pin_3);else GPIO_ResetBits(GPIOC,GPIO_Pin_3),led.

35、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*/在编译过程,编译器会把带参宏展开,在相应的位置替换为宏展开代码。其中的反斜杠符号“”叫做续行符,后面不能有空格、注释等,led用到stm32

36、f10 x_gpio.h库的结构、宏定义,1、GPIO_InitTypeDef结构,引脚初始化的结构,2、GPIO_Pin_x 引脚为uint16_t类型,宏定义:,#define GPIO_Pin_0(uint16_t)0 x0001)/*!Pin 0 selected*/#define GPIO_Pin_1(uint16_t)0 x0002)/*!Pin 1 selected*/#define GPIO_Pin_2(uint16_t)0 x0004)/*!Pin 2 selected*/#define GPIO_Pin_3(uint16_t)0 x0008)/*!Pin 3 selecte

37、d*/,GPIO_Pin_x,x位为1,其余位为0,在第x位置1表示pin x例:GPIO_Pin_1(0000 0000 0000 0010)B,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_S

38、peed_2MHz 对应(0010)B GPIO_Speed_50MHz 对应(0011)BSpeed控制参数,它的宏展开低2位的值,正好符合寄存器MODEy中2位的控制值。直接把这个参数写入CRL、CRH配置寄存器的MODEy位,其中y由GPIO_Pin参数确定第几引脚。,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,/下拉

39、输入模式 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;,led用到stm32f10 x_gpio.h库的结构、宏定义,四种输出模式参数中的bit4 均为1,而四种输入模式中的bit4均为0。所以在代码中通过与0 x10作位与运算,即可区分输入和输出模式。而bit2和bit3的参数值正好对应为CRL、

40、CRH寄存器中的CNFy的2个控制位。确定是什么模式。经过与Speed参数MODEy组合后,配置一个引脚的4位参数就确定了。,用于初始化的库函数GPIO_Init(),通过查找库帮助文档获得,DMK软件BUG: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:-pSTM32F103V

41、E,逻辑分析窗口使用,再点击Setup,输入LED灯对应的三个信号PORTB.0、PORTF.7、PORTF.8;,Display Type选择bit,然后单击Close关闭该对话框;,逻辑分析窗口使用,点击运行按钮。运行一段时间之后,点击停止按钮,暂停仿真回到逻辑分析窗口,可通过Zoom里面的In按钮来放大波形,通过Out按钮来缩小波形,或者按All显示全部波形。,8.7 再论库开发方式,LED实验中寄存器配置经历了一下四步:1、led.c代码对 GPIO_InitStructure.GPIO_Pin 结构体成员赋值为GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5,宏展开为

42、(0000 0000 0011 1000)B,表明对这三个引脚进行配置。2、对.GPIO_Mode 赋值为GPIO_Mode_Out_PP,宏展开为(0001 0100)B,表明把这三个引脚都设置为通用推挽模式。3、对.GPIO_Speed赋值为GPIO_Speed_50MHz,宏展开为(0011)B,表明设置这三个引脚的输出最大速度为50MHz。调用GPIO_Init(),把以上参数写到配置寄存器。,再论库开发方式,附录:几个规范的位操作方法将char型变量a的第七位(bit6)清0,其它位不变。a,再论库开发方式,LED实验中用直接配置寄存器的方法,只需要一个语句:GPIOC-CRL=0

43、x44333444;执行效率最高,确定这样的一个值,却是一件麻烦事。配置寄存器还可以用三种位操作方式:1.GPIOC-CRL/配置Pin5的4个控制位 修改起来比较容易,执行效率低些本章介绍的库开发方式,调用库函数耗时,但易快速编程;CPU高速了,一般不必担心耗时。,课下任务,作业:1、试述STM32的系统时钟,并说明是如何设置的?2、举例说明STM32的外设时钟是如何开启与关闭的。3、LED流水灯模拟实验,实验报告(包括每个语句的解释意义)。思考简答:在stm32f10 x_conf.h这个头文件中定义的函数声明还是宏定义,怎么在其它文件中应用呢?自学:GPIO_Init()函数的定义代码分析,见野火PDF资料P105-106.,旧版本BUG 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来解决的:,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号