【蓝桥杯嵌入式】串口通信与RTC时钟
- 串口通信
- cubemx配置
- 串口通信程序设计
- RTC时钟
- cubemx配置
- 程序设计
串口通信
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();
}
串口进程业务逻辑函数的定义
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配置
程序设计
定义时间和日期结构体全局变量
//定义时间和日期结构体变量
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周期为200msif(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); }
}