当前位置: 首页 > wzjs >正文

网站建设服务宗旨苏州工业园区外国语学校

网站建设服务宗旨,苏州工业园区外国语学校,wordpress woo,进贤城乡规划建设局网站《STM32F103_LL库寄存器学习笔记02 - 开启SysTick(滴答定时器)》中断上一章节完成SysTick中断。接着,开始梳理大家肯定逃不过的外设GPIO。 首先,先梳理一下LL库怎样去设置GPIO的模式,读取GPIO的电平的状态。 项目地址…

《STM32F103_LL库+寄存器学习笔记02 - 开启SysTick(滴答定时器)》中断上一章节完成SysTick中断。接着,开始梳理大家肯定逃不过的外设GPIO。
首先,先梳理一下LL库怎样去设置GPIO的模式,读取GPIO的电平的状态。

项目地址:https://github.com/q164129345/MCU_Develop/tree/main/stm32f103_ll_library03_gpio_input

一、CubeMX


在这里插入图片描述
在这里插入图片描述
如上所示,使用CubeMX设置PB4为输入模式,Pull-up(上拉)。

二、代码


2.1、MX_GPIO_Init()

在这里插入图片描述
如上所示,使用外设之前记得先打开对应的时钟。 LL库函数LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOB)的目的是打开GPIOB的时钟。然后,使用结构体LL_GPIO_InitTypeDef来填写GPIO的功能,然后调用LL_GPIO_Init()进行GPIO初始化。
在这里插入图片描述
如上所示,结构体LL_GPIO_InitTypeDef定义了5个结构体成员,通过这5个成员的组合,配置GPIO的工作模式。
为了实现抽象,方便使用结构体来设置GPIO的各个模式,函数LL_GPIO_Init()的定义相当复杂,如下所示:

ErrorStatus LL_GPIO_Init(GPIO_TypeDef *GPIOx, LL_GPIO_InitTypeDef *GPIO_InitStruct)
{uint32_t pinmask;uint32_t pinpos;uint32_t currentpin;/* Check the parameters */assert_param(IS_GPIO_ALL_INSTANCE(GPIOx));assert_param(IS_LL_GPIO_PIN(GPIO_InitStruct->Pin));/* ------------------------- Configure the port pins ---------------- *//* Initialize  pinpos on first pin set */pinmask = ((GPIO_InitStruct->Pin) << GPIO_PIN_MASK_POS) >> GPIO_PIN_NB;pinpos = POSITION_VAL(pinmask);/* Configure the port pins */while ((pinmask  >> pinpos) != 0u){/* skip if bit is not set */if ((pinmask & (1u << pinpos)) != 0u){/* Get current io position */if (pinpos < GPIO_PIN_MASK_POS){currentpin = (0x00000101uL << pinpos);}else{currentpin = ((0x00010001u << (pinpos - GPIO_PIN_MASK_POS)) | 0x04000000u);}if (GPIO_InitStruct->Mode == LL_GPIO_MODE_INPUT){/* Check The Pull parameter */assert_param(IS_LL_GPIO_PULL(GPIO_InitStruct->Pull));/* Pull-up Pull-down resistor configuration*/LL_GPIO_SetPinPull(GPIOx, currentpin, GPIO_InitStruct->Pull);}/* Check Pin Mode parameters */assert_param(IS_LL_GPIO_MODE(GPIO_InitStruct->Mode));/* Pin Mode configuration */LL_GPIO_SetPinMode(GPIOx, currentpin, GPIO_InitStruct->Mode);if ((GPIO_InitStruct->Mode == LL_GPIO_MODE_OUTPUT) || (GPIO_InitStruct->Mode == LL_GPIO_MODE_ALTERNATE)){/* Check speed and Output mode parameters */assert_param(IS_LL_GPIO_SPEED(GPIO_InitStruct->Speed));assert_param(IS_LL_GPIO_OUTPUT_TYPE(GPIO_InitStruct->OutputType));/* Speed mode configuration */LL_GPIO_SetPinSpeed(GPIOx, currentpin, GPIO_InitStruct->Speed);/* Output mode configuration*/LL_GPIO_SetPinOutputType(GPIOx, currentpin, GPIO_InitStruct->OutputType);}}pinpos++;}return (SUCCESS);
}

2.2、读取GPIO的电平状态LL_GPIO_IsInputPinSet()

通过2.1章节的函数MX_GPIO_Init()对PB4进行初始化后,接着可以通过函数LL_GPIO_IsInputPinSet()来获取当前PB4是高电平还是低电平。
在这里插入图片描述
在这里插入图片描述
如上图所示,pinStatus刚开始等于1,因为PB4的初始状态是上拉。当我将PB4连接到GND,pinStatus变成0。当我再一次将PB4与GND断开,pinStatus又变回1。

2.3、通过LL库设置GPIO输入模式的另外一种方法

在这里插入图片描述
如上所示,通过函数LL_GPIO_SetPinMode()与函数LL_GPIO_SetPinPull()就能完成GPIO的输入模式配置。

三、寄存器梳理


3.1、GPIOB的RCC时钟

在这里插入图片描述
如上所示,从《STM32F1参考手册》的章节2.1-系统结构的系统结构看到,外设GPIOB的时钟源来自APB2。
在这里插入图片描述
在这里插入图片描述
如上所示,《STM32F1参考手册》的章节6.3.7,将外设RCC的寄存器ARB2ENR的bit3置1,即打开GPIOB的时钟。

RCC->APB2ENR |= 0x01UL << 3UL; // 使能GPIOB的时钟
// RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; //两种方法等效的

3.2、GPIO相关寄存器

3.2.1、GPIOx_CRL

在这里插入图片描述
如上所示,《STM32F1参考手册》的章节8.2.1,首先要配置GPIO的寄存器CRL(PB0~PB7)或者CRH(PB8~PB15)。比如PB4要设置段MODE4 = 00(输入模式),段CNF4 = 10(上拉/下拉输入模式)。

GPIOB->CRL &= ~(0xF << 16UL); // 清除段CNF4与段MODE4
GPIOB->CRL |= 0x08 << 16UL;   // 设置段CNF4 = 10,段MODE4 = 00
// 或者使用LL库提供的宏MODIFY_REG(),考虑到原子性的话,优先使用MODIFY_REG()
// MODIFY_REG(GPIOB->CRL, 0x0F << 16UL, 0x08 << 16UL); 

3.2.2、GPIOx_ODR

在这里插入图片描述
如上所示,《STM32F1参考手册》的章节8.2.4,寄存器ODR对应的位置1相当于上拉,置0相当于下拉。

GPIOB->ODR |= (0x01 << 4UL); // 置1相当于上拉
GPIOB->ODR &= ~(0x01 << 4UL); // 置0相当于下拉

3.2.3、PB4输入模式,上拉

// 假设已经使能GPIOB的时钟
MODIFY_REG(GPIOB->CRL, 0x0F << 16UL, 0x08 << 16UL); // PB4输入模式、上拉/下拉输入模式
SET_BIT(GPIOB->ODR, 0x01 << 4UL); // 上拉 , 等效GPIOB->ODR |= (0x01 << 4UL)

通过上面两句代码,让PB4设置输入模式,且上拉。

3.2.4、读取PB4的电平状态(GPIOB_IDR)

在这里插入图片描述
如上所示,《STM32F1中文参考手册》的章节8.2.3,寄存器IDR4对应的是PB4的电平状态。IDR4 = 1相当于PB4高电平,IDR4 = 0相当于PB4低电平。

if(GPIOB->IDR & (0x01 << 4UL)) {// PB4为高电平
} else {// PB4为低电平
}// 等效实现方式
if (READ_BIT(GPIOB->IDR, 0x01 << 4UL)) {// PB4为高电平
} else {// PB4为低电平
}

四、寄存器方式的实现


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如上所示,测试效果一直。
在这里插入图片描述
如上所示,通过debug模式的寄存器状态看到,寄存器GPIOB_CRL的MODE4 = 0x00(输入模式)与CNF4 = 0x02(上拉/下拉的输入模式)。

http://www.dtcms.com/wzjs/546904.html

相关文章:

  • 企业设计网站公司排名wordpress文本自动分页
  • 外汇网站怎么做优外汇网站深圳广告公司名录
  • 关于珠海网站建设的优势个人建网站允许吗
  • 网站建设的竞争力平面设计模板
  • 网站开发中遇到哪些问题怎么做网站海报
  • 网站建设合同模板优秀网站设计流程
  • 确保网站地址没有做301跳转微信小程序怎么做?
  • 外贸建站哪好营销策划公司是干什么的
  • 给公司做网站的费用入什么科目wordpress七牛
  • 寿光网站建设公司管理咨询师考试
  • 网站关键词优化ico网站图标
  • 房地产开发公司是做什么的济南网络优化公司
  • 重庆长寿网站建设网站前端开发流程
  • 有哪些育儿类网站做的比较好衡水网站建设在哪里
  • 免费找客户网站低价网站建设推广优化
  • 上海网站开发技术最好公司电话wordpress信用卡支付宝
  • 莱阳网站制作网站开发德菁
  • 网站进度条特效忽悠别人做商城网站
  • 理解电子商务网站建设与管理flask做网站工具
  • 河北省建设执业资格中心网站怎样让网站被百度收录
  • 仿qq商城版淘宝客网站源码模板+带程序后台文章dede织梦企业程序网站建设 主要学是么
  • 做网站需要去哪里备案老薛主机wordpress设置
  • 做社区网站用什么程序平台优化
  • 孝感个人网站建设游戏app软件开发多少钱
  • 万网网站备案产品验证未找到该域名授权信息深圳罗湖网站设计
  • 手机怎么建自己的网站百度投稿平台
  • 网站服务器规划 用户数网站开发用什么架构
  • 中企建网站有模板怎么建站
  • 培训机构网站建设要求大连网站建设网站建设
  • 哪家网站做旅游攻略好鹰潭网站建设公司