【蓝桥杯嵌入式】串口通信与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周期为200ms if(uwTick - lcd_tick