STM32(HAL库)串行通信控制继电器

最近在学STM32 分享一下在学习过程的一个小制作

模块:

芯片型号:STM32F103C8T6 

继电器模块:

USB转TTL串口工具:

 

软件工具 :

编程软件:CUBEIDE(因为我这边还没有搞移植keil5就一直用这个了)

操作:

先启动我们的cubeide,选择NEW 再选择STM32 project

然后我们进行芯片选型,在上方输入框中输入我们使用的芯片,我这边使用的STM32F103C8T6

选择好我们的芯片型号我们给它取个名字

取好名字之后我们来到芯片界面

我们先进行时钟信号的设定,将RCC选到我们的外部时钟系统就会自动选择好我们的外部时钟引脚

SYS配置如下

这时候来到时钟界面将时钟频率调到72MHZ全速运行

现在我们进行输出引脚的设置,我们将PC13作为继电器输出引脚,因为继电器是高电平驱动所以我们将PC13引脚设置为低电平输出。

现在进行串行通信的设置,下方第一个参数为波特率我们自行修改。

这样我们的芯片配置就做好了 按下CTRL+s保存进入代码编辑界面

代码:
#include "main.h"
#include "string.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
uint8_t Receive_data[3];
uint8_t Returns_data[10]="relay1_RUN";
uint8_t Returns_data1[10]="relayl_OFF";
uint8_t Compare_data1[3]="RNR";
uint8_t Compare_data2[3]="OFF";

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
UART_HandleTypeDef huart1;

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);

/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

	 HAL_UART_Receive(&huart1, Receive_data, 3, 100);
	 if(strcmp((char*)Receive_data,(char*)Compare_data1)==0)
	 {
		 HAL_UART_Transmit(&huart1, Returns_data, 10, 100);
		 HAL_GPIO_WritePin(relay_out_GPIO_Port, relay_out_Pin, GPIO_PIN_SET);
		 Receive_data[0]='0';
	 }

	 if(strcmp((char*)Receive_data,(char*)Compare_data2)==0)
	 	 {
	 		 HAL_UART_Transmit(&huart1, Returns_data1, 10, 100);
	 		 HAL_GPIO_WritePin(relay_out_GPIO_Port, relay_out_Pin, GPIO_PIN_RESET);
	 		Receive_data[0]='0';
	 	 }
  }
  /* USER CODE END 3 */
}
具体现象:

我们先进行线路连接:

使用USB转TTL串口工具与单片机进行连接:

继电器的连接就是正极接入5v 负极接地,信号线接入PC13进行控制。

现在我们插入电脑开始通信,启动我们的串口调试助手,波特率选择115200;编码格式选择UTF-8

发送”RNR“单片机返回relay1_RUN:

继电器吸合:

发送”OFF“单片机返回relayl_OFF,继电器断开:

这样基于HAL库的STM32的串行通信控制继电器就做好了,因为是第一次发博客,很多地方都没有注意到,希望各位大佬们多多包涵谢谢大家,如果有兴趣可以一起交流。(^ω^) 

  • 8
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
首先,你需要确定 stm32 的型号和使用的开发板。然后,你需要打开 HAL 库并在你的代码中包含头文件。接着,你需要配置 GPIO 为输出模式,以控制继电器。最后,你需要初始化 PWM 并将其连接到 GPIO 来控制继电器。 以下是基本的代码示例: ```c #include "stm32f4xx_hal.h" // 定义 GPIO 引脚和 PWM 引脚 #define RELAY_PIN GPIO_PIN_0 #define RELAY_PORT GPIOA #define PWM_PIN GPIO_PIN_1 #define PWM_PORT GPIOA #define PWM_TIMER TIM2 // 定义 PWM 配置结构体 TIM_HandleTypeDef htim_pwm; TIM_OC_InitTypeDef sConfigPWM; // 初始化 GPIO 和 PWM void init_relay() { // 初始化 GPIO GPIO_InitTypeDef GPIO_InitStruct; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = RELAY_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(RELAY_PORT, &GPIO_InitStruct); // 初始化 PWM __HAL_RCC_TIM2_CLK_ENABLE(); htim_pwm.Instance = PWM_TIMER; htim_pwm.Init.Prescaler = 0; htim_pwm.Init.CounterMode = TIM_COUNTERMODE_UP; htim_pwm.Init.Period = 1000; htim_pwm.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(&htim_pwm); sConfigPWM.OCMode = TIM_OCMODE_PWM1; sConfigPWM.Pulse = 500; sConfigPWM.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigPWM.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim_pwm, &sConfigPWM, PWM_PIN); HAL_TIM_PWM_Start(&htim_pwm, PWM_PIN); } // 控制继电器 void set_relay(int state) { if (state) { HAL_GPIO_WritePin(RELAY_PORT, RELAY_PIN, GPIO_PIN_SET); } else { HAL_GPIO_WritePin(RELAY_PORT, RELAY_PIN, GPIO_PIN_RESET); } } ``` 在上面的代码中,我们使用了 GPIOA 引脚 0 来控制继电器,使用了 GPIOA 引脚 1 来连接 PWM,并使用了 TIM2 定时器来实现 PWM。在 `init_relay()` 函数中,我们初始化了 GPIO 和 PWM。在 `set_relay()` 函数中,我们根据传入的 `state` 值来控制继电器的开关状态。 你可以根据自己的项目需求进行修改。希望这能帮到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值