打印
[其他ST产品]

STM32F1常用外设介绍

[复制链接]
5888|301
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
范德萨发额|  楼主 | 2023-2-28 17:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32学习笔记 GPIO配置步骤 步骤:
  • 第一步,使用RCC开启GPIO的时钟
  • 第二步,使用GPIO_Init()函数初始化GPIO
  • 第三步,使用输出或者输入的函数控制GPIO口

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




使用特权

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

void GPIO_DeInit(GPIO_TypeDef* GPIOx);

使用特权

评论回复
板凳
范德萨发额|  楼主 | 2023-2-28 17:37 | 只看该作者
复位AFIO外设函数
void GPIO_AFIODeInit(void);

使用特权

评论回复
地板
范德萨发额|  楼主 | 2023-2-28 17:37 | 只看该作者
初始化GPIO口函数

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

void GPIO_Init(GPIO_TypeDef* GPIOx,GPIO_InitTypedef* GPIO_InitStruct);

使用特权

评论回复
5
范德萨发额|  楼主 | 2023-2-28 19:23 | 只看该作者
给GPIO结构体变量赋一个默认值函数

void GPIO_StructInit(GPIO_InitTypedef* GPIO_InitTypedef);

使用特权

评论回复
6
范德萨发额|  楼主 | 2023-2-28 19:23 | 只看该作者
GPIO的输出函数
把制定的端口设置为高电平:函数
void GPIO_SetBits(GPIO_InitTypedef* GPIOx,uint16_t GPIO_Pin);

使用特权

评论回复
7
范德萨发额|  楼主 | 2023-2-28 19:24 | 只看该作者
把指定的端口设置为低电平
void GPIO_ResetBits(GPIO_InitTypedef* GPIOx,uint16_t GPIO_Pin);

使用特权

评论回复
8
范德萨发额|  楼主 | 2023-2-28 19:24 | 只看该作者
对根据第三个参数的值来设置电平
void GPIO_WriteBit(GPIO_InitTypedef* GPIOx,uint16_t GPIO_Pin,BitAction BitVal);

使用特权

评论回复
9
范德萨发额|  楼主 | 2023-2-28 19:24 | 只看该作者
对GPIOx 16个端口同时进行写入操作:
void GPIO_Write(GPIO_InitTypedef* GPIOx,uint16_t PortVal);

使用特权

评论回复
10
范德萨发额|  楼主 | 2023-2-28 19:24 | 只看该作者
在推挽输出模式下,高低电平都具有驱动能力,开漏输出模式的高电平是没有驱动能力的,开漏输出模式的低电平具有驱动能力

#define的新名字在左边,并且可以给任何变量换名字,而typedef只能给变量换名字,新名字在右边

使用特权

评论回复
11
范德萨发额|  楼主 | 2023-2-28 19:24 | 只看该作者
GPIO的输入函数
读取输入数据寄存器某个端口的输入值,返回值是高低电平函数
uint8_t GPIO_ReadInputDataBit(GPIO_InitTypedef* GPIOx,uint16_t GPIO_Pin);

使用特权

评论回复
12
范德萨发额|  楼主 | 2023-2-28 19:25 | 只看该作者
读取GPIO的每一位的值,返回值是16位的数据,每一位代表一个端口值
uint16_t GPIO_ReadInputData(GPIO_InitTypedef* GPIOx);

使用特权

评论回复
13
范德萨发额|  楼主 | 2023-2-28 19:25 | 只看该作者
读取输出数据寄存器的某一位
uint8_t GPIO_ReadOutputDataBit(GPIO_InitTypedef* GPIOx,uint16_t GPIO_Pin);

使用特权

评论回复
14
范德萨发额|  楼主 | 2023-2-28 19:25 | 只看该作者
读取整个输出寄存器
uint16_t GPIO_ReadOutputData(GPIO_InitTypedef* GPIOx);

使用特权

评论回复
15
范德萨发额|  楼主 | 2023-2-28 19:25 | 只看该作者
程序示例
void LED_Init(void)
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启GPIO时钟
       
        GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;//打开的引脚
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//配置响应速度
        GPIO_Init(GPIOA, &GPIO_InitStructure);//写入参数
       
        GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);//置高电平
}

void LED1_ON(void)
{
        GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}

void LED1_OFF(void)
{
        GPIO_SetBits(GPIOA, GPIO_Pin_1);
}

void LED1_Turn(void)
{
        if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0)//读取输出引脚的电平
        {
                GPIO_SetBits(GPIOA, GPIO_Pin_1);
        }
        else
        {
                GPIO_ResetBits(GPIOA, GPIO_Pin_1);//设置低电平
        }
}

void LED2_ON(void)
{
        GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}

void LED2_OFF(void)
{
        GPIO_SetBits(GPIOA, GPIO_Pin_2);
}

void LED2_Turn(void)
{
        if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) == 0)
        {
                GPIO_SetBits(GPIOA, GPIO_Pin_2);
        }
        else
        {
                GPIO_ResetBits(GPIOA, GPIO_Pin_2);
        }
}

使用特权

评论回复
16
范德萨发额|  楼主 | 2023-2-28 19:26 | 只看该作者
中断

    中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行

使用特权

评论回复
17
范德萨发额|  楼主 | 2023-2-28 19:26 | 只看该作者
中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源

使用特权

评论回复
18
范德萨发额|  楼主 | 2023-2-28 19:26 | 只看该作者
中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前的中断程序,转而去处理新的中断程序,处理完后依次进行返回

使用特权

评论回复
19
范德萨发额|  楼主 | 2023-2-28 19:26 | 只看该作者
NVIC:NVIC的中断优先级由优先级寄存器的4位(0~15)决定,这4位可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级

使用特权

评论回复
20
范德萨发额|  楼主 | 2023-2-28 19:26 | 只看该作者
抢占优先级高的可以进行中断嵌套,响应优先级高的可以进行优先排队,抢占优先级和响应优先级均相同的按中断号排队

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

52

主题

935

帖子

2

粉丝