单片机
返回首页

STM32串口3 映射和完全重映射 PB10 PB11 / PD8 PD9 / PC10 PC11

2024-09-30 来源:cnblogs

STM32F103共有五个串口,有时候在项目中,其他的引脚已经配置用了,重新改太麻烦



STM32串口3 映射和完全重映射 PB10 PB11 PD8 PD9  PC10 PC11



所有本次实验 使用了串口3的映射端口,配置和普通的类似 



只是注意要使用映射使能说明


GPIO_PinRemapConfig(GPIO_FullRemap_USART3  , ENABLE); 

点击(此处)折叠或打开


void USART3_Configuration(u32 bound)

{

  //GPIO端口设置

  GPIO_InitTypeDef GPIO_InitStructure;

    USART_InitTypeDef USART_InitStructure;

    NVIC_InitTypeDef NVIC_InitStructure;

    

 #if 1

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE); //remap时钟|RCC_APB2Periph_AFIO //开启GPIOB时钟

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);//这里要分开打开 //USART3时钟 来自APB1

#endif

    

#if 0

    

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIOB和USART3时钟

    

        //USART3_TX GPIOB.10

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出

    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOA.10

    

    //USART3_RX     GPIOB.11初始化

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB11

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.11

    

#endif    

    

 

#if 0    //重映射

 

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE); //remap时钟|RCC_APB2Periph_AFIO //开启GPIOB时钟

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);//这里要分开打开 //USART3时钟 来自APB1

    

    //GPIO_PartialRemap_USART3 部分重映射 GPIOC_10 GPIOC_11

    

    GPIO_PinRemapConfig(GPIO_PartialRemap_USART3,ENABLE);

    //USART3_TX GPIOC.10

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出

  GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化

   

  //USART3_RX     GPIOC.11初始化

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

  GPIO_Init(GPIOC, &GPIO_InitStructure);//初始

#endif

 

 

#if 1

 

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE); //remap时钟|RCC_APB2Periph_AFIO //开启GPIOB时钟

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);//这里要分开打开 //USART3时钟 来自APB1

 

     //GPIO_FullRemap_USART3 完全重映射 D8 D9

     GPIO_PinRemapConfig(GPIO_FullRemap_USART3,ENABLE);

    //USART3_TX GPIOD8

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出

  GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化

   

  //USART3_RX     GPIOD9

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

  GPIO_Init(GPIOD, &GPIO_InitStructure);//初始

#endif

 

 

  //Usart3 NVIC 配置

  NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//抢占优先级3

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;        //子优先级3

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能

    NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器

  

   //USART 初始化设置

 

    USART_InitStructure.USART_BaudRate = bound;//串口波特率

    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式

    USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位

    USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位

    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制

    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //收发模式

 

  USART_Init(USART3, &USART_InitStructure); //初始化串口3

  USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启串口接受中断

  USART_Cmd(USART3, ENABLE); //使能串口3

 

}


点击(此处)折叠或打开


#include 'sys.h'

#include 'usart.h'

#include 'timer.h'

#include 'stdint.h'

 u8     checkdata[8];        //检测串口1接收的特定数据数据

//发送上位机的数据

//

uint32_t crc16_data1[] = { 0x00,0x00, 0x00 };//饮水机数据

uint32_t crc16_data2[] = { 0x00,0x00, 0x00 };//

uint32_t crc16_data3[] = { 0x00,0x00, 0x00 };//

uint32_t crc16_data4[] = { 0x00,0x00, 0x00 };//

uint32_t crc16_data5[] = { 0x00,0x00, 0x00 };//

uint32_t crc16_data6[] = { 0x00,0x00, 0x00 };//

uint32_t crc16_data7[] = { 0x00,0x00, 0x00 };//

uint32_t crc16_data8[] = { 0x00,0x00, 0x00 };//

uint32_t crc16_data9[] = { 0x00,0x00, 0x00 };//

uint32_t crc16_data10[]= { 0x00,0x00, 0x00 };//

 

 

//串口1队列定义

u8     UART1SendBuff[UART1BuffSize];        //发送数据

u8     UART1ReceBuff[UART1BuffSize];        //接收数据?

u16 UART1ReceIn = 0;//接收状态标记数据位    

u8 UART1ReceFullFlag = 0;//接收完数据标志位

 

 

//串口3队列定义

u8     UART3SendBuff[UART3BuffSize];        //发送数据

u8     UART3ReceBuff[UART3BuffSize];        //接收数据?

u16 UART3ReceIn = 0;//接收状态标记数据位    

u8 UART3ReceFullFlag = 0;//接收完数据标志位

 

void USART1_Configuration(u32 bound){

  //GPIO端口设置

  GPIO_InitTypeDef GPIO_InitStructure;

    USART_InitTypeDef USART_InitStructure;

    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);    //使能USART1,GPIOA时钟

  

    //USART1_TX GPIOA.9

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出

  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9

   

  //USART1_RX     GPIOA.10初始化

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10

 

  //Usart1 NVIC 配置

  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;        //子优先级3

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能

    NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器

  

   //USART 初始化设置

    USART_InitStructure.USART_BaudRate = bound;//串口波特率

    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式

    USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位

    USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位

    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制

    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //收发模式

 

  USART_Init(USART1, &USART_InitStructure); //初始化串口1

  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断

  USART_Cmd(USART1, ENABLE); //使能串口1

 

}

 

void USART3_Configuration(u32 bound)

{

  //GPIO端口设置

  GPIO_InitTypeDef GPIO_InitStructure;

    USART_InitTypeDef USART_InitStructure;

    NVIC_InitTypeDef NVIC_InitStructure;

    

 #if 1

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE); //remap时钟|RCC_APB2Periph_AFIO //开启GPIOB时钟

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);//这里要分开打开 //USART3时钟 来自APB1

#endif

    

#if 0

    

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIOB和USART3时钟

    

        //USART3_TX GPIOB.10

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出

    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOA.10

    

    //USART3_RX     GPIOB.11初始化

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB11

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.11

    

#endif    

    

 

#if 0    //重映射

 

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE); //remap时钟|RCC_APB2Periph_AFIO //开启GPIOB时钟

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);//这里要分开打开 //USART3时钟 来自APB1

    

    //GPIO_PartialRemap_USART3 部分重映射 GPIOC_10 GPIOC_11

    

    GPIO_PinRemapConfig(GPIO_PartialRemap_USART3,ENABLE);

    //USART3_TX GPIOC.10

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出

  GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化

   

  //USART3_RX     GPIOC.11初始化

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

  GPIO_Init(GPIOC, &GPIO_InitStructure);//初始

#endif

 

 

#if 1

 

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE); //remap时钟|RCC_APB2Periph_AFIO //开启GPIOB时钟

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);//这里要分开打开 //USART3时钟 来自APB1

 

     //GPIO_FullRemap_USART3 完全重映射 D8 D9

     GPIO_PinRemapConfig(GPIO_FullRemap_USART3,ENABLE);

    //USART3_TX GPIOD8

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出

  GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化

   

  //USART3_RX     GPIOD9

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

  GPIO_Init(GPIOD, &GPIO_InitStructure);//初始

#endif

 

 

  //Usart3 NVIC 配置

  NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//抢占优先级3

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;        //子优先级3

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能

    NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器

  

   //USART 初始化设置

 

    USART_InitStructure.USART_BaudRate = bound;//串口波特率

    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式

    USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位

    USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位

    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制

    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //收发模式

 

  USART_Init(USART3, &USART_InitStructure); //初始化串口3

  USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启串口接受中断

  USART_Cmd(USART3, ENABLE); //使能串口3

 

}

 

 

 

 

 

 

//串口1发送一帧数据

void USART1_SendOneData(uint32_t SendOneData)

{

    USART_SendData(USART1, SendOneData);

    while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)

    {}

}

//串口2发送一帧数据

void USART2_SendOneData(uint32_t SendOneData)

{

    USART_SendData(USART2, SendOneData);

    while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET)

    {}

}

 

//串口3发送一帧数据

void USART3_SendOneData(uint32_t SendOneData)

{

    USART_SendData(USART3, SendOneData);

    while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET)

    {}

}

//串口1发送一列数据

void USART1_SendUnfixedData(uint32_t *Buffer, uint8_t Length)

{

    uint8_t i;

    for(i=0;i    {

        USART1_SendOneData(*Buffer++);

    }

}

 

//串口2发送一列数据

void USART2_SendUnfixedData(uint32_t *Buffer, uint8_t Length)

{

    uint8_t i;

    for(i=0;i    {

        USART2_SendOneData(*Buffer++);

    }

}

 

//串口3发送一列数据

void USART3_SendUnfixedData(uint32_t *Buffer, uint8_t Length)

{

    uint8_t i;

    for(i=0;i    {

        USART3_SendOneData(*Buffer++);

    }

}

 

 

 

//串口1中断服务函数

void USART1_IRQHandler(void)

{

    u8 Res;//数据暂存

    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断

    {

        Res =USART_ReceiveData(USART1);    //读取接收到的数据        

        switch(UART1ReceIn)//读取接收到的数据有几位 每一位对应的数据协议校验

        {

            case 0:

                if(Res==0xFE)

                    UART1ReceBuff[UART1ReceIn++] = Res;

                else

                    UART1ReceIn = 0;

                break;

            case 1:

                if(Res==0xFE)

                    UART1ReceBuff[UART1ReceIn++] = Res;

                else

                    UART1ReceIn = 0;

                break;

            case 2://此处为判断数据的位置 正反转

//                if(Res==0x02)//在其他位置判断数据

//                {UART1ReceBuff[UART1ReceIn++] = Res;

//                    checkdata[0]=UART1ReceBuff[2];}

            {UART1ReceBuff[UART1ReceIn++] = Res;

            checkdata[0]=UART1ReceBuff[2];

            

            }

            break;

            case 3://此处为判断数据的位置 旋转角度

//                if(Res==0x02)//在其他位置判断数据

//                {UART1ReceBuff[UART1ReceIn++] = Res;

//                    checkdata[0]=UART1ReceBuff[2];}

            {UART1ReceBuff[UART1ReceIn++] = Res;

            checkdata[1]=UART1ReceBuff[3];    //接收到的角度数据和实际齿轮数据不一致        

            }    

            break;            

            case 4:

                if(Res==0xFD)

                    UART1ReceBuff[UART1ReceIn++] = Res;

                else

                    UART1ReceIn = 0;

                break;

            case 5:

                if(Res==0xFD)

                    UART1ReceBuff[UART1ReceIn++] = Res;

                else

                    UART1ReceIn = 0;

                break;

            default:

                UART1ReceBuff[UART1ReceIn++] = Res;

                break;

        }

 

        if(UART1ReceIn >= 5)

        {

            UART1ReceFullFlag = 1;    //数据完整接受完

                UART1ReceIn = 0;

             timer8flag=0;

        }

//        USART_ClearFlag(USART1, USART_IT_RXNE);//清除相对应的中断位 清除中断预处理位USART_ClearITPendingBit左移八位是USART_ClearFlag

        USART_ClearITPendingBit(USART1, USART_IT_RXNE);//清除相对应的中断位 清除中断预处理位USART_ClearITPendingBit左移八位是USART_ClearFlag

//        

    }

     if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)    // 发送中断 USART_GetITStatus

    {

    //    USART_ClearFlag(USART1, USART_IT_TXE);                    // clear interrupt 清除中断预处理位

        USART_ClearITPendingBit(USART1, USART_IT_TXE);                    // clear interrupt 清除中断预处理位

    }    

//    if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)

//    {    

//        USART_ClearFlag(USART1, USART_FLAG_ORE);    

//    }

 

}

 

 

//串口3中断服务函数

void USART3_IRQHandler(void)

{

    u8 Res;//数据暂存

    if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接收中断

    {

        Res =USART_ReceiveData(USART3);    //读取接收到的数据 USART_ReceiveData

            USART_SendData(USART1,Res);//将读取到的数据通过串口1发送

        switch(UART3ReceIn)//读取接收到的数据有几位 每一位对应的数据协议校验

        {

            case 0:

                if(Res==0XFE)

                    UART3ReceBuff[UART3ReceIn++] = Res;

                else

                    UART3ReceIn = 0;

                break;

            case 10:

                if(Res==0xFF)

                    UART3ReceBuff[UART3ReceIn++] = Res;

                else

                    UART3ReceIn = 0;

                break;

            default:

                UART3ReceBuff[UART3ReceIn++] = Res;

                break;

        }

 

        if(UART3ReceIn >= 11)

        {

            UART3ReceFullFlag = 1;    //数据完整接受完

        }

        USART_ClearITPendingBit(USART3, USART_IT_RXNE);//清除相对应的中断位 清除中断预处理位USART_ClearITPendingBit左移八位是USART_ClearFlag

    }

    else if(USART_GetITStatus(USART3, USART_IT_TXE) != RESET)    // 发送中断 USART_GetITStatus

    {

        USART_ClearITPendingBit(USART3, USART_IT_TXE);                    // clear interrupt 清除中断预处理位

    }    

}

 

void send_data()

{

    //刷新位置信息

if(timer8flag100ms==1)

{

timer8flag100ms=0;

    

            //发送协议头 FE FE D1

            USART_SendData(USART1,0xFA);//向串口1发送数据

            while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束

            USART_SendData(USART1,0xFC);

            while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束    

            //发送数据内容1            

            USART1_SendUnfixedData(crc16_data1,1);//空开1

            while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束

            //发送数据内容2    

                USART1_SendUnfixedData(crc16_data2,1);//空开2

            while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束

            //发送数据内容3        

                USART1_SendUnfixedData(crc16_data3,1);//空开3

            while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束

            //发送数据内容4        

                USART1_SendUnfixedData(crc16_data4,1);//空开4

            while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束

            //发送数据内容5            

            USART1_SendUnfixedData(crc16_data5,2);//饮水机 空烧数据

            while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束

            //发送数据内容设备接地的数据 (过载实验)(1111 1111)(八个设备)

                USART1_SendUnfixedData(crc16_data6,1);

            while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束

            //发送数据内容7     接地触电 crc16_data7[0] 湿手触电 crc16_data7[1]

                USART1_SendUnfixedData(crc16_data7,1);

            while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束

            //发送数据内容8        发送给串口的数据

                USART1_SendUnfixedData(crc16_data8,1);

            while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束                        

            //发送协议尾 FD FD

            USART_SendData(USART1,0xFD);//向串口1发送数据

            while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束

            USART_SendData(USART1,0xFD);

            while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束

}

 

}

 

void send_data_usart3(void)

{

    //刷新位置信息

if(timer8flag200ms==1)

{

timer8flag200ms=0;

    

            //发送协议头 FE FE D1

            USART_SendData(USART3,0xFA);//向串口1发送数据

            while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束

            USART_SendData(USART3,0xFC);

            while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束    

            //发送数据内容1            

            USART3_SendUnfixedData(crc16_data1,1);//空开1

            while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束

            //发送数据内容2    

                USART3_SendUnfixedData(crc16_data2,1);//空开2

            while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束

            //发送数据内容3        

                USART3_SendUnfixedData(crc16_data3,1);//空开3

            while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束

            //发送数据内容4        

                USART3_SendUnfixedData(crc16_data4,1);//空开4

            while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束

            //发送数据内容5            

             USART3_SendUnfixedData(crc16_data5,2);//饮水机 空烧数据

            while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束

            //发送数据内容设备接地的数据 (过载实验)(1111 1111)(八个设备)

                USART3_SendUnfixedData(crc16_data6,1);

            while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束

            //发送数据内容7     接地触电 crc16_data7[0] 湿手触电 crc16_data7[1]

                USART3_SendUnfixedData(crc16_data7,1);

            while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束

            //发送数据内容8        发送给串口的数据

                USART3_SendUnfixedData(crc16_data8,1);

            while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束                        

            //发送协议尾 FD FD

            USART_SendData(USART3,0xFD);//向串口1发送数据

            while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束

            USART_SendData(USART3,0xFD);

            while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束

}

 

}


进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 1瓦线性调频增强器

  • 家用电器遥控器

  • 12V 转 28V DC-DC 变换器(基于 LM2585)

  • 红外开关

  • DS1669数字电位器

  • HA1377 桥式放大器 BCL 电容 17W(汽车音频)

    相关电子头条文章