串口通信
cubemx配置
打开串口通信,并配置波特率为9600
打开串口中断
重定义串口接收与发送引脚,默认是PC4,PC5,需要改为PA9与PA10
串口通信程序设计
串口变量
uchar dat; //串口接收的一个字符
char rx_buf[20]; //存放串口接收的字符串buf
uchar rx_idx; //串口接收的下标索引
char send_buf[20]; //串口发送数据buf
main.c中 初始化串口接收中断
HAL_UART_Receive_IT(&huart1,&dat,1);
串口中断服务函数的声明
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
该函数具体形式也不用记忆,在usart.c下面的stm32g4xx_hal_uart.h最后的倒数第三板块的第五个函数,该函数也是个若定义函数,在user.c中重新定义改写,用于接收串口数据即可
串口中断服务函数的重定义
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
rx_buf[rx_idx++] = dat;
HAL_UART_Receive_IT(&huart1,&dat,1);
}
串口进程业务逻辑函数的调用
if(rx_idx > 0)
{
uchar temp = rx_idx;
HAL_Delay(1);
if(temp == rx_idx)
uart_process();
}
![](https://img-blog.csdnimg.cn/direct/b55a8707e7fe4b4fb4edcf0a3b5828c2.png)
串口进程业务逻辑函数的定义
void uart_process(void)
{
if(rx_idx > 0)
{
//将收到的数据发送给串口 保证发送接收的完整性
sprintf(send_buf,"%s\r\n",rx_buf);
HAL_UART_Transmit(&huart1,(uchar *)send_buf,strlen(send_buf),50);
/*************串口接收业务逻辑程序***********/
//清空数据
rx_idx = 0;
memset(rx_buf,0,20);
}
}
RTC时钟
cubemx配置
![](https://img-blog.csdnimg.cn/direct/cc17d9715bb6485e81dab502463ae8e1.png)
程序设计
定义时间和日期结构体全局变量
//定义时间和日期结构体变量
RTC_TimeTypeDef time;
RTC_DateTypeDef date;
获取日期与时间,日期与时间必须同时获取,否则会卡死
void rtc_process(void)
{
HAL_RTC_GetDate(&hrtc,&date,RTC_FORMAT_BIN);
HAL_RTC_GetTime(&hrtc,&time,RTC_FORMAT_BIN);
}
LCD显示日期与时间
u32 lcd_tick = 0;
void lcd_process(void)
{
//lcd周期为200ms
if(uwTick - lcd_tick < 200)
return;
lcd_tick = uwTick;
if(ui == 0) //第三个界面显示的内容
{
sprintf(text," Title3 ");
LCD_DisplayStringLine(Line1, (unsigned char *)text);
/****************************RTC实时时钟数据**************************/
sprintf(text," date:20%02d-%02d-%02d",date.Year,date.Month,date.Date);
LCD_DisplayStringLine(Line3, (unsigned char *)text);
sprintf(text," time:%02d:%02d:%02d",time.Hours,time.Minutes,time.Seconds);
LCD_DisplayStringLine(Line4, (unsigned char *)text);
}
}