[其他ST产品] STM32F1常用外设介绍

[复制链接]
 楼主| 范德萨发额 发表于 2023-2-28 17:36 | 显示全部楼层 |阅读模式
STM32学习笔记 GPIO配置步骤 步骤:
  • 第一步,使用RCC开启GPIO的时钟
  • 第二步,使用GPIO_Init()函数初始化GPIO
  • 第三步,使用输出或者输入的函数控制GPIO口

常用的RCC开启始终函数
  1. void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph,FunctionalState NewState);
  2. void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph,FunctionalState NewState);
  3. void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph,FunctionalState NewState);




评论

长篇3500字左右 ———————————————— 版权声明:本文为CSDN博主「计算机小混子」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/Johnor/article/details/128539267  发表于 2023-2-28 19:56
———————————————— 版权声明:本文为CSDN博主「计算机小混子」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/Johnor/article/details/128539267  发表于 2023-2-28 19:48
 楼主| 范德萨发额 发表于 2023-2-28 17:37 | 显示全部楼层
参数1:选择外设,参数2:使能或者失能
常用的GPIO函数
复位GPIO外设函数

  1. void GPIO_DeInit(GPIO_TypeDef* GPIOx);
 楼主| 范德萨发额 发表于 2023-2-28 17:37 | 显示全部楼层
复位AFIO外设函数
  1. void GPIO_AFIODeInit(void);
 楼主| 范德萨发额 发表于 2023-2-28 17:37 | 显示全部楼层
初始化GPIO口函数

用结构体的参数来初始化GPIO口,先定义一个结构体变量,然后把再给结构体赋值,最后调用此函数,函数内部会自动读取结构体的值,然后自动把外设的各个参数配置好

  1. void GPIO_Init(GPIO_TypeDef* GPIOx,GPIO_InitTypedef* GPIO_InitStruct);
 楼主| 范德萨发额 发表于 2023-2-28 19:23 | 显示全部楼层
给GPIO结构体变量赋一个默认值函数

  1. void GPIO_StructInit(GPIO_InitTypedef* GPIO_InitTypedef);
 楼主| 范德萨发额 发表于 2023-2-28 19:23 | 显示全部楼层
GPIO的输出函数
把制定的端口设置为高电平:函数
  1. void GPIO_SetBits(GPIO_InitTypedef* GPIOx,uint16_t GPIO_Pin);
 楼主| 范德萨发额 发表于 2023-2-28 19:24 | 显示全部楼层
把指定的端口设置为低电平
  1. void GPIO_ResetBits(GPIO_InitTypedef* GPIOx,uint16_t GPIO_Pin);
 楼主| 范德萨发额 发表于 2023-2-28 19:24 | 显示全部楼层
对根据第三个参数的值来设置电平
  1. void GPIO_WriteBit(GPIO_InitTypedef* GPIOx,uint16_t GPIO_Pin,BitAction BitVal);
 楼主| 范德萨发额 发表于 2023-2-28 19:24 | 显示全部楼层
对GPIOx 16个端口同时进行写入操作:
  1. void GPIO_Write(GPIO_InitTypedef* GPIOx,uint16_t PortVal);
 楼主| 范德萨发额 发表于 2023-2-28 19:24 | 显示全部楼层
在推挽输出模式下,高低电平都具有驱动能力,开漏输出模式的高电平是没有驱动能力的,开漏输出模式的低电平具有驱动能力

#define的新名字在左边,并且可以给任何变量换名字,而typedef只能给变量换名字,新名字在右边
 楼主| 范德萨发额 发表于 2023-2-28 19:24 | 显示全部楼层
GPIO的输入函数
读取输入数据寄存器某个端口的输入值,返回值是高低电平函数
  1. uint8_t GPIO_ReadInputDataBit(GPIO_InitTypedef* GPIOx,uint16_t GPIO_Pin);
 楼主| 范德萨发额 发表于 2023-2-28 19:25 | 显示全部楼层
读取GPIO的每一位的值,返回值是16位的数据,每一位代表一个端口值
  1. uint16_t GPIO_ReadInputData(GPIO_InitTypedef* GPIOx);
 楼主| 范德萨发额 发表于 2023-2-28 19:25 | 显示全部楼层
读取输出数据寄存器的某一位
  1. uint8_t GPIO_ReadOutputDataBit(GPIO_InitTypedef* GPIOx,uint16_t GPIO_Pin);
 楼主| 范德萨发额 发表于 2023-2-28 19:25 | 显示全部楼层
读取整个输出寄存器
  1. uint16_t GPIO_ReadOutputData(GPIO_InitTypedef* GPIOx);
 楼主| 范德萨发额 发表于 2023-2-28 19:25 | 显示全部楼层
程序示例
  1. void LED_Init(void)
  2. {
  3.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启GPIO时钟
  4.        
  5.         GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体
  6.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
  7.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;//打开的引脚
  8.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//配置响应速度
  9.         GPIO_Init(GPIOA, &GPIO_InitStructure);//写入参数
  10.        
  11.         GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);//置高电平
  12. }

  13. void LED1_ON(void)
  14. {
  15.         GPIO_ResetBits(GPIOA, GPIO_Pin_1);
  16. }

  17. void LED1_OFF(void)
  18. {
  19.         GPIO_SetBits(GPIOA, GPIO_Pin_1);
  20. }

  21. void LED1_Turn(void)
  22. {
  23.         if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0)//读取输出引脚的电平
  24.         {
  25.                 GPIO_SetBits(GPIOA, GPIO_Pin_1);
  26.         }
  27.         else
  28.         {
  29.                 GPIO_ResetBits(GPIOA, GPIO_Pin_1);//设置低电平
  30.         }
  31. }

  32. void LED2_ON(void)
  33. {
  34.         GPIO_ResetBits(GPIOA, GPIO_Pin_2);
  35. }

  36. void LED2_OFF(void)
  37. {
  38.         GPIO_SetBits(GPIOA, GPIO_Pin_2);
  39. }

  40. void LED2_Turn(void)
  41. {
  42.         if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) == 0)
  43.         {
  44.                 GPIO_SetBits(GPIOA, GPIO_Pin_2);
  45.         }
  46.         else
  47.         {
  48.                 GPIO_ResetBits(GPIOA, GPIO_Pin_2);
  49.         }
  50. }

 楼主| 范德萨发额 发表于 2023-2-28 19:26 | 显示全部楼层
中断

    中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行
 楼主| 范德萨发额 发表于 2023-2-28 19:26 | 显示全部楼层
中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源
 楼主| 范德萨发额 发表于 2023-2-28 19:26 | 显示全部楼层
中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前的中断程序,转而去处理新的中断程序,处理完后依次进行返回
 楼主| 范德萨发额 发表于 2023-2-28 19:26 | 显示全部楼层
NVIC:NVIC的中断优先级由优先级寄存器的4位(0~15)决定,这4位可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级
 楼主| 范德萨发额 发表于 2023-2-28 19:26 | 显示全部楼层
抢占优先级高的可以进行中断嵌套,响应优先级高的可以进行优先排队,抢占优先级和响应优先级均相同的按中断号排队
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

1011

帖子

2

粉丝

60

主题

1011

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部