第8章-STM32时钟与GPIO设计PPT课件

上传人:re****.1 文档编号:568525227 上传时间:2024-07-25 格式:PPT 页数:56 大小:1.50MB
返回 下载 相关 举报
第8章-STM32时钟与GPIO设计PPT课件_第1页
第1页 / 共56页
第8章-STM32时钟与GPIO设计PPT课件_第2页
第2页 / 共56页
第8章-STM32时钟与GPIO设计PPT课件_第3页
第3页 / 共56页
第8章-STM32时钟与GPIO设计PPT课件_第4页
第4页 / 共56页
第8章-STM32时钟与GPIO设计PPT课件_第5页
第5页 / 共56页
点击查看更多>>
资源描述

《第8章-STM32时钟与GPIO设计PPT课件》由会员分享,可在线阅读,更多相关《第8章-STM32时钟与GPIO设计PPT课件(56页珍藏版)》请在金锄头文库上搜索。

1、Embedded System Development嵌入式系统与应用嵌入式系统与应用 2021/7/221第第8章章 STM32时钟与时钟与GPIO设计设计F8.1时钟设置与开启外设时钟时钟设置与开启外设时钟 F8.2GPIO简介简介F8.3 GPIO端口配置寄存器端口配置寄存器F8.4stm32f10x.hstm32f10x.h库中库中GPIO代码剖析代码剖析F8.6GPIO控制控制LEDLED灯实验灯实验2021/7/2228.1 系统时钟配置与外设时钟开启F在在startup_stm32f10x_hd.sstartup_stm32f10x_hd.s启动文件中,调用启动文件中,调用_ma

2、in_main函数函数之前先调用了之前先调用了SystemInit()SystemInit()初始化函数,其中系统时钟初始化函数,其中系统时钟SYSCLKSYSCLK设置:时钟源、倍频、分频等控制参数。设置:时钟源、倍频、分频等控制参数。FSystemInitSystemInit()()定义在定义在system_stm32f10x.csystem_stm32f10x.c文件中,其他文件中,其他的配置主要在的配置主要在stm32f10x_rcc.cstm32f10x_rcc.c中。中。F使用外设时,配置初始化后,必须也要开启外设时钟。使用外设时,配置初始化后,必须也要开启外设时钟。2021/7/

3、2238.1.1 时钟设置解析F系统时钟系统时钟SYSCLKSYSCLK是是SystemInit()SystemInit()先将配置时钟相关的寄先将配置时钟相关的寄存器都复位为默认值,再调用存器都复位为默认值,再调用SetSysClock()SetSysClock()选择使用选择使用频率,而具体设置是通过宏定义设置的。频率,而具体设置是通过宏定义设置的。F函数调用顺序:函数调用顺序: 启动文件启动文件 SystemInit() SystemInit() SetSysClockSetSysClock() () SetSysClockTo72()SetSysClockTo72()。2021/7/2

4、241、SystemInit()FSTM32STM32时钟系统的时钟系统的SystemInit()SystemInit()中设置:中设置:SYSCLKSYSCLK(系统时钟)(系统时钟)=72MHz=72MHzAHBAHB总线时钟总线时钟( (使用使用SYSCLK)=72MHzSYSCLK)=72MHzAPB1APB1总线时钟总线时钟(PCLK1)=36MHz(PCLK1)=36MHzAPB2APB2总线时钟总线时钟(PCLK2)=72MHz(PCLK2)=72MHzPLLPLL时钟时钟=72MHz=72MHzF用到的用到的RCC寄存器复位值:寄存器复位值:RCC_CR=0x0000xx83;

5、RCC_CFGR=0x00000000;RCC_CIR=0x00000000;RCC_CFGR2=0x00000000;F这些这些RCCRCC时钟寄存器组名的宏定义与其他外设寄存器名时钟寄存器组名的宏定义与其他外设寄存器名定义都在定义都在stm32f10x.hstm32f10x.h文件中。文件中。2021/7/225RCC时钟寄存器组在stm32f10x.h中的定义typedefstruct_IOuint32_tCR;_IOuint32_tCFGR;_IOuint32_tCIR;_IOuint32_tAPB2RSTR;_IOuint32_tAPB1RSTR;_IOuint32_tAHBENR;

6、_IOuint32_tAPB2ENR;_IOuint32_tAPB1ENR;_IOuint32_tBDCR;_IOuint32_tCSR;#ifdefSTM32F10X_CL_IOuint32_tAHBRSTR;_IOuint32_tCFGR2;#endif/*STM32F10X_CL*/#ifdefined(STM32F10X_LD_VL)|defined(STM32F10X_MD_VL)|defined(STM32F10X_HD_VL)uint32_tRESERVED0;_IOuint32_tCFGR2;#endif/*STM32F10X_LD_VL|STM32F10X_MD_VL|STM

7、32F10X_HD_VL*/RCC_TypeDef;F_IO _IO 宏定义宏定义core_cm3.hcore_cm3.h中:中:#define#define_IO_IOvolatilevolatile;volatile,volatile,易变的易变的, ,用变量时需到用变量时需到原地址重新存取。原地址重新存取。 F uint32_tuint32_t定义定义在在stdin.hstdin.h里。里。 typedeftypedef unsigned unsigned intint uint32_tuint32_t; ;F知道了结构体知道了结构体首首地址就地址就确定确定RCCRCC寄存器组寄存器组所

8、有所有3232位寄存器位寄存器的的地址地址,0x040x04正好是地址偏移量,所以把正好是地址偏移量,所以把连续的寄存器组定义为连续的寄存器组定义为结构。结构。2021/7/2262、SetSysClock()函数如下此函数中选择调用确定使用频率的函数。此函数中选择调用确定使用频率的函数。FstaticvoidSetSysClock(void)#ifdefSYSCLK_FREQ_HSESetSysClockToHSE();#elifdefinedSYSCLK_FREQ_24MHzSetSysClockTo24();#elifdefinedSYSCLK_FREQ_36MHzSetSysClock

9、To36();#elifdefinedSYSCLK_FREQ_48MHzSetSysClockTo48();#elifdefinedSYSCLK_FREQ_56MHzSetSysClockTo56();#elifdefinedSYSCLK_FREQ_72MHz/使用此项使用此项SetSysClockTo72();#endif2021/7/2273、SetSysClockTo72()函数函数F各个各个SetSysClockToSetSysClockToXXXX(void)(void)函数,配置了具体的系统时钟函数,配置了具体的系统时钟,PLL,PLL倍频以及分频系数。采用寄存器直接配置方式,如:

10、倍频以及分频系数。采用寄存器直接配置方式,如:static void static void SetSysClockTo72(void)SetSysClockTo72(void) _IO uint32_t StartUpCounter = 0, HSEStatus = 0; _IO uint32_t StartUpCounter = 0, HSEStatus = 0; /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration */ /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration */ /* Enable HSE

11、*/ /* Enable HSE */ RCC-CR |= (uint32_t)RCC_CR_HSEON); RCC-CR |= (uint32_t)RCC_CR_HSEON); do do HSEStatus = RCC-CR & RCC_CR_HSERDY; HSEStatus = RCC-CR & RCC_CR_HSERDY; StartUpCounter+; StartUpCounter+; while(HSEStatus = 0) & (StartUpCounter != while(HSEStatus = 0) & (StartUpCounter != HSE_STARTUP_TI

12、MEOUT);HSE_STARTUP_TIMEOUT); F欲深入分析时钟配置,就仔细阅读这些最底层的库函数!欲深入分析时钟配置,就仔细阅读这些最底层的库函数!2021/7/2288.1.2 开启关闭外设时钟F外设都是挂在外设都是挂在AHBAHB、APB1APB1、APB2APB2总线上,要想使用某个外总线上,要想使用某个外设,必须初始化外设后,再开启使用开启外设的时钟,设,必须初始化外设后,再开启使用开启外设的时钟,不用时再关闭外设时钟不用时再关闭外设时钟, ,从而降低从而降低STM32STM32的整体功耗。的整体功耗。Fstm32f10x_rcc.cstm32f10x_rcc.c文件中有开

13、启和关闭外设时钟的库函数,文件中有开启和关闭外设时钟的库函数,如下:如下:FRCC_AHBPeriphClockCmdRCC_AHBPeriphClockCmd(外设名,外设名,ENABLE|DISABLEDISABLE) )挂在挂在AHBAHB总线外设的开启与关闭函数,总线外设的开启与关闭函数,ENABLEENABLE开启,开启,DISABLEDISABLE关闭外设时钟;关闭外设时钟;FRCC_APB1PeriphClockCmdRCC_APB1PeriphClockCmd( (外设名,外设名,ENABLE|DISABLEDISABLE) )挂在挂在APB1APB1总线外设的开启与关闭函数;

14、总线外设的开启与关闭函数;FRCC_APB2PeriphClockCmdRCC_APB2PeriphClockCmd( (外设名,外设名,ENABLE|DISABLEDISABLE) )挂在挂在APB2APB2总线外设的开启与关闭函数;总线外设的开启与关闭函数;2021/7/229挂载在AHB的外设名Fstm32f10x_rcc.hstm32f10x_rcc.h中对外设名进行了宏定义中对外设名进行了宏定义, ,看名即知设看名即知设备。备。F#defineRCC_AHBPeriph_DMA1(uint32_t)0x00000001)F#defineRCC_AHBPeriph_DMA2(uint3

15、2_t)0x00000002)F#defineRCC_AHBPeriph_SRAM(uint32_t)0x00000004)F#defineRCC_AHBPeriph_FLITF(uint32_t)0x00000010)F#defineRCC_AHBPeriph_CRC(uint32_t)0x00000040)F#defineRCC_AHBPeriph_FSMC(uint32_t)0x00000100)F#defineRCC_AHBPeriph_SDIO(uint32_t)0x00000400)F#defineRCC_AHBPeriph_OTG_FS(uint32_t)0x00001000)F

16、#defineRCC_AHBPeriph_ETH_MAC(uint32_t)0x00004000)F#defineRCC_AHBPeriph_ETH_MAC_Tx(uint32_t)0x00008000)F#defineRCC_AHBPeriph_ETH_MAC_Rx(uint32_t)0x00010000)2021/7/2210挂载在APB2上的外设名F#defineRCC_APB2Periph_AFIO(uint32_t)0x00000001)F#defineRCC_APB2Periph_GPIOA(uint32_t)0x00000004)F#defineRCC_APB2Periph_GP

17、IOB(uint32_t)0x00000008)FF#defineRCC_APB2Periph_GPIOG(uint32_t)0x00000100)F#defineRCC_APB2Periph_ADC1(uint32_t)0x00000200)F#defineRCC_APB2Periph_ADC2(uint32_t)0x00000400)F#defineRCC_APB2Periph_TIM1(uint32_t)0x00000800)F#defineRCC_APB2Periph_SPI1(uint32_t)0x00001000)F#defineRCC_APB2Periph_TIM8(uint32

18、_t)0x00002000)F#defineRCC_APB2Periph_USART1(uint32_t)0x00004000)F#defineRCC_APB2Periph_ADC3(uint32_t)0x00008000)F#defineRCC_APB2Periph_TIM15(uint32_t)0x00010000)F#defineRCC_APB2Periph_TIM16(uint32_t)0x00020000)F#defineRCC_APB2Periph_TIM17(uint32_t)0x00040000)F#defineRCC_APB2Periph_TIM9(uint32_t)0x00

19、080000)F#defineRCC_APB2Periph_TIM10(uint32_t)0x00100000)F#defineRCC_APB2Periph_TIM11(uint32_t)0x00200000)2021/7/2211挂载在APB1上的外设名F#defineRCC_APB1Periph_TIM2(uint32_t)0x00000001)F#defineRCC_APB1Periph_TIM3(uint32_t)0x00000002)FF#defineRCC_APB1Periph_TIM14(uint32_t)0x00000100)F#defineRCC_APB1Periph_WWD

20、G(uint32_t)0x00000800)F#defineRCC_APB1Periph_SPI2(uint32_t)0x00004000)F#defineRCC_APB1Periph_SPI3(uint32_t)0x00008000)F#defineRCC_APB1Periph_USART2(uint32_t)0x00020000)F#defineRCC_APB1Periph_USART3(uint32_t)0x00040000)F#defineRCC_APB1Periph_UART4(uint32_t)0x00080000)F#defineRCC_APB1Periph_UART5(uint

21、32_t)0x00100000)F#defineRCC_APB1Periph_I2C1(uint32_t)0x00200000)F#defineRCC_APB1Periph_I2C2(uint32_t)0x00400000)F#defineRCC_APB1Periph_USB(uint32_t)0x00800000)F#defineRCC_APB1Periph_CAN1(uint32_t)0x02000000)F#defineRCC_APB1Periph_CAN2(uint32_t)0x04000000)F#defineRCC_APB1Periph_BKP(uint32_t)0x0800000

22、0)F#defineRCC_APB1Periph_PWR(uint32_t)0x10000000)F#defineRCC_APB1Periph_DAC(uint32_t)0x20000000)F#defineRCC_APB1Periph_CEC(uint32_t)0x40000000)2021/7/2212开启外设时钟举例: FGPIOGPIO的的C C口挂在口挂在APB2APB2总线,所用的时钟总线,所用的时钟PCLK2PCLK2为为72MHz72MHz。开启。开启GPIOCGPIOC外设时钟:外设时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,

23、ENABLE)F如用到如用到I/OI/O引脚复用功能,还要开启其复用功能时钟。如引脚复用功能,还要开启其复用功能时钟。如GPIOCGPIOC的的Pin4Pin4还可作为还可作为ADC1ADC1的输入引脚,把它作为的输入引脚,把它作为ADC1ADC1来用,来用,除开启除开启GPIOCGPIOC时钟,还要开启时钟,还要开启ADC1ADC1时钟:时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE)RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE) F开启关闭开启关闭外设时钟外设时钟的三个函数,内

24、部对的三个函数,内部对外设时钟外设时钟的使能寄存的使能寄存器操作,达到开启和关闭的目的。器操作,达到开启和关闭的目的。2021/7/22138.2 GPIO简介FGPIO(GeneralPurposeI/O)通用型输入)通用型输入/输出,主输出,主要用于需要用到要用于需要用到数字量输入数字量输入/输出输出的场合。的场合。F如:如:继电器、继电器、LED、蜂鸣器等的控制;、蜂鸣器等的控制;传感器状态、高低电平等信息的输入等。传感器状态、高低电平等信息的输入等。F管脚可承受最大管脚可承受最大5V5V的输入电压,电流为的输入电压,电流为4mA4mA,短时间极,短时间极限值限值40mA40mA;F。2

25、021/7/2214GPIO简介FGPIOGPIO引脚又被分为引脚又被分为GPIOAGPIOA、GPIOBGPIOGGPIOBGPIOG不同的组,每不同的组,每组端口分为组端口分为015015,共,共1616个引脚,不同芯片的端口组数不个引脚,不同芯片的端口组数不同。同。GPIOGPIO结构图:结构图:端口配置寄存器2021/7/2215GPIO简介FI/OI/O引脚可通过引脚可通过端口配置寄存器端口配置寄存器设置成不同的功能。设置成不同的功能。F四种输入模式(图上半部分):四种输入模式(图上半部分):F上拉输入与下拉输入:与上拉输入与下拉输入:与VDDVDD相连的为上拉电阻,与相连的为上拉电

26、阻,与VSSVSS相相连的为下拉电阻。再经施密特触发器就把信号转化为连的为下拉电阻。再经施密特触发器就把信号转化为0 0、1 1存储在输入数据寄存器。存储在输入数据寄存器。F浮空输入:不接上拉与下拉电阻,直接由触发器输入,由浮空输入:不接上拉与下拉电阻,直接由触发器输入,由于其输入阻抗较大,一般把这种模式用于标准的通讯协议于其输入阻抗较大,一般把这种模式用于标准的通讯协议如如I I2 2C C、USARTUSART的接收端。的接收端。F模拟输入:把电压信号直接传送到片上外设模块,如模拟输入:把电压信号直接传送到片上外设模块,如ADCADC2021/7/2216GPIO简介F推挽输出模式:输出推

27、挽输出模式:输出1 1时时P-MOSP-MOS导通输出高电平导通输出高电平1 1,0 0时时N-N-MOSMOS管导通输出低电平管导通输出低电平0 0。F开漏输出模式:开漏输出模式:只有只有N-MOSN-MOS管管,外部需接上拉电阻,输,外部需接上拉电阻,输出出0 0时导通,为低电平时导通,为低电平0 0;输出;输出1 1时截止,为高阻状态。时截止,为高阻状态。F复用功能的推挽式输出模式。复用功能的推挽式输出模式。F复用功能的开漏输出模式。复用功能的开漏输出模式。一只三极管放大信号正半周,另一只放大负半周,故称推挽放大器四种输出模式输出模式( (图下半部分图下半部分) ):2021/7/221

28、7GPIO简介 STM32P0.xP2.xFGPIO都可配置为中断功能,并可设置为上升沿、下降沿都可配置为中断功能,并可设置为上升沿、下降沿或边沿触发。或边沿触发。上升沿中断下降沿中断 边沿中断 GPIO中断还具有掉电唤醒功能2021/7/22188.3 GPIO端口配置寄存器F1 1、端口配置低寄存器、端口配置低寄存器GPIOx_CRL( (配置配置0707引脚引脚) )x=AGx=AG,芯片的,芯片的GPIOGPIO端口端口。FPIOx_CRL地址偏移量:地址偏移量:0x00h0x00h,复位值:,复位值:0x4444 44440x4444 4444F第第y y个引脚的模式由寄存器的个引脚

29、的模式由寄存器的4 4个位控制,个位控制,MODEyMODEy1:01:0引脚引脚模式位,模式位,CNFyCNFy1:01:0引脚配置位。引脚配置位。可配置为可配置为4 4种输入、种输入、4 4种种输出模式。输出模式。2021/7/2219GPIO端口配置寄存器FCNFy1:0CNFy1:0:端口:端口y y配置位配置位F输入模式输入模式(MODE1:0=00)(MODE1:0=00):0000:模拟输入:模拟输入0101:浮空输入:浮空输入( (复位默认值复位默认值) )1010:上拉:上拉/ /下拉输入下拉输入1111:保留:保留F输出模式输出模式(MODE1:000)(MODE1:000

30、):0000:通用推挽输出:通用推挽输出0101:通用开漏输出:通用开漏输出1010:复用功能推挽输出:复用功能推挽输出1111:复用功能开漏输出:复用功能开漏输出FMODEyMODEy1:01:0 :端口端口y y模式位模式位F输入模式输入模式0000:复位默认值:复位默认值F输出模式输出模式0101:最大:最大速度速度10MHz10MHz1010:最大:最大速度速度2MHz2MHz1111:最大:最大速度速度50MHz50MHzPIOx_CRL复位值4444 4444h,即CNFy1:001、MODEy1:000,复位后端口配置为什么口?2021/7/22202、端口配置高寄存器GPIOx

31、_CRHFGPIOGPIOx x_CR_CRH H( (配置配置815815引脚引脚) ) 与端口配置低寄存器类似。与端口配置低寄存器类似。F地址偏移量:地址偏移量:0x04h0x04h,复位值:,复位值:0x4444 44440x4444 4444F例例1 1:GPIOx_CRHGPIOx_CRH寄存器的第寄存器的第2828至至2929位设置为位设置为1111,并在第,并在第3030至至3131位设置为位设置为0000:F 答:则把答:则把x x端口第端口第1515个引脚的模式配置成了:输出的个引脚的模式配置成了:输出的最大速度为最大速度为50MHz50MHz的的 通用推挽输出模式。通用推挽

32、输出模式。F例例2:上题反过来。:上题反过来。2021/7/22213、端口输入数据寄存器GPIOx_IDRF端口输入数据寄存器端口输入数据寄存器(GPIOx_IDR) (x=A.G)(GPIOx_IDR) (x=A.G),读该寄存器,读该寄存器可看某个可看某个IOIO口的输入状态。口的输入状态。F地址偏移量:地址偏移量:0x08h0x08h,复位值:,复位值:0x0000 XXXX0x0000 XXXXF高位高位31:1631:16保留,始终读为保留,始终读为0 0。FIDRy15:0IDRy15:0 (y = 015)(y = 015)每个位对应每个位对应I/OI/O口的输入状态。口的输入

33、状态。FGPIOx_IDRGPIOx_IDR为只读并只能以字的形式读出。为只读并只能以字的形式读出。2021/7/22224、端口输出数据寄存器GPIOx_ODRFGPIOx_ODR(x=A.E)GPIOx_ODR(x=A.E)位。写该寄存器可控制某个位。写该寄存器可控制某个IOIO口的口的输出电平,读该寄存器可以判断输出电平,读该寄存器可以判断IOIO口的输出状态。口的输出状态。F地址偏移量:地址偏移量:0x0Ch0x0Ch,复位值:,复位值:0x0000 00000x0000 0000F高位高位31:1631:16保留,始终为保留,始终为0 0。FODRy15:0ODRy15:0:端口输出

34、数据:端口输出数据(y = 015)(y = 015)F这些位可读可写并只能以字的形式操作。这些位可读可写并只能以字的形式操作。F通过通过GPIOx_BSRR(x = AG)GPIOx_BSRR(x = AG),可以分别地对各个,可以分别地对各个ODRODR位位进行独立的置位进行独立的置位/ /清零。清零。2021/7/22235、端口位置位/清零寄存器GPIOx_BSRRFGPIOx_BSRR(x=A.G)GPIOx_BSRR(x=A.G),对,对GPIOxGPIOx的端口置位的端口置位/ /清零。清零。F地址偏移量:地址偏移量:0x100x10,复位值:,复位值:0x0000 00000x

35、0000 0000F位位31:1631:16为为BRy(y = 015)BRy(y = 015),清零,只能以字写入:,清零,只能以字写入:0 0:对应的:对应的ODRxODRx位不产生影响;位不产生影响;1 1:对应的:对应的ODRxODRx位清零;位清零;F位位15:015:0为为BSy(y = 015)BSy(y = 015),置位,只能以字写入:,置位,只能以字写入:0 0:对对应的:对对应的ODRxODRx位不产生影响;位不产生影响;1 1:对应的:对应的ODRxODRx位置位;位置位;F注:如果同时设置注:如果同时设置BSyBSy和和BRyBRy的对应位,的对应位,BSxBSx位起

36、作用。位起作用。2021/7/22246、端口位清零寄存器(GPIOx_BRR)FGPIOx_BRR(x=A.G)GPIOx_BRR(x=A.G)对对GPIOxGPIOx的端口清零。的端口清零。F注意:相当于注意:相当于GPIOx_BSRRGPIOx_BSRR寄存器的清零功能。寄存器的清零功能。F地址偏移量:地址偏移量:0x140x14,复位值:,复位值:0x0000 00000x0000 0000FBits 31:16 ReservedBits 31:16 ReservedF位位15:015:0为为BRy(y = 015): BRy(y = 015): 只能以字写入:只能以字写入:0 0:对

37、应的:对应的ODRxODRx位不产生影响;位不产生影响;1 1:对应的:对应的ODRxODRx位清零;位清零;2021/7/22257、端口配置锁定寄存器GPIOx_LCKRF端口配置锁定寄存器端口配置锁定寄存器(GPIOx_LCKR) (x=A.G)(GPIOx_LCKR) (x=A.G)F地址偏移量:地址偏移量:0x180x18,复位值:,复位值:0x0000 00000x0000 0000F位位16(LCKK)16(LCKK):当执行正确的写序入列(写:当执行正确的写序入列(写1-1-写写0-0-写写1-1-写写0-0-写写1 1),),置置1 1下次系统复位下次系统复位前该寄存器前该寄

38、存器被锁住。被锁住。F位位15:015:0:在在LCKKLCKK位为位为0 0时:时:LCKyLCKy写写1 1锁定对应端口锁定对应端口y y脚配置寄存器脚配置寄存器(CRL(CRL或或CRH)CRH)中中相应的相应的4 4个位;个位;LCKyLCKy写写0 0不锁;不锁;2021/7/2226例:F要控制引脚电平高低,需要对寄存器进行什么操作?要控制引脚电平高低,需要对寄存器进行什么操作?F一个引脚一个引脚y y的输出数据由的输出数据由GPIOx_BSRRGPIOx_BSRR寄存器位的寄存器位的2 2个位来个位来控制分别为控制分别为BRy (Bit Reset y)BRy (Bit Rese

39、t y)和和BSy (Bit Set y)BSy (Bit Set y),BRyBRy位用于写位用于写1 1清零,使引脚输出低电平;清零,使引脚输出低电平;BSyBSy位用来写位用来写1 1置置1 1,使引脚输出高电平。,使引脚输出高电平。2021/7/22278.4 stm32f10x.hstm32f10x.h库中库中GPIO代码剖析代码剖析F以外设以外设GPIOCGPIOC为例,文件中包含如下宏定义:为例,文件中包含如下宏定义: #define PERIPH_BASE (uint32_t)0x40000000) #define PERIPH_BASE (uint32_t)0x4000000

40、0) #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) #define GPIO#define GPIOC C_BASE (APB2PERIPH_BASE + 0x1000) _BASE (APB2PERIPH_BASE + 0x1000) F先看外设基地址宏先看外设基地址宏PERIPH_BASEPERIPH_BASE,宏展开为,宏展开为uint32_tuint32_t类类型型 0x4000 00000x4000 0000;F总线基地址宏总线基地址宏AP

41、B2PERIPH_BASEAPB2PERIPH_BASE指向地址指向地址0x4001 00000x4001 0000;F最后到了宏最后到了宏GPIOGPIOC C_BASE_BASE为为APB2PERIPH_BASEAPB2PERIPH_BASE加上地址偏加上地址偏移量移量0x10000x1000得到了得到了GPIOGPIOC C端口的寄存器组的基地址为端口的寄存器组的基地址为0x4001 1000 0x4001 1000 。2021/7/2228stm32f10x.h中GPIO代码剖析Fstm32f10x.hstm32f10x.h文件,还可以发现以下类似的宏:文件,还可以发现以下类似的宏:F

42、 #define GPIO #define GPIOA A_BASE (APB2PERIPH_BASE + 0x_BASE (APB2PERIPH_BASE + 0x08000800) ) F #define GPIO #define GPIOB B_BASE (APB2PERIPH_BASE + 0x_BASE (APB2PERIPH_BASE + 0x0C000C00) ) F #define GPIO #define GPIOC C_BASE (APB2PERIPH_BASE + 0x_BASE (APB2PERIPH_BASE + 0x10001000) ) F #define GPI

43、O #define GPIOD D_BASE (APB2PERIPH_BASE + 0x_BASE (APB2PERIPH_BASE + 0x14001400) )FGPIOAGPIOA、GPIOBGPIOB、GPIOCGPIOC、GPIODGPIOD寄存器组的起始地址,都寄存器组的起始地址,都对应着独立的一组寄存器。对应着独立的一组寄存器。2021/7/2229typedefstruct_IOuint32_tCRL;_IOuint32_tCRH;_IOuint32_tIDR;_IOuint32_tODR;_IOuint32_tBSRR;_IOuint32_tBRR;_IOuint32_tLC

44、KR;GPIO_TypeDef;#defineGPIOA(GPIO_TypeDef*)GPIOA_BASE)#defineGPIOB(GPIO_TypeDef*)GPIOB_BASE)(GPIO_TypeDef*)把GPIOA_BASE地址转换为GPIO_TypeDef结构体指针类型。对每个对每个GPIOxGPIOx是用是用结构结构封装了寄存器组封装了寄存器组,stm32f10x.h,stm32f10x.h中代码:中代码:结构体首地址即CRL地址若为0x4001 1000,那么第二个变量CRH为0x4001 1000 +0x04 , 0x04正好是寄存器组中的地址偏移量。所以把连续的寄存器组定

45、义为结构。 2021/7/2230stm32f10x.h中GPIO代码剖析F有了这样的宏,就可用以下方式来修改有了这样的宏,就可用以下方式来修改GPIOGPIO寄存器:寄存器:FGPIO_TypeDef * GPIOx; GPIO_TypeDef * GPIOx; / / * *定义定义GPIOxGPIOx指针变量为指针变量为GPIO_TypeDefGPIO_TypeDef结构体型结构体型FGPIOx = GPIOA;GPIOx = GPIOA; /把指针地址设置为宏把指针地址设置为宏GPIOAGPIOA地址地址 FGPIOx-CRL = 0xFFFF FFFF; GPIOx-CRL = 0x

46、FFFF FFFF; /“-”通过指针访问并修改通过指针访问并修改GPIOA_CRLGPIOA_CRL寄存器寄存器 F通过类似的方式,我们就可以给具体的寄存器写上适当通过类似的方式,我们就可以给具体的寄存器写上适当的参数,控制的参数,控制STM32STM32了。了。F这只是库开发的皮毛,库提供了更简单的开发方式。这只是库开发的皮毛,库提供了更简单的开发方式。2021/7/2231使用GPIOF1. 1. 配置寄存器:选定配置寄存器:选定GPIOGPIO的特定功能,最基本的如:的特定功能,最基本的如:选择作为输入还是输出端口。选择作为输入还是输出端口。 F2. 2. 数据寄存器:保存了数据寄存器

47、:保存了GPIOGPIO的输入电平的输入电平 或或 将要输出将要输出的电平。的电平。 F3. 3. 位控制寄存器:设置某引脚的数据位控制寄存器:设置某引脚的数据 为为1 1或或0 0,控制输,控制输出的电平。出的电平。 F4. 4. 锁定寄存器:设置某锁定引脚后,就不能修改其配锁定寄存器:设置某锁定引脚后,就不能修改其配置。置。 2021/7/2232关于关于GPIO库函数2021/7/22337.6 LED流水灯实验F实验学习方法,先学习例程编写方法,掌握后,在实验实验学习方法,先学习例程编写方法,掌握后,在实验过程中改写程序、逐渐编写程序!过程中改写程序、逐渐编写程序!F想要控制想要控制L

48、EDLED灯,当然是通过控制灯,当然是通过控制STM32STM32芯片的芯片的I/OI/O引脚引脚电平的高低来实现。电平的高低来实现。2021/7/2234LED流水灯实验2021/7/2235LED流水灯实验FLEDLED实验中用到了实验中用到了RCCRCC跟跟GPIOGPIO这这两个外设。环境配置如图:两个外设。环境配置如图:F用到的源程序:用到的源程序:main.cmain.cled.cled.cled.hled.h2021/7/2236Led流水灯主程序:main.c#includeled.hvoidDelay(_IOuint32_tnCount)/简单延时函数简单延时函数for(;n

49、Count!=0;nCount-);intmain(void)LED_GPIO_Config();/函数在函数在led.c中定义中定义while(1)LED1(ON);/函数在头文件函数在头文件led.h中定义中定义Delay(0x0FFFFF);LED1(OFF);LED2(ON);Delay(0x0FFFFF);LED2(OFF);LED3(ON);Delay(0x0FFFFF);LED3(OFF); 2021/7/2237led.c-初始化函数 LED_GPIO_Config()#includeled.h#includestm32f10x_gpio.h#includestm32f10x_

50、rcc.hvoidLED_GPIO_Config(void)/*用库定义一个定义一个GPIO_InitTypeDef类型的结构体类型的结构体* */GPIO_InitTypeDefGPIO_InitStructure;/*开启开启GPIOC的外设时钟的外设时钟* */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);/*选择要控制的选择要控制的GPIOC引脚引脚GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;/*设置引脚模式为通用推挽输出设置引脚模式为通用推挽输出*

51、*/GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;2021/7/2238led.c/设置引脚速率为设置引脚速率为50MHz 50MHz GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHzGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;/端口初始化库函数,利用上面设置的参数初始化端口初始化库函数,利用上面设置的参数初始化GPIOCGPIOCGPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_Init(GPIOC, &GP

52、IO_InitStructure); /引脚置位库函数,关闭引脚置位库函数,关闭ledled灯灯GPIO_SetBits(GPIOC, GPIO_Pin_3| GPIO_Pin_4| GPIO_Pin_5);GPIO_SetBits(GPIOC, GPIO_Pin_3| GPIO_Pin_4| GPIO_Pin_5); F函数函数LED_GPIO_Config()LED_GPIO_Config()实现了所有为点亮实现了所有为点亮ledled的配置的配置2021/7/2239led.h头文件#ifndef_LED_H/条件编译条件编译, 防止头文件重复包含防止头文件重复包含#define_LED

53、_H/独立写头文件,方便以后扩展使用独立写头文件,方便以后扩展使用#includestm32f10x.h/*themacrodefinitiontotriggertheledonoroff*0-on*1-off*/#defineON0#defineOFF1/*带参宏,可像内联函数一样使用带参宏,可像内联函数一样使用*/#defineLED1(a)if(a)GPIO_SetBits(GPIOC,GPIO_Pin_3);elseGPIO_ResetBits(GPIOC,GPIO_Pin_3)2021/7/2240led.h续#defineLED2(a)if(a)GPIO_SetBits(GPIOC

54、,GPIO_Pin_4);elseGPIO_ResetBits(GPIOC,GPIO_Pin_4)#defineLED3(a)if(a)GPIO_SetBits(GPIOC,GPIO_Pin_5);elseGPIO_ResetBits(GPIOC,GPIO_Pin_5)voidLED_GPIO_Config(void);#endif/*/条件编译结束条件编译结束 _LED_H*/F在编译过程,编译器会把带参宏展开,在相应的位置替换为在编译过程,编译器会把带参宏展开,在相应的位置替换为宏展开代码。宏展开代码。F其中的反斜杠符号其中的反斜杠符号“ “ ”叫做续行符,后面不能有空格、注叫做续行符,后

55、面不能有空格、注释等释等2021/7/2241ledled用到用到stm32f10x_gpio.hstm32f10x_gpio.h库的结构、宏定义库的结构、宏定义F1、GPIO_InitTypeDef结构,引脚初始化的结构结构,引脚初始化的结构F2 2、GPIO_Pin_x GPIO_Pin_x 引脚为引脚为uint16_tuint16_t类型,宏定义:类型,宏定义: #define GPIO_Pin_0 (uint16_t)0x0001) /*!Pin 0 selected */ #define GPIO_Pin_0 (uint16_t)0x0001) /*!Pin 0 selected *

56、/ #define GPIO_Pin_1 (uint16_t)0x0002) /*!Pin 1 selected */ #define GPIO_Pin_1 (uint16_t)0x0002) /*!Pin 1 selected */ #define GPIO_Pin_2 (uint16_t)0x0004) /*!Pin 2 selected */ #define GPIO_Pin_2 (uint16_t)0x0004) /*!Pin 2 selected */ #define GPIO_Pin_3 (uint16_t)0x0008) /*!Pin 3 selected */ #define

57、GPIO_Pin_3 (uint16_t)0x0008) /*!Pin 3 selected */ FGPIO_Pin_xGPIO_Pin_x,x x位为位为1,1,其余位为其余位为0 0,在第,在第x x位置位置1 1表示表示pin xpin xF例:例:GPIO_Pin_1(0000000000000010)B2021/7/2242ledled用到用到stm32f10x_gpio.hstm32f10x_gpio.h库的结构、宏定义库的结构、宏定义F3 3、GPIOSpeed_TypeDefGPIOSpeed_TypeDef定义定义GPIOGPIO的输出速率:的输出速率: typedef e

58、num typedef enum GPIO_Speed_10MHz = 1,/ GPIO_Speed_10MHz = 1,/枚举常量值枚举常量值1 1,对应,对应10MHz 10MHz GPIO_Speed_2MHz, / GPIO_Speed_2MHz, /常量值为常量值为2 2,对应,对应2MHz 2MHz GPIO_Speed_50MHz / GPIO_Speed_50MHz /常量值为常量值为3 3,对应,对应50MHz50MHz GPIOSpeed_TypeDef; GPIOSpeed_TypeDef; F所以:所以: GPIO_Speed_10MHz GPIO_Speed_10MH

59、z 对应对应(0001)B (0001)B u GPIO_Speed_2MHz GPIO_Speed_2MHz 对应对应(0010)B (0010)B u GPIO_Speed_50MHz GPIO_Speed_50MHz 对应对应(0011)B(0011)BFSpeedSpeed控制参数,它的宏展开低控制参数,它的宏展开低2 2位的值,正好符合位的值,正好符合寄存器寄存器MODEyMODEy中中2 2位的控制值位的控制值。F直接直接把这个参数写入把这个参数写入CRLCRL、CRHCRH配置寄存器的配置寄存器的MODEyMODEy位,其位,其中中y y由由GPIO_PinGPIO_Pin参数参

60、数确定第几引脚。确定第几引脚。 2021/7/2243ledled用到用到stm32f10x_gpio.hstm32f10x_gpio.h库的结构、宏定义库的结构、宏定义4 4、GPIOMode_TypeDefGPIOMode_TypeDef结构定义结构定义GPIOGPIO引脚的功能:引脚的功能: typedef enum typedef enum GPIO_Mode_AIN = 0x0, / GPIO_Mode_AIN = 0x0, /模拟输入模式模拟输入模式 GPIO_Mode_IN_FLOATING = 0x04, / GPIO_Mode_IN_FLOATING = 0x04, /浮空输

61、入模式浮空输入模式 GPIO_Mode_IPD = 0x28, / GPIO_Mode_IPD = 0x28, /下拉输入模式下拉输入模式 GPIO_Mode_IPU = 0x48, / GPIO_Mode_IPU = 0x48, /上拉输入模式上拉输入模式 GPIO_Mode_Out_OD = 0x14, / GPIO_Mode_Out_OD = 0x14, /开漏输出模式开漏输出模式 GPIO_Mode_Out_PP = 0x10, / GPIO_Mode_Out_PP = 0x10, /通用推挽输出模式通用推挽输出模式 GPIO_Mode_AF_OD = 0x1C, / GPIO_Mod

62、e_AF_OD = 0x1C, /复用功能开漏输出复用功能开漏输出 GPIO_Mode_AF_PP = 0x18 / GPIO_Mode_AF_PP = 0x18 /复用功能推挽输出复用功能推挽输出 GPIOMode_TypeDef; GPIOMode_TypeDef; 2021/7/2244ledled用到用到stm32f10x_gpio.hstm32f10x_gpio.h库的结构、宏定义库的结构、宏定义F四种输出模式参数中的四种输出模式参数中的bit4 bit4 均为均为1 1,而四种输入模式中,而四种输入模式中的的bit4bit4均为均为0 0。所以在代码中通过与。所以在代码中通过与0x

63、100x10作位与运算,作位与运算,即可区分输入和输出模式。即可区分输入和输出模式。F而而bit2bit2和和bit3bit3的参数值正好对应为的参数值正好对应为CRLCRL、CRHCRH寄存器中的寄存器中的CNFyCNFy的的2 2个控制位。确定是什么模式。个控制位。确定是什么模式。F经过与经过与SpeedSpeed参数参数MODEyMODEy组合后,配置一个引脚的组合后,配置一个引脚的4 4位参位参数就确定了。数就确定了。2021/7/2245用于初始化的库函数用于初始化的库函数GPIO_Init()F通过查找库帮助文档获得通过查找库帮助文档获得2021/7/2246DMK软件BUG: e

64、rror 65F创建一个创建一个STM32F103VESTM32F103VE核的项目核的项目Ferror 65: access violation at 0x40021000 : no error 65: access violation at 0x40021000 : no read permissionread permissionF是是DebugDebug里面的设置里面的设置有缺陷,不会自动匹配:有缺陷,不会自动匹配:Dialog DLLDialog DLL:DCM3.DLLDCM3.DLL Parameter Parameter:- -pCM3pCM3F应应手动手动改为改为:Dialo

65、g DLLDialog DLL:DARMSTM.DLLDARMSTM.DLL Parameter Parameter:-pSTM32F103VE-pSTM32F103VE2021/7/2247逻辑分析窗口使用F再点击再点击Setup,输入,输入LED灯对灯对应的三个信号应的三个信号PORTB.0、PORTF.7、PORTF.8;FDisplayType选择选择bit,然后,然后单击单击Close关闭该对话框;关闭该对话框;2021/7/2248逻辑分析窗口使用F点击点击运行运行按钮。运行一段时间之后,点击按钮。运行一段时间之后,点击停止停止按钮,暂按钮,暂停仿真回到逻辑分析窗口,停仿真回到逻辑

66、分析窗口,F可通过可通过ZoomZoom里面的里面的InIn按钮来放大波形,通过按钮来放大波形,通过OutOut按钮来缩按钮来缩小波形,或者按小波形,或者按AllAll显示全部波形。显示全部波形。2021/7/22498.7 再论库开发方式 LEDLED实验中寄存器配置经历了一下四步:实验中寄存器配置经历了一下四步:F1 1、led.cled.c代码对代码对 GPIO_InitStructure.GPIO_Pin GPIO_InitStructure.GPIO_Pin 结构结构体成员赋值为体成员赋值为GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_3 | GPIO_Pin

67、_4 | GPIO_Pin_5,GPIO_Pin_5,宏展开为(宏展开为(0000 0000 0011 10000000 0000 0011 1000)B B,表,表明对这三个引脚进行配置。明对这三个引脚进行配置。 F2 2、对、对.GPIO_Mode .GPIO_Mode 赋值为赋值为GPIO_Mode_Out_PPGPIO_Mode_Out_PP,宏展开为,宏展开为(0001 01000001 0100)B B,表明把这三个引脚都设置为通用推挽,表明把这三个引脚都设置为通用推挽模式。模式。 F3 3、对、对.GPIO_Speed.GPIO_Speed赋值为赋值为GPIO_Speed_50M

68、HzGPIO_Speed_50MHz,宏展开为,宏展开为(00110011)B B,表明设置这三个引脚的输出最大速度为,表明设置这三个引脚的输出最大速度为50MHz50MHz。F调用调用GPIO_Init(),GPIO_Init(),把以上参数写到配置寄存器。把以上参数写到配置寄存器。2021/7/2250再论库开发方式 附附录录:几几个个规规范范的的位位操操作作方方法法F将将c ch ha ar r型型变变量量a a的的第第七七位位( (b bi it t6 6) )清清0 0,其其它它位位不不变变。 a a & &= = ( (1 1 6 6) ); ; / / /括括号号内内1 1左左移

69、移6 6位位,得得二二进进制制数数:0 01 10 00 0 0 00 00 00 0 / / /按按位位取取反反得得1 10 01 11 1 1 11 11 11 1 ,与与a a作作”位位与与& &”运运算算, / / / a a的的第第7 7位位(b bi it t6 6)被被置置零零,而而其其它它位位不不变变。 F同同理理,将将变变量量a a的的第第七七位位( (b bi it t6 6) )置置1 1,a a | |= = ( (1 1 6 6) ); ; F同同理理,将将变变量量a a的的第第七七位位( (b bi it t6 6) )取取反反a a = =( (1 1 CRL =

70、 0x44333444; GPIOC-CRL = 0x44333444; 执行效率最高,确定这样的一个值,却是一件麻烦事。执行效率最高,确定这样的一个值,却是一件麻烦事。F配置寄存器还可以用三种位操作方式:配置寄存器还可以用三种位操作方式:1. GPIOC-CRL &=(uint32_t)(1111CRL &=(uint32_t)(1111CRL |=(uint32_t)(0011CRL |=(uint32_t)(0011CRL &=(uint32_t)(1111CRL &=(uint32_t)(1111CRL |=(uint32_t)(0011CRL |=(uint32_t)(0011CRL

71、 &=(uint32_t)(1111CRL &=(uint32_t)(1111CRL |=(uint32_t)(0011CRL |=(uint32_t)(00114*5); /配置配置Pin5Pin5的的4 4个控制位个控制位 修改起来比较容易,执行效率低些修改起来比较容易,执行效率低些F本章介绍的库开发方式,调用库函数耗时,但易快速编程;本章介绍的库开发方式,调用库函数耗时,但易快速编程;CPUCPU高速了,一般不必担心耗时。高速了,一般不必担心耗时。2021/7/2252课下任务作业:作业:F1 1、试述、试述STM32STM32的系统时钟,并说明是如何设置的?的系统时钟,并说明是如何设置

72、的?F2 2、举例说明、举例说明STM32STM32的外设时钟是如何开启与关闭的。的外设时钟是如何开启与关闭的。F3 3、LEDLED流水灯模拟实验,实验报告(包括每个语句的解流水灯模拟实验,实验报告(包括每个语句的解释意义)。释意义)。思考简答:思考简答:F在在stm32f10x_conf.hstm32f10x_conf.h这个头文件中定义的函数声明还是这个头文件中定义的函数声明还是宏定义,怎么在其它文件中应用呢?宏定义,怎么在其它文件中应用呢?自学:自学:FGPIO_Init()GPIO_Init()函数的定义代码分析,见野火函数的定义代码分析,见野火PDFPDF资料资料P105-106.

73、P105-106.2021/7/22532021/7/2254旧版本BUG Error: L6218E:FError: L6218E: Undefined symbol assert_param Error: L6218E: Undefined symbol assert_param (referred from stm32f10x_gpio.o).(referred from stm32f10x_gpio.o).F断言机制函数断言机制函数assert_param,STM32STM32的函数:的函数:assert_param(IS_GPIO_ALL_PERIPH(GPIOx);assert_param(IS_GPIO_ALL_PERIPH(GPIOx);F刚开始学习的时候都遇到编译不过去的问题刚开始学习的时候都遇到编译不过去的问题, , 通过在文通过在文件中添加件中添加USE_STDPERIPH_DRIVERUSE_STDPERIPH_DRIVER来解决的:来解决的:2021/7/2255个人观点供参考,欢迎讨论

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号