1.数据通信:
信道也可以理解为单片机内的数据通信线
分辨的方式是看有没有时钟线
2.串口
3.USART介绍(一个外设)
首先和GPIO的区别,GPIO和设备之间也就传输个高低电平,而USART这种串口通信可以使设备之间通信码元
查看STM32上某个外设的数量及其引脚(在参考手册引脚定义/选型手册
5.USART框图
6.串口HAL库中断回调机制:
7.通信常见问题:IO引脚复用
解决冲突的办法--重映射:这里PA8如果已经配置了UART1的通道,就不能在配置TIM1会造成冲突,这里就能用重映射(重定义)的方法,将TIM1重映射到PE9,就解决了不能同时使用UART1和TIM1两个外设的问题
8.串口发送接收字符串实验:
首先常见位操作可节省CPU资源:
、
接收函数主要写在中断回调里,发送函数主要写在主函数里
uint8_t rx_buf[200];//接收数组
uint8_t rx_buffer[1];//缓冲接收数组,每次接收一个字符
uint16_t rx_flag=0;//16位状态变量,bit0-13接收数据,bit14判断回车,bit15判断换行置1标志接收完成
void USART_UX_IRQHandler()//串口中断服务函数
{
hal_uart_IRQHandler(&句柄)//串口中断公共处理函数
HAL_UART_Receive_IT(&huart1,(uint8_t*)rx_buffer,1)//打开接收中断,这个也可以写在下面的回调函数里
}
void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->instance==usart1)
{
if((rx_flag&0x8000)==0)//如果接收未完成
{
//因为电脑串口发送给单片机的字符串最后有/r/n
if(rx_flag&0x4000)//判断回车标志位--是否接收到回车/r-0x0d
{
if(buffer[0]!=0x0a)//介绍到回车后判断是否接收到换行/n-0x0a
{
rx_flag=0;//收不到换行,接受错误
}
else
{
rx_flag|=0x8000;//收到换行,一个“字符串”接收完成
}
}
else//判断没收到回车
{
if(buffer[0]==0x0d) rx_flag|=0x4000;//如果收到回车0x0d将回车标志位置1
else
{
rx_buf[rx_flag&0x3fff]=rx_buffer[0];
rx_flag++;
//因为rx_buf是uint8_t类型数组,所以这里的意思是每接收一个字符rx_flag++;
if(rx_flag>200-1)//rx_buffer[200],一次性最多接收200个字节,超过就重发
{
rx_flag=0;//接收数据错误,重新接收
}
}
}
}
}
}
//发送或者数据处理函数
int main()
{
while (1)
{
if(rx_flag&0x8000)//判断是否接收完成
{
len=rx_flag & 0x3fff;//获取数据长度;
HAL_UART_TRANSMIT(&uart1,(uint8_t*)rx_buf,len,1000);//1000是发送时间
while (HAL_UART_GET_FLAG(&uart1,uart_flag_TC)!=SET);//用GEI_FLAG函数,等待TC标志位=1
printf("\r\n");
rx_flag=0;//清零状态位
}
else
{
time++;
if(times%5000==0)//意识是延时了5000次,每次延时10ms
{
//任意执行
}
if(times%200==0)
{
//fun();
}
delay_ms(10);//这里的意识是time用于计算延时时间,time加一次,延时一次
}
}
}