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

[复制链接]
 楼主| 舒伯特玫瑰 发表于 2022-11-26 19:43 | 显示全部楼层 |阅读模式
继电器的描述
68156381fbea4c4e1.png

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


 楼主| 舒伯特玫瑰 发表于 2022-11-26 19:44 | 显示全部楼层
继电器的参数测试
以我们自己店铺的继电器模块为例,继电器触发电压高于某个值时,继电器就会被触发,触发灯亮起
这里实测时1.3V左右,实际触发电压最好2V以上,5.5V以下;
731686381fc2b1a45f.png
 楼主| 舒伯特玫瑰 发表于 2022-11-26 19:45 | 显示全部楼层
当触发信号低于某个值的时候,继电器就会复原,不会被触发,触发灯熄灭,这里实测时1V,不过实际触发信号建议低于0.5V;
759186381fc5557547.png
 楼主| 舒伯特玫瑰 发表于 2022-11-26 19:46 | 显示全部楼层
STM32F103寄存器版本控制IO口
1:程序现象
640366381fc7549165.png
2136381fc7ea1ddf.png
 楼主| 舒伯特玫瑰 发表于 2022-11-26 19:46 | 显示全部楼层
信号控制引脚是STM32F103RCT6的PA11引脚;
STM32控制继电器-寄存器版本
1.由STM32F10系列参考手册可知,GPIO的时钟使能是由APB2外设所控制的;
58216381fcace17a3.png
 楼主| 舒伯特玫瑰 发表于 2022-11-26 19:47 | 显示全部楼层
从上面的图可以看出,只需要把IOPA置为1,其他置为零,就可以打开GPIOA的使能,
2.然后是配置端口这里选为通用推挽输出,速度50MHZ;
560716381fcd0985f0.png
 楼主| 舒伯特玫瑰 发表于 2022-11-26 19:48 | 显示全部楼层
控制GPIOA11口输出;
612756381fd18aae2d.png
 楼主| 舒伯特玫瑰 发表于 2022-11-26 19:49 | 显示全部楼层
ODR11置为1就是输出高电平;
 楼主| 舒伯特玫瑰 发表于 2022-11-26 19:50 | 显示全部楼层
代码演示,

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

  3. int main(void)
  4. {
  5.         RCC->APB2ENR = 0x00000004;     //打开GPIOA使能
  6.         GPIOA->CRH = 0x00003000;       //配置PA11引脚为通用推挽输出模式
  7.         while(1)
  8.         {
  9.         GPIOA->ODR = 0x00000800;       //PA11输出高电平
  10.         Delay_ms(1000);
  11.         GPIOA->ODR = 0x00000000;       //PA11输出低电平
  12.         Delay_ms(1000);
  13.         }
  14. }
 楼主| 舒伯特玫瑰 发表于 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
        }
}
 楼主| 舒伯特玫瑰 发表于 2022-11-26 19:51 | 显示全部楼层
总结
1.寄存器版本和库函数版本代码现象是一样的;
2.IO口模式要配置为推挽输出模式,开漏输出模式无法驱动继电器;
3.本次使用的是5V继电器版本,供电需要用到5V,如果开发板没有5V 输入引脚,可以接额外电源供电,但是要把供电电源的地和单片机的地连起来;
abotomson 发表于 2023-3-4 12:35 | 显示全部楼层
用寄存器不好移植的吧。              
olivem55arlowe 发表于 2023-3-4 21:04 | 显示全部楼层
如果有驱动IO口,看看正点原子的设计。
febgxu 发表于 2023-3-4 21:36 | 显示全部楼层
有寄存器操作的教程吗?              
gygp 发表于 2023-3-5 10:23 | 显示全部楼层
库函数和寄存器和hal库可以一起使用吗
Stahan 发表于 2023-3-5 19:43 | 显示全部楼层
我也感觉用寄存器不好移植
ingramward 发表于 2023-3-7 14:07 | 显示全部楼层
用寄存器不好移植的吧。              
51xlf 发表于 2023-3-7 21:00 | 显示全部楼层
有寄存器操作的教程吗?              
wilhelmina2 发表于 2023-3-10 10:23 | 显示全部楼层
寄存器版本和库函数版本有什么区别吗
robertesth 发表于 2023-3-11 22:01 | 显示全部楼层
应该学寄存器好还是学库函数好               
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

266

帖子

2

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

53

主题

266

帖子

2

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