STM32-----串口

本文详细介绍了STM32中的USART通信,包括串口概念、GPIO与USART的区别、USART框图、HAL库中断回调机制以及串口发送接收字符串实验。重点讨论了如何处理GPIO引脚复用冲突,如通过重映射功能解决USART和TIM1的并发问题。
摘要由CSDN通过智能技术生成

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加一次,延时一次
        }
    }  

}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值