【蓝桥杯嵌入式】串口通信与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 < 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);

}

}

精彩内容

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。