打印
[STM32F3]

STM32驱动继电器 STM32F103RCT6基于寄存器和库函数驱动IO口

[复制链接]
719|71
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
继电器的描述


继电器是一种小电压控制大电压器件,输入端是一个开关,不会有输出电压,具体的接线方式是要看自己如何利用这个开关;
继电器具体的工作原理可以参考之前的文章“51单片机驱动继电器模块点灯”


使用特权

评论回复
沙发
舒伯特玫瑰|  楼主 | 2022-11-26 19:44 | 只看该作者
继电器的参数测试
以我们自己店铺的继电器模块为例,继电器触发电压高于某个值时,继电器就会被触发,触发灯亮起
这里实测时1.3V左右,实际触发电压最好2V以上,5.5V以下;

使用特权

评论回复
板凳
舒伯特玫瑰|  楼主 | 2022-11-26 19:45 | 只看该作者
当触发信号低于某个值的时候,继电器就会复原,不会被触发,触发灯熄灭,这里实测时1V,不过实际触发信号建议低于0.5V;

使用特权

评论回复
地板
舒伯特玫瑰|  楼主 | 2022-11-26 19:46 | 只看该作者
STM32F103寄存器版本控制IO口
1:程序现象

使用特权

评论回复
5
舒伯特玫瑰|  楼主 | 2022-11-26 19:46 | 只看该作者
信号控制引脚是STM32F103RCT6的PA11引脚;
STM32控制继电器-寄存器版本
1.由STM32F10系列参考手册可知,GPIO的时钟使能是由APB2外设所控制的;

使用特权

评论回复
6
舒伯特玫瑰|  楼主 | 2022-11-26 19:47 | 只看该作者
从上面的图可以看出,只需要把IOPA置为1,其他置为零,就可以打开GPIOA的使能,
2.然后是配置端口这里选为通用推挽输出,速度50MHZ;

使用特权

评论回复
7
舒伯特玫瑰|  楼主 | 2022-11-26 19:48 | 只看该作者
控制GPIOA11口输出;

使用特权

评论回复
8
舒伯特玫瑰|  楼主 | 2022-11-26 19:49 | 只看该作者
ODR11置为1就是输出高电平;

使用特权

评论回复
9
舒伯特玫瑰|  楼主 | 2022-11-26 19:50 | 只看该作者
代码演示,

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

int main(void)
{
        RCC->APB2ENR = 0x00000004;     //打开GPIOA使能
        GPIOA->CRH = 0x00003000;       //配置PA11引脚为通用推挽输出模式
        while(1)
        {
        GPIOA->ODR = 0x00000800;       //PA11输出高电平
        Delay_ms(1000);
        GPIOA->ODR = 0x00000000;       //PA11输出低电平
        Delay_ms(1000);
        }
}

使用特权

评论回复
10
舒伯特玫瑰|  楼主 | 2022-11-26 19:51 | 只看该作者
STM32控制继电器-库函数版本
库函数是已经把寄存器都包装好了,我们直接使用即可;
主要代码:
#include "stm32f10x.h"                  // Device header
#include "Delay.h"

int main(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;                        //定义结构体
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);                //配置GPIOA外设时钟
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                        //配置GPIOA为通用推挽输出
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;                                        //配置对应的端口
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                        //配置好速度
        GPIO_Init(GPIOA,&GPIO_InitStructure);                                                //传递结构体的位置
        while(1)
        {
        GPIO_SetBits(GPIOA,GPIO_Pin_11);                //端口设置为高电平
        Delay_ms(1000);                        //延时1s
        GPIO_ResetBits(GPIOA,GPIO_Pin_11);                //端口设置为低电平
        Delay_ms(1000);                        //延时1s
        }
}

使用特权

评论回复
11
舒伯特玫瑰|  楼主 | 2022-11-26 19:51 | 只看该作者
总结
1.寄存器版本和库函数版本代码现象是一样的;
2.IO口模式要配置为推挽输出模式,开漏输出模式无法驱动继电器;
3.本次使用的是5V继电器版本,供电需要用到5V,如果开发板没有5V 输入引脚,可以接额外电源供电,但是要把供电电源的地和单片机的地连起来;

使用特权

评论回复
12
abotomson| | 2023-3-4 12:35 | 只看该作者
用寄存器不好移植的吧。              

使用特权

评论回复
13
olivem55arlowe| | 2023-3-4 21:04 | 只看该作者
如果有驱动IO口,看看正点原子的设计。

使用特权

评论回复
14
febgxu| | 2023-3-4 21:36 | 只看该作者
有寄存器操作的教程吗?              

使用特权

评论回复
15
gygp| | 2023-3-5 10:23 | 只看该作者
库函数和寄存器和hal库可以一起使用吗

使用特权

评论回复
16
Stahan| | 2023-3-5 19:43 | 只看该作者
我也感觉用寄存器不好移植

使用特权

评论回复
17
ingramward| | 2023-3-7 14:07 | 只看该作者
用寄存器不好移植的吧。              

使用特权

评论回复
18
51xlf| | 2023-3-7 21:00 | 只看该作者
有寄存器操作的教程吗?              

使用特权

评论回复
19
wilhelmina2| | 2023-3-10 10:23 | 只看该作者
寄存器版本和库函数版本有什么区别吗

使用特权

评论回复
20
robertesth| | 2023-3-11 22:01 | 只看该作者
应该学寄存器好还是学库函数好               

使用特权

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

本版积分规则

39

主题

227

帖子

2

粉丝