附上我的工程链接
链接:https://pan.baidu.com/s/1-WNduviH-wgYQeL-dgM4wA?pwd=f0uh?
提取码:f0uh
1. 配置stm32cubemx
? ? ? ? 1.1rcc时钟配置
????????
? ? ? ? 1.2? 下载器配置
? ? ? ? 1.3 USART1配置
? ? ? ? 1.3 时钟树配置
? ? ? ? 要选择外部晶振的话,切记一定要是24Mhz的晶振,要不然串口打印的时候会乱码!!!
? ? ? ? 1.4 其他项配置
配置完电机generate code,之后打开keil工程。
2. keil代码
? ? ? ? 2.1??首先找到stm32g4xx_it.c,在最后面编写
char rxdata[30];
uint8_t rxdat;
unsigned char rx_pointer;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *hurat){
rxdata[rx_pointer++] = rxdat;
HAL_UART_Receive_IT(&huart1,&rxdat,1);
}
? ? ? ? 2.2 在main函数里声明外部变量
????????这里的car_xxxx是存放我们串口一次性要发送的数据
uint8_t ucLcd[21];
char car_type[5];
char car_data[5];
char car_time[13];
extern char rxdata[30];
extern uint8_t rxdat;
extern unsigned char rx_pointer;
? ? ? ? 2.3 定义一个函数
? ? ? ? 这个函数是接收函数。
void UART_Receice_Proc(void){
if (rx_pointer > 0){
if (rx_pointer == 6){
sscanf(rxdata,"%2s:%1s:%1s",car_type,car_data,car_time);
printf("yes");
}
else{
UART_Transmit((uint8_t *)"Error\r\n",sizeof("Error\r\n"));
}
}
rx_pointer = 0;
memset(rxdata,0,30);
}
? ? ? ? 2.4 在while(1)中调用你这个函数、
????????这些判断是为了更加精确的判断是否接收到了数据,最好加上,因为我没这些代码的时候,串口接受十分的不灵敏。估计是串口接收的太快,毕竟是异步通信,没有统一的时序。
if(rx_pointer > 0)
{
int temp = rx_pointer;
HAL_Delay(1);
if(temp == rx_pointer)
UART_Receice_Proc();
}
? ? ? ? 2.5 开启中断
????????之后配置好后,你也可以配置lcd显示在屏幕上,但是注意一点,LCD初始化一定要在一大堆的初始化后面。要不然会出现接受不到的现象。
HAL_UART_Receive_IT(&huart1,&rxdat,1);
?3. 效果