欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPTX文档下载  

    时钟与设计(共53张)课件.pptx

    • 资源ID:1331399       资源大小:1.22MB        全文页数:53页
    • 资源格式: PPTX        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    时钟与设计(共53张)课件.pptx

    第章时钟与设计,第章时钟与设计,第8章 STM32时钟与GPIO设计,8.1 时钟设置与开启外设时钟 8.2 GPIO简介8.3 GPIO端口配置存放器8.4 stm32f10 x.h库中GPIO代码剖析8.6 GPIO控制LED灯实验,第8章 STM32时钟与GPIO设计8.1 时钟设置与开启,8.1 系统时钟配置与外设时钟开启,在startup_stm32f10 x_hd.s启动文件中,调用_main函数之前先调用了SystemInit()初始化函数,其中系统时钟SYSCLK设置:时钟源、倍频、分频等控制参数。,SystemInit()定义在system_stm32f10 x.c文件中,其他的配置主要在stm32f10 x_rcc.c中。使用外设时,配置初始化后,必须也要开启外设时钟。,8.1 系统时钟配置与外设时钟开启在startup_stm3,时钟设置解析,系统时钟SYSCLK是SystemInit()先将配置时钟相关的存放器都复位为默认值,再调用SetSysClock()选择使用频率,而具体设置是通过宏定义设置的。函数调用顺序: 启动文件 SystemInit() SetSysClock() SetSysClockTo72()。,时钟设置解析系统时钟SYSCLK是SystemInit()先,1、SystemInit(),STM32时钟系统的SystemInit()中设置:SYSCLK系统时钟=72MHzAHB总线时钟(使用SYSCLK)=72MHzAPB1总线时钟(PCLK1)=36MHzAPB2总线时钟(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文件中。,1、SystemInit()STM32时钟系统的System,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 APB1RSTR;_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 CFGR2;#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正好是地址偏移量,所以把连续的存放器组定义为结构。,RCC时钟存放器组在stm32f10 x.h中的定义typed,2、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,2、SetSysClock()函数如下此函数中选择调用确定使,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 欲深入分析时钟配置,就仔细阅读这些最底层的库函数!,3、SetSysClockTo72()函数各个SetSysC,开启关闭外设时钟,外设都是挂在AHB、APB1、APB2总线上,要想使用某个外设,必须初始化外设后,再开启使用开启外设的时钟,不用时再关闭外设时钟,从而降低STM32的整体功耗。stm32f10 x_rcc.c文件中有开启和关闭外设时钟的库函数,如下:RCC_AHBPeriphClockCmd(外设名,ENABLE|DISABLE)挂在AHB总线外设的开启与关闭函数,ENABLE开启,DISABLE关闭外设时钟;RCC_APB1PeriphClockCmd(外设名,ENABLE|DISABLE)挂在APB1总线外设的开启与关闭函数;RCC_APB2PeriphClockCmd(外设名,ENABLE|DISABLE)挂在APB2总线外设的开启与关闭函数;,开启关闭外设时钟外设都是挂在AHB、APB1、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 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 RCC_AHBPeriph_ETH_MAC_Rx (uint32_t)0 x00010000),挂载在AHB的外设名stm32f10 x_rcc.h中对外设名,挂载在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 x00000200)#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 x00008000)#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),挂载在APB2上的外设名#define RCC_APB2Pe,挂载在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 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 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)#define RCC_APB1Periph_CEC (uint32_t)0 x40000000),挂载在APB1上的外设名#define RCC_APB1Pe,开启外设时钟举例:,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_APB2PeriphClockCmd( RCC_APB2Periph_ADC1, ENABLE) 开启关闭外设时钟的三个函数,内部对外设时钟的使能存放器操作,到达开启和关闭的目的。,开启外设时钟举例: GPIO的C口挂在APB2总线,所用的时,8.2 GPIO简介,GPIOGeneral Purpose I/O通用型输入/输出,主要用于需要用到数字量输入/输出的场合。如:继电器、 LED、蜂鸣器等的控制;传感器状态、上下电平等信息的输入等。管脚可承受最大5V的输入电压,电流为4mA,短时间极限值40mA;。,8.2 GPIO简介GPIOGeneral Purpos,GPIO简介,GPIO引脚又被分为GPIOA、GPIOBGPIOG不同的组,每组端口分为015,共16个引脚,不同芯片的端口组数不同。GPIO结构图:,端口配置存放器,GPIO简介GPIO引脚又被分为GPIOA、GPIOBGP,GPIO简介,I/O引脚可通过端口配置存放器设置成不同的功能。四种输入模式图上半局部:上拉输入与下拉输入:与VDD相连的为上拉电阻,与VSS相连的为下拉电阻。再经施密特触发器就把信号转化为0、1存储在输入数据存放器。浮空输入:不接上拉与下拉电阻,直接由触发器输入,由于其输入阻抗较大,一般把这种模式用于标准的通讯协议如I2C、USART的接收端。模拟输入:把电压信号直接传送到片上外设模块,如ADC,GPIO简介I/O引脚可通过端口配置存放器设置成不同的功能。,GPIO简介,推挽输出模式:输出1时P-MOS导通输出高电平1,0时N-MOS管导通输出低电平0。开漏输出模式:只有N-MOS管,外部需接上拉电阻,输出0时导通,为低电平0;输出1时截止,为高阻状态。复用功能的推挽式输出模式。复用功能的开漏输出模式。,一只三极管放大信号正半周,另一只放大负半周,故称推挽放大器,四种输出模式(图下半局部):,GPIO简介推挽输出模式:输出1时P-MOS导通输出高电平1,GPIO简介,GPIO都可配置为中断功能,并可设置为上升沿、下降沿或边沿触发。,GPIO中断还具有掉电唤醒功能,GPIO简介 STM32P0.xP2.xGPIO都可配置为中,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种输出模式。,8.3 GPIO端口配置存放器1、端口配置低存放器GPIOx,RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC,ENABLE)DLL Parameter:-pSTM32F103VE#define RCC_APB1Periph_CEC (uint32_t)0 x40000000)4、端口输出数据存放器GPIOx_ODR1、GPIO_InitTypeDef结构,引脚初始化的结构#define RCC_AHBPeriph_ETH_MAC_Rx (uint32_t)0 x00010000)G),读该存放器可看某个IO口的输入状态。如GPIOC的Pin4还可作为ADC1的输入引脚,把它作为ADC1来用,除开启GPIOC时钟,还要开启ADC1时钟:#define GPIOC_BASE (APB2PERIPH_BASE + 0 x1000)4 stm32f10 x.LED实验中用到了RCC跟GPIO这两个外设。_IO uint32_t BSRR;GPIO_Mode_AF_PP = 0 x18 /复用功能推挽输出答:那么把x端口第15个引脚的模式配置成了:输出的最大速度为50MHz的 通用推挽输出模式。欲深入分析时钟配置,就仔细阅读这些最底层的库函数!#define RCC_APB1Periph_BKP (uint32_t)0 x08000000)IDRy15:0 (y = 015)每个位对应I/O口的输入状态。,GPIO端口配置存放器,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,复位后端口配置为什么口?,RCC_APB2PeriphClockCmd( RCC_AP,2、端口配置高存放器GPIOx_CRH,GPIOx_CRH(配置815引脚) 与端口配置低存放器类似。地址偏移量:0 x04h,复位值:0 x4444 4444例1:GPIOx_CRH存放器的第28至29位设置为11,并在第30至31位设置为00: 答:那么把x端口第15个引脚的模式配置成了:输出的最大速度为50MHz的 通用推挽输出模式。例2:上题反过来。,2、端口配置高存放器GPIOx_CRHGPIOx_CRH(配,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为只读并只能以字的形式读出。,3、端口输入数据存放器GPIOx_IDR端口输入数据存放器(,4、端口输出数据存放器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位进行独立的置位/清零。,4、端口输出数据存放器GPIOx_ODRGPIOx_ODR(,5、端口位置位/清零存放器GPIOx_BSRR,GPIOx_BSRR(x=A.G),对GPIOx的端口置位/清零。地址偏移量:0 x10,复位值:0 x0000 0000,位31:16为BRy(y = 015),清零,只能以字写入:0:对应的ODRx位不产生影响;1:对应的ODRx位清零;位15:0为BSy(y = 015),置位,只能以字写入:0:对对应的ODRx位不产生影响;1:对应的ODRx位置位;注:如果同时设置BSy和BRy的对应位,BSx位起作用。,5、端口位置位/清零存放器GPIOx_BSRRGPIOx_B,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位清零;,6、端口位清零存放器(GPIOx_BRR)GPIOx_BRR,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不锁;,7、端口配置锁定存放器GPIOx_LCKR端口配置锁定存放器,例:,要控制引脚电平上下,需要对存放器进行什么操作?一个引脚y的输出数据由GPIOx_BSRR存放器位的2个位来控制分别为BRy (Bit Reset y)和BSy (Bit Set y),BRy位用于写1清零,使引脚输出低电平;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;最后到了宏GPIOC_BASE为APB2PERIPH_BASE加上地址偏移量0 x1000得到了GPIOC端口的存放器组的基地址为0 x4001 1000 。,8.4 stm32f10 x.h库中GPIO代码剖析以外设GP,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存放器组的起始地址,都对应着独立的一组存放器。,stm32f10 x.h中GPIO代码剖析stm32f10 x.,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中代码:,结构体首地址即CRL地址假设为0 x4001 1000,那么第二个变量CRH为0 x4001 1000 +0 x04 , 0 x04正好是存放器组中的地址偏移量。所以把连续的存放器组定义为结构。,typedef struct #define GPIOA,stm32f10 x.h中GPIO代码剖析,有了这样的宏,就可用以下方式来修改GPIO存放器:GPIO_TypeDef * GPIOx; / *定义GPIOx指针变量为GPIO_TypeDef结构体型GPIOx = GPIOA; /把指针地址设置为宏GPIOA地址 GPIOx-CRL = 0 xFFFF FFFF; /“-通过指针访问并修改GPIOA_CRL存放器 通过类似的方式,我们就可以给具体的存放器写上适当的参数,控制STM32了。这只是库开发的皮毛,库提供了更简单的开发方式。,stm32f10 x.h中GPIO代码剖析有了这样的宏,就可用,使用GPIO,1. 配置存放器:选定GPIO的特定功能,最根本的如:选择作为输入还是输出端口。 2. 数据存放器:保存了GPIO的输入电平 或 将要输出的电平。 3. 位控制存放器:设置某引脚的数据 为1或0,控制输出的电平。 4. 锁定存放器:设置某锁定引脚后,就不能修改其配置。,使用GPIO1. 配置存放器:选定GPIO的特定功能,最根本,_IO uint32_t AHBRSTR;h这个头文件中定义的函数声明还是宏定义,怎么在其它文件中应用呢?10:最大速度2MHz0:对对应的ODRx位不产生影响;GPIOx_IDR为只读并只能以字的形式读出。要控制引脚电平上下,需要对存放器进行什么操作?/*设置引脚模式为通用推挽输出*/3、SetSysClockTo72()函数0:对应的ODRx位不产生影响;GPIOC-CRL /清空Pin3的4个控制位模拟输入:把电压信号直接传送到片上外设模块,如ADC,关于GPIO库函数,_IO uint32_t AHBRSTR;关于GPIO库函,7.6 LED流水灯实验,实验学习方法,先学习例程编写方法,掌握后,在实验过程中改写程序、逐渐编写程序!想要控制LED灯,当然是通过控制STM32芯片的I/O引脚电平的上下来实现。,7.6 LED流水灯实验实验学习方法,先学习例程编写方法,,LED流水灯实验,LED流水灯实验,LED流水灯实验,LED实验中用到了RCC跟GPIO这两个外设。环境配置如图:用到的源程序:main.cled.cled.h,LED流水灯实验LED实验中用到了RCC跟GPIO这两个外设,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( ON );Delay(0 x0FFFFF);LED2( OFF ); LED3( ON );Delay(0 x0FFFFF);LED3( OFF ); ,Led流水灯主程序:main.c#include led.,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_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-初始化函数 LED_GPIO_Config(),led.c,/设置引脚速率为50MHz GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;/端口初始化库函数,利用上面设置的参数初始化GPIOCGPIO_Init(GPIOC, 函数LED_GPIO_Config()实现了所有为点亮led的配置,led.c/设置引脚速率为50MHz,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.h头文件#ifndef _LED_H / 条件,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 */在编译过程,编译器会把带参宏展开,在相应的位置替换为宏展开代码。其中的反斜杠符号“ 叫做续行符,后面不能有空格、注释等,led.h续#define LED2(a)if (a) ,led用到stm32f10 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 selected */,GPIO_Pin_x,x位为1,其余位为0,在第x位置1表示pin x例: GPIO_Pin_1 0000 0000 0000 0010B,led用到stm32f10 x_gpio.h库的结构、宏定义1,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)BSpeed控制参数,它的宏展开低2位的值,正好符合存放器MODEy中2位的控制值。直接把这个参数写入CRL、CRH配置存放器的MODEy位,其中y由GPIO_Pin参数确定第几引脚。,led用到stm32f10 x_gpio.h库的结构、宏定义3,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;,led用到stm32f10 x_gpio.h库的结构、宏定义4,led用到stm32f10 x_gpio.h库的结构、宏定义,四种输出模式参数中的bit4 均为1,而四种输入模式中的bit4均为0。所以在代码中通过与0 x10作位与运算,即可区分输入和输出模式。而bit2和bit3的参数值正好对应为CRL、CRH存放器中的CNFy的2个控制位。确定是什么模式。经过与Speed参数MODEy组合后,配置一个引脚的4位参数就确定了。,led用到stm32f10 x_gpio.h库的结构、宏定义四,用于初始化的库函数GPIO_Init(),通过查找库帮助文档获得,用于初始化的库函数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:-pSTM32F103VE,DMK软件BUG: error 65创立一个STM32,逻辑分析窗口使用,再点击Setup,输入LED灯对应的三个信号PORTB.0、PORTF.7、PORTF.8;,Display Type选择bit,然后单击Close关闭该对话框;,逻辑分析窗口使用再点击Setup,输入LED灯对应的三个信号,逻辑分析窗口使用,点击运行按钮。运行一段时间之后,点击停止按钮,暂停仿真回到逻辑分析窗口,可通过Zoom里面的In按钮来放大波形,通过Out按钮来缩小波形,或者按All显示全部波形。,逻辑分析窗口使用点击运行按钮。运行一段时间之后,点击停止按钮,8.7 再论库开发方式,LED实验中存放器配置经历了一下四步:1、led.c代码对 GPIO_InitStructure.GPIO_Pin 结构体成员赋值为GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5,宏展开为0000 0000 0011 1000B,说明对这三个引脚进行配置。 2、对.GPIO_Mode 赋值为GPIO_Mode_Out_PP,宏展开为0001 0100B,说明把这三个引脚都设置为通用推挽模式。 3、对.GPIO_Speed赋值为GPIO_Speed_50MHz,宏展开为0011B,说

    注意事项

    本文(时钟与设计(共53张)课件.pptx)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开