【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 */
实现效果


发表评论