深圳正规做网站的公司,电子商务网站建设的总体目标,网站建设客户案例,网站同城在线哪里做【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-CH340lcd_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.huint8_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 */实现效果