网站可以放多少视频,商圈外卖网站怎么做,公司网站制作要多少钱,做网站前台后台是怎么连接的1.GPIO简介
GPIO#xff0c;全称是General-purpose input/output#xff08;通用输入输出#xff09;。在单片机中是表示能被控制的引脚#xff0c;能检测输入信号的高低电平#xff0c;也能输出高低电平控制外部设备。STM32F103RCT6一共有64个引脚#xff0c;其中有51个…1.GPIO简介
GPIO全称是General-purpose input/output通用输入输出。在单片机中是表示能被控制的引脚能检测输入信号的高低电平也能输出高低电平控制外部设备。STM32F103RCT6一共有64个引脚其中有51个GPIO其他引脚分别是电源、地、一个复位引脚以及一个BOOT引脚。这51个GPIO被分为不同的组比如PAx、PBx、PCx等每组一般是16个GPIO。又因为单片机功能很强大集成了很多外设比如UART、I2C、SPI等但引脚有限所以一般每个GPIO能复用成好几种功能对于哪个引脚可以用作哪些功能可以通过查阅数据手册得知。比如PC3引脚它是第11脚引脚名称是PC3可以作为GPIOPC3也可以用作ADC的输入引脚 2.GPIO 结构 图中所示是GPIO基本的内部控制框图总体分为输入与输出两部分。每个GPIO端口都可以用对应的寄存器来控制其状态。
3.GPIO 模式
输入浮空输入引脚内部不进行上下拉 输入上拉输入引脚内部上拉 输入下拉输入引脚内部下拉 模拟输入一般用于模拟量输入比如ADC输入 开漏输出引脚只能输出电平不能输出高电平可以用于线与功能 推挽输出既能输出高电平也能输出低电平 推挽复用功能引脚被其他外设接管比如UART能输出高低电平 开漏复用功能引脚被其他外设接管比如I2C只能输出低电平
4.GPIO 寄存器
GPIO寄存器就是来控制GPIO的功能及行为的可以将GPIO配置成上述列出的各种模式让GPIO检测输入的信号或者控制其输出高电平或者低电平等 每个GPIO有以下几种寄存器
两个32位配置寄存器GPIOx_CRL and GPIOx_CRH两个32位数据寄存器GPIOx_IDR and GPIOx_ODR一个32位置位/复位寄存器GPIOx_BSRR一个16位复位寄存器GPIOx_BRR一个32位锁定寄存器GPIOx_LCKR
4.1 GPIOx_CRL and GPIOx_CRH寄存器
GPIOx_CRH寄存器与GPIOx_CRL寄存器类似只不过GPIOx_CRL寄存器用于控制每组GPIO的0-7个引脚GPIOx_CRH寄存器用于控制每组GPIO的8-15个引脚这里重点分析GPIOx_CRL寄存器 上图是参考手册中的GPIOx_CRL寄存器描述。可以看到这32个位都是由CNFy[1:0] - MODEy[1:0]重复组成其中y 0,1,2…7。每一对CNFy - MODEy占4个位用来配置一个GPIOCNF0 - MODE0用来控制GPIO0CNF1 - MODE1用来控制GPIO1依次类推。所以GPIOx_CRL共32个位可以控制GPIO0 - 7这8个引脚GPIOx_CRH用来控制GPIO8 - 15这8个引脚。GPIO属于哪一组由GPIOx_CRL/H中的x指定x A,B,C…。
MODEy[1:0]用于选择GPIO是输入模式还是输出模式如果是输出模式可以指定输出的最大速率 CNFy[1:0]用于选择GPIO的工作模式输入浮空、输入上拉、输入下拉…
比如配置PC5引脚为推挽输出输出速率2MHz 1° PC5属于C组引脚应该选择GPIOC_CRL或者GPIOC_CRH寄存器 2° PC5是C组第5个引脚每组0-7这8个引脚用GPIOx_CRL寄存器配置每组8-15这8个引脚用GPIOx_CRH寄存器配置应该选择GPIOC_CRL寄存器 3° 配置GPIOC_CRL寄存器中的第20 -23位CNF5 - MODE5
/*
0x03是十六进制
换成二进制是11用32位来表示就是11前面加30个0
0000 0000 0000 0000 0000 0000 0000 0011
左移20位得到
0000 0011 0000 0000 0000 0000 0000 0000
按位取反得到
1111 1100 1111 1111 1111 1111 1111 1111两个0的位置对应的就是第20 - 21位也就是MODE5[1:0]
将上面的值与原来的值进行按位与操作就会将MODE5[1:0]清零
*/
GPIOC-CRL ~((uint32_t)0x03 20); //将 MODE5[1:0] 清0
/*
同理将0x02 20位后再与原来的值按位或就可以将MODE5[1:0]配置为10
GPIOC_CRL寄存器一共有32个位上述这样赋值的好处是不会干扰其他位的值只对需要修改的位进行修改
*/
GPIOC-CRL | ((uint32_t)0x02 20); //将 MODE5[1:0] 配置为10 输出模式最大速率2MHz
GPIOC-CRL ~((uint32_t)0x03 22); //将 CNF5[1:0] 清0
/* 上一步已经清0如果还要配置为0这一步可以不要 */
GPIOC-CRL | ((uint32_t)0x00 22); //将 CNF5[1:0] 配置为00 通用推挽输出模式4.2 GPIOx_IDR and GPIOx_ODR寄存器
GPIOx_IDR寄存器与GPIOx_ODR寄存器类似只不过GPIOx_IDR寄存器用于读取GPIO口电平状态且各寄存器位只能读不能写也不需要写GPIOx_ODR用于控制GPIO口输出电平状态 从GPIOx_ODR寄存器描述中可以看到 32位寄存器的高16位是保留的低16位用于控制GPIO口的电平输出。每一个ODRy用于控制一个GPIOODR0用于控制GPIO0ODR1用于控制GPIO1依次类推。所以GPIOx_ODR的低16位就足以控制一组GPIOGPIO属于哪一组由GPIOx_ODR中的x指定x A,B,C…。
ODRy置1对应的GPIO会输出1高电平ODRy清0对应的GPIO会输出0低电平
比如配置PC5引脚输出0低电平/1高电平 1° PC5属于C组引脚应该选择GPIOC_ODR寄存器 2° 配置GPIOC_ODR寄存器中的第5位ODR5
/* PC5引脚输出0低电平 */
GPIOC-ODR ~((uint16_t)0x01 5); //将ODR5清0/* PC5引脚输出1高电平 */
GPIOC-ODR | ((uint16_t)0x01 5); //将ODR5置14.3 GPIOx_BSRR寄存器 在GPIOx_BSRR寄存器中有两种类型的控制位一种是BRy高16位一种是BSy低16位最终都是用于控制GPIOx_ODR寄存器。每一个BRy/BSy用于控制一个对应的ODRy位BR0/BS0用于控制ODR0BR1/BS1用于控制ODR1依次类推。而GPIOx_ODR寄存器最终是控制GPIO输出电平状态的所以可以等效认为BRy/BSy控制的是GPIO输出电平状态BR0/BS0用于控制GPIO0BR1/BS1用于控制GPIO1依次类推。
BRy写0不会对GPIO输出电平产生影响置1使对应的GPIO输出低电平 BSy写0不会对GPIO输出电平产生影响 置1使对应的GPIO输出高电平
比如配置PC5引脚输出0低电平/1高电平 1° PC5属于C组引脚应该选择GPIOC_BSRR寄存器 2° 要输出低电平应该选择BRy位PC5是C组的第5个引脚应该选择BR5位要输出高电平应该选择BSy位PC5应该选择BS5位 3° 配置GPIOC_BSRR寄存器中的第21位BR5/第5位BS5
/* PC5引脚输出0低电平 */
/* 0x01 5是定位到第5个GPIO再左移16是定位到BRy位因为BRy位是GPIOx_BSRR寄存器的高16位 */
GPIOC-BSRR (((uint32_t)0x01 5) 16);/* PC5引脚输出1高电平 */
GPIOC-BSRR ((uint32_t)0x01 5);4.4 GPIOx_BRR寄存器 GPIOx_BRR寄存器也是用于控制GPIOx_ODR寄存器与GPIOx_BSRR寄存器中的BRy位功能相同这里也可以认为是直接控制GPIO输出电平状态的只能让对应的GPIO输出低电平
比如配置PC5引脚输出0低电平 1° PC5属于C组引脚应该选择GPIOC_BRR寄存器 2° 配置GPIOC_BRR寄存器中的第5位BR5
/* PC5引脚输出0低电平 */
GPIOC-BRR ((uint16_t)0x01 5);4.5 GPIOx_LCKR寄存器 GPIOx_LCKR寄存器可以锁定GPIOx_CRL与GPIOx_CRH寄存器的配置一旦对相应的GPIO被锁定后在下次系统复位之前将不能再更改对应的GPIOx_CRL与GPIOx_CRH寄存器。
锁键写入序列 对LCKK位 写1 - 写0 - 写1 - 读0 - 读1并且在进行写入序列时不能更改LCK[15:0]位的值 最后一个读1可以省略但可以用来确认锁键已被激活
比如要锁定PC5的配置寄存器GPIOC_CRL and GPIOC_CRH
uint32_t xReturn 0x00;
/* 0x01 16 是对LCKK位写10x01 5 是对LCK5位置1对PC5的配置寄存器进行锁定 */
GPIOC-LCKR ((uint16_t)0x01 16 | (uint16_t)0x01 5);
/* 对LCKK位写1同时LCK5位的值不变 */
GPIOC-LCKR ((uint16_t)0x01 5);
/* 对LCKK位写1同时LCK5位的值不变 */
GPIOC-LCKR ((uint16_t)0x01 16 | (uint16_t)0x01 5);
/* 读0 */
xReturn GPIOC-LCKR;
/* 读1 */
xReturn GPIOC-LCKR;if(xReturn ((uint16_t)0x01 16)) {printf(PC5 has been locked\r\n);
}当PC5的配置寄存器被锁定后在下次系统复位之前都不能再更改。如果需要继续锁定其他GPIO可针对对应的GPIO再次重复上述写序列。
上述对GPIO寄存器进行了一个比较完整的分析对于其他外设也同样是操作对应的外设寄存器来实现相应的功能至于每个外设的寄存器描述可以查阅参考手册。由于STM32寄存器比较多我们在实际应用时一般很少使用寄存器编程更多的是使用库编程后续我们采用HAL库编程的方式进行功能验证
5.硬件连接 我们开发板上将LED引脚接在单片机的PB1引脚上。当PB1输出高电平时LED不亮当PB1输出低电平时LED点亮。开发板完整的原理图可以在HAL库工程模板这一章节的最后百度网盘链接分享处获取
6.寄存器软件编程
1° 这里的PB1引脚是当作普通引脚来使用所以不能配置成开漏复用或者推挽复用又要求PB1能输出高低电平所以要配置成通用推挽输出模式这里要求的速率不高可以配置成最大输出速率2MHz就可以。那为什么不能配置成输入模式呢因为输入模式下的引脚状态是由外部决定的内部可以去读取外部引脚状态。我们这里要求PB1引脚既要有高电平也要有低电平即使外部能让PB1引脚在高低电平之间转换也不一定是单片机内部程序可控的所以不能用输入模式。 2° 在while循环中将LED点亮500ms再熄灭500ms依次循环。500ms延时可以使用HAL_Delay(500)来实现。
在编程之前我们还要知道要使用某一个外设功能时要先打开外设的时钟时钟的开启在参考手册中RCC复位和时钟控制那一章通过查阅手册可以发现GPIOB的时钟使能位在RCC_APB2ENR寄存器中的第3位 将RCC_APB2ENR寄存器中的第3位置1就可以开启GPIOC的时钟其他外设时钟的开启也是类似的。
开启GPIOC时钟代码
RCC_APB2ENR | ((uint16_t)0x01 3); //开启GPIOB时钟在上一节调试串口的基础上增加以下代码
/* 在while循环之前添加以下初始化代码 */
RCC-APB2ENR | ((uint16_t)0x01 3 ); //开启GPIOB时钟
/* 配置PB1为通用推挽输出模式输出速率设置为2MHz */
GPIOB-CRL ~((uint32_t)0x03 4); //将 MODE1[1:0] 清0
GPIOB-CRL | ((uint32_t)0x02 4); //将 MODE1[1:0] 配置为10 输出模式最大速率2MHz
GPIOB-CRL ~((uint32_t)0x03 6); //将 CNF1[1:0] 清0
GPIOB-CRL | ((uint32_t)0x00 6); //将 CNF1[1:0] 配置为00 通用推挽输出模式/* PB1引脚输出1高电平默认熄灭LED */
GPIOB-BSRR ((uint32_t)0x01 1); //这里也可以使用ODR寄存器/* while循环中控制LED亮灭代码 */
while(1)
{/* PB1引脚输出0低电平点亮LED */GPIOB-BSRR (((uint32_t)0x01 1) 16); //这里也可以使用BRR寄存器、ODR寄存器/* 延时 */HAL_Delay(500);/* PB1引脚输出1高电平熄灭LED */GPIOB-BSRR ((uint32_t)0x01 1); //这里也可以使用ODR寄存器/* 延时 */HAL_Delay(500);
}将程序下载到开发板发现LED会以500ms的间隔不停闪烁。
上述我们使用的是寄存器来实现LED亮灭的功能的下面我们使用STM32CubeMX来配置HAL库实现LED亮灭功能。
7.HAL库软件编程
使用STM32CubeMX打开工程文件 按下图所示找到PB1引脚点击后在弹出的选项中选择GPIO_Output 按下图配置PB1引脚 生成代码后可以发现在gpio.c文件中已经配置好了PB1引脚
void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct {0};/* GPIO Ports Clock Enable *//* 开启GPIO时钟 */__HAL_RCC_GPIOC_CLK_ENABLE();__HAL_RCC_GPIOD_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/* 开启GPIOB时钟 */__HAL_RCC_GPIOB_CLK_ENABLE();/* 这里将PB1引脚默认输出高电平 *//*Configure GPIO pin Output Level */HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);/*Configure GPIO pin : PtPin *//* 这里是PB1引脚我们给他定义了一个标签LED所以他显示LED_Pin */GPIO_InitStruct.Pin LED_Pin; //在main.h中有定义#define LED_Pin GPIO_PIN_1/* 推挽输出模式 */GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP;/* 无上下拉 */GPIO_InitStruct.Pull GPIO_NOPULL;/* 输出速率选择 */GPIO_InitStruct.Speed GPIO_SPEED_FREQ_LOW;/* 调用HAL_GPIO_Init对PC5进行初始化 */HAL_GPIO_Init(LED_GPIO_Port, GPIO_InitStruct); //在main.h中有定义#define LED_GPIO_Port GPIOB
}以上就是STM32CubeMX对PB1引脚做的初始化配置并且会在main函数中调用初始化配置函数MX_GPIO_Init()。对于如何使用这个引脚是由我们自己实现的不过有相关的库函数可供我们调用这些函数可以在对应外设的头文件中查找。比如GPIO相关的接口函数可以在stm32f1xx_hal_gpio.h中找到 我们上述初始化PC5引脚时调用的就是HAL_GPIO_Init函数如果需要让PC5引脚输出高低电平可以调用 HAL_GPIO_WritePin函数。在对应外设的源文件中可以找到相关函数函数定义上方有注释说明函数各个参数的含义。比如在stm32f1xx_hal_gpio.c中的HAL_GPIO_WritePin函数 第一个参数是指定哪一组GPIO我们使用PB1是B组就是GPIOB 第二个参数是指定哪一个引脚我们使用PB1是C组第1个引脚就是GPIO_PIN_1 第三个参数是指要在引脚上输出的电平状态GPIO_PIN_RESET是输出低电平GPIO_PIN_SET是输出高电平。
那我们要让LED灯亮灭时就可以调用HAL_GPIO_WritePin函数我们在while函数中编程
/* while循环中控制LED亮灭代码 */
while(1)
{/* PB1引脚输出0低电平点亮LED */HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);/* 延时 */HAL_Delay(500);/* PB1引脚输出1高电平熄灭LED */HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);/* 延时 */HAL_Delay(500);
}将程序下载到开发板后发现LED会以500ms的间隔不停闪烁。
本例程代码可以在HAL库工程模板这一章节的最后百度网盘链接分享处获取
以上是通过开发板进行实际验证的下面使用软件仿真
我们首先进入调试界面( 前面章节有提到所以本篇以及后续章节都不再重复提及 )按下图所示打开逻辑分析仪 点击 Setup… 添加PB1端口 选择显示类型为Bit 点击Close就可以在逻辑分析仪中看到我们添加的PB1端口 点击全速运行后就可以看到PB1的波形每隔500ms翻转一次状态( 高低电平 ) 注逻辑分析仪中每一隔代表的时间间隔可以通过先将鼠标光标移到波形区域使用鼠标中的滚轮滚动调节 文章转载自: http://www.morning.sgpnz.cn.gov.cn.sgpnz.cn http://www.morning.pgrsf.cn.gov.cn.pgrsf.cn http://www.morning.hhnhb.cn.gov.cn.hhnhb.cn http://www.morning.nxfwf.cn.gov.cn.nxfwf.cn http://www.morning.kabaifu.com.gov.cn.kabaifu.com http://www.morning.qqrqb.cn.gov.cn.qqrqb.cn http://www.morning.ttxnj.cn.gov.cn.ttxnj.cn http://www.morning.trfh.cn.gov.cn.trfh.cn http://www.morning.kbqqn.cn.gov.cn.kbqqn.cn http://www.morning.qcbhb.cn.gov.cn.qcbhb.cn http://www.morning.yjmlg.cn.gov.cn.yjmlg.cn http://www.morning.wdskl.cn.gov.cn.wdskl.cn http://www.morning.hyhqd.cn.gov.cn.hyhqd.cn http://www.morning.fzwf.cn.gov.cn.fzwf.cn http://www.morning.kksjr.cn.gov.cn.kksjr.cn http://www.morning.ccjhr.cn.gov.cn.ccjhr.cn http://www.morning.lhjmq.cn.gov.cn.lhjmq.cn http://www.morning.kgjyy.cn.gov.cn.kgjyy.cn http://www.morning.wbqk.cn.gov.cn.wbqk.cn http://www.morning.kysport1102.cn.gov.cn.kysport1102.cn http://www.morning.lcplz.cn.gov.cn.lcplz.cn http://www.morning.dthyq.cn.gov.cn.dthyq.cn http://www.morning.pmrlt.cn.gov.cn.pmrlt.cn http://www.morning.bgxgq.cn.gov.cn.bgxgq.cn http://www.morning.mzpd.cn.gov.cn.mzpd.cn http://www.morning.pgmyn.cn.gov.cn.pgmyn.cn http://www.morning.chjnb.cn.gov.cn.chjnb.cn http://www.morning.rpth.cn.gov.cn.rpth.cn http://www.morning.dyfmh.cn.gov.cn.dyfmh.cn http://www.morning.wqrk.cn.gov.cn.wqrk.cn http://www.morning.xhgxd.cn.gov.cn.xhgxd.cn http://www.morning.fpjw.cn.gov.cn.fpjw.cn http://www.morning.yzxlkj.com.gov.cn.yzxlkj.com http://www.morning.ngcsh.cn.gov.cn.ngcsh.cn http://www.morning.nmbbt.cn.gov.cn.nmbbt.cn http://www.morning.fbylq.cn.gov.cn.fbylq.cn http://www.morning.brbmf.cn.gov.cn.brbmf.cn http://www.morning.rqzyz.cn.gov.cn.rqzyz.cn http://www.morning.tpnx.cn.gov.cn.tpnx.cn http://www.morning.rpjr.cn.gov.cn.rpjr.cn http://www.morning.ptysj.cn.gov.cn.ptysj.cn http://www.morning.wztlr.cn.gov.cn.wztlr.cn http://www.morning.ykmg.cn.gov.cn.ykmg.cn http://www.morning.xknmn.cn.gov.cn.xknmn.cn http://www.morning.rsszk.cn.gov.cn.rsszk.cn http://www.morning.ghwtn.cn.gov.cn.ghwtn.cn http://www.morning.3dcb8231.cn.gov.cn.3dcb8231.cn http://www.morning.pmmrb.cn.gov.cn.pmmrb.cn http://www.morning.txlnd.cn.gov.cn.txlnd.cn http://www.morning.lydtr.cn.gov.cn.lydtr.cn http://www.morning.nfzzf.cn.gov.cn.nfzzf.cn http://www.morning.wmcng.cn.gov.cn.wmcng.cn http://www.morning.kszkm.cn.gov.cn.kszkm.cn http://www.morning.zshuhd015.cn.gov.cn.zshuhd015.cn http://www.morning.stlgg.cn.gov.cn.stlgg.cn http://www.morning.tslfz.cn.gov.cn.tslfz.cn http://www.morning.rzcfg.cn.gov.cn.rzcfg.cn http://www.morning.lfqnk.cn.gov.cn.lfqnk.cn http://www.morning.fzwf.cn.gov.cn.fzwf.cn http://www.morning.sjbty.cn.gov.cn.sjbty.cn http://www.morning.jsxrm.cn.gov.cn.jsxrm.cn http://www.morning.bxdlrcz.cn.gov.cn.bxdlrcz.cn http://www.morning.fdfdz.cn.gov.cn.fdfdz.cn http://www.morning.sfmqm.cn.gov.cn.sfmqm.cn http://www.morning.nypgb.cn.gov.cn.nypgb.cn http://www.morning.hrdx.cn.gov.cn.hrdx.cn http://www.morning.cxtbh.cn.gov.cn.cxtbh.cn http://www.morning.tgdys.cn.gov.cn.tgdys.cn http://www.morning.cpnsh.cn.gov.cn.cpnsh.cn http://www.morning.lsssx.cn.gov.cn.lsssx.cn http://www.morning.jjwt.cn.gov.cn.jjwt.cn http://www.morning.lbgfz.cn.gov.cn.lbgfz.cn http://www.morning.ryxgk.cn.gov.cn.ryxgk.cn http://www.morning.byjwl.cn.gov.cn.byjwl.cn http://www.morning.ctxt.cn.gov.cn.ctxt.cn http://www.morning.pfcrq.cn.gov.cn.pfcrq.cn http://www.morning.ghyfm.cn.gov.cn.ghyfm.cn http://www.morning.gpmrj.cn.gov.cn.gpmrj.cn http://www.morning.lpcct.cn.gov.cn.lpcct.cn http://www.morning.rqfkh.cn.gov.cn.rqfkh.cn