当前位置: 代码网 > 科技>人工智能 > 【stm32】hal库学习笔记-UART/USART串口通信(超详细!)

【stm32】hal库学习笔记-UART/USART串口通信(超详细!)

2024年08月02日 人工智能 我要评论
(图片来自网络)

【stm32】hal库学习笔记-uart/usart串口通信

hal库驱动函数

在这里插入图片描述

在这里插入图片描述

cubemx图形化配置

导入lcd.ioc
rtc设置
在这里插入图片描述
时钟树配置
设置lse为rtc时钟源
在这里插入图片描述usart设置
在这里插入图片描述中断设置
在这里插入图片描述

程序编写

编写主函数

  /* user code begin 2 */
  lcd_init();
  lcd_show_str(10, 10, 16, "demo12_1:usart1-ch340", red);
  lcd_show_str(10, 30, 16, "please connect board with pc", red);
  lcd_show_str(10, 50, 16, "via miniusb line before power on", red);

  uint8_t hello1[] = "hello, blocking\n";
  hal_uart_transmit(&huart1, hello1, sizeof(hello1), 500);
  hal_delay(10);

  uint8_t hello2[] = "hello, none blocking\n";
  hal_uart_transmit_it(&huart1, hello2, sizeof(hello2));

  lcd_show_str(10, 90, 16, "received command string is: ", red);
  hal_uart_receive_it(&huart1, rxbuffer, rx_cmd_len);

  /* user code end 2 */

在rtc.c中重写回调函数

/* user code begin 1 */
void hal_rtcex_wakeuptimereventcallback(rtc_handletypedef *hrtc) {
	rtc_timetypedef stime;
	rtc_datetypedef sdate;
	if (hal_rtc_gettime(hrtc, &stime, rtc_format_bin) == hal_ok) {
		hal_rtc_getdate(hrtc, &sdate, rtc_format_bin);
		uint8_t timestr[20];
		sprintf(timestr, "%2d:%2d:%2d\n", stime.hours, stime.minutes, stime.seconds);
		lcd_show_str(30, 70, 16, timestr, black);
		if (isuploadtime) {
			hal_uart_transmit(&huart1, timestr, strlen(timestr), 200);
		}
	}
}
/* user code end 1 */

在usart.h文件中编写定义

/* user code begin private defines */
#define rx_cmd_len 5
extern uint8_t rxbuffer[];
extern uint8_t isuploadtime;
/* user code end private defines */

编写usart.c

/* user code begin 0 */
#include "rtc.h"
#include "lcd.h"
#include <string.h>

uint8_t probuffer[10] = "#s45;\n";
uint8_t rxbuffer[10] = "#h12;\n";
uint8_t rxcompleted = reset;
uint8_t isuploadtime = 1;
/* user code end 0 */
/* user code begin 1 */
void hal_uart_rxcpltcallback(uart_handletypedef *huart) {
	if (huart->instance == usart1) {
		rxcompleted = set;
		for (uint16_t i = 0; i < rx_cmd_len; i++) {
			probuffer[i] = rxbuffer[i];
			__hal_uart_enable_it(huart, uart_it_idle);
		}
	}
}

void on_uart_idle(uart_handletypedef *huart) {
	if (__hal_uart_get_flag(huart, uart_flag_idle) == reset) {
		return;
	}
	__hal_uart_clear_idleflag(huart);
	__hal_uart_disable_it(huart, uart_it_idle);
	if (rxcompleted) {
		hal_uart_transmit(huart, probuffer, strlen(probuffer), 100);
		hal_delay(10);
		updatertctime();
		lcd_show_str(30, 110, 16, probuffer, black);
		rxcompleted = reset;
		hal_uart_receive_it(huart, rxbuffer, rx_cmd_len);
	}
}

void updatertctime() {
	if (probuffer[0] != '#') {
		return;
	}
	uint8_t timesection = probuffer[1];
	uint8_t temp10 = probuffer[2] - '0';
	uint8_t temp1 = probuffer[3] - '0';
	uint8_t value = 10 * temp10 + temp1;
	if (timesection == 'u') {
		isuploadtime = value;
		return;
	}

	rtc_timetypedef stime;
	rtc_datetypedef sdate;
	if (hal_rtc_gettime(&hrtc, &stime, rtc_format_bin) == hal_ok) {
		hal_rtc_getdate(&hrtc, &sdate, rtc_format_bin);

		stime.daylightsaving = 0;
		stime.storeoperation = 0;

		if (timesection == 'h') {
			stime.hours = value;
		} else if (timesection == 'm') {
			stime.minutes = value;
		} else if (timesection == 's') {
			stime.seconds = value;
		}
		hal_rtc_settime(&hrtc, &stime, rtc_format_bin);
	}
}

/* user code end 1 */

实现效果

在这里插入图片描述
在这里插入图片描述

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com