stm32F407使用1382400波特率收发数据

        在一个新项目中要使用串口发送大量数据,之前使用过的串口最高波特率只用到了115200,最开始想用115200*16=1843200波特率的,但收发数据的时候测试有部分字节会出错,最后改用1382400波特率测试收发数据都正常。

主函数测试程序:

u32 SysTime;         //系统时钟上 每毫秒加1

u8  senddata[256];  //发送数据BUF
u32  TestTime;
int main(void)
{
    u16 i ;
    SysTickConfiguration(); 
    
     DriveGpioInit();
     DriveGpioInputDefault();
     DriveGpioOutputDefault();
      DriveUsarUnifyInit(kUART_COM6_UPPER,1382400,USART_WordLength_8b,USART_StopBits_1,USART_Parity_No);   //初始化串口  1382400
    CreatSystemManageTask();
    for(i = 0; i < 256; i++)
    {
            senddata[i] = i;      //给发送BUF赋值
    }
  while(1)
    {
        TaskPoll();
        TaskTimerUpdate(SysTime);
        if(SysTime >= TestTime)
        {
            TestTime = SysTime + 1000;            //每秒钟发送一包串口数剧
            DriveUsartComUnifySend(kUART_COM6_UPPER,senddata,256);              //发送数据
        }
        DriveUsartUnifyDataSendLoop();
    }
}

串口初始化函数:

       GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        //    NVIC_InitTypeDef NVIC_InitStructure;

        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);             //使能GPIOC时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6,ENABLE);            //使能USART6时钟

        //串口6对应引脚复用映射
        GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_USART6);         //GPIOC6复用为USART6
        GPIO_PinAFConfig(GPIOC,GPIO_PinSource7,GPIO_AF_USART6);         //GPIOC7复用为USART6

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;             //GPIOC6与GPIOC7
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                    //复用功能
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                //速度50MHz
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                     //推挽复用输出
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                     //上拉
        GPIO_Init(GPIOC,&GPIO_InitStructure);                             //初始化PC6,PC7

        /*  配置串口硬件参数 */
        USART_InitStructure.USART_BaudRate = baud;        //波特率设置
        USART_InitStructure.USART_WordLength = len;        //字长为8位数据格式
        USART_InitStructure.USART_StopBits = stopBit;            //一个停止位
        USART_InitStructure.USART_Parity = checkType;                //无奇偶校验位
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;    //无硬件数据流控制
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //收发模式
        USART_Init(USART6, &USART_InitStructure);                         //初始化串口6
        //用于判断是否接收完一包数据.
        USART_ITConfig(USART6, USART_IT_IDLE, ENABLE);                    // 使能串口空闲中断

        USART_Cmd(USART6, ENABLE);                                         // 串口使能
      

上位串口调试助手收到MCU的数据:

 

 

MCU收到串口调试助手的数据:

 

 

 

 

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F407中,可以使用中断方式进行串口数据收发。以下是基本的步骤: 1. 配置USART外设:设置USART的波特率数据位、停止位、校验位等参数,并开启USART外设。 2. 配置NVIC:使能USART的中断,并设置优先级。 3. 编写中断服务函数:USART的中断服务函数包括接收中断和发送中断。在接收中断服务函数中,可以读取USART数据寄存器中的数据,并将其存储到缓冲区中。在发送中断服务函数中,可以从缓冲区中读取数据,并将其发送到USART数据寄存器中。 4. 编写主程序:在主程序中,可以初始化缓冲区、启动USART外设、发送数据、接收数据等操作。 下面是一个简单的例子,演示了如何使用中断方式进行串口数据收发: ```c #include "stm32f4xx.h" #include <stdio.h> #define BUFFER_SIZE 256 uint8_t rx_buffer[BUFFER_SIZE]; uint8_t tx_buffer[BUFFER_SIZE]; volatile uint16_t rx_head = 0; volatile uint16_t rx_tail = 0; volatile uint16_t tx_head = 0; volatile uint16_t tx_tail = 0; void USART2_IRQHandler(void) { if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断 { rx_buffer[rx_head] = USART_ReceiveData(USART2); rx_head = (rx_head + 1) % BUFFER_SIZE; } if (USART_GetITStatus(USART2, USART_IT_TXE) != RESET) //发送中断 { if (tx_head != tx_tail) { USART_SendData(USART2, tx_buffer[tx_tail]); tx_tail = (tx_tail + 1) % BUFFER_SIZE; } else { USART_ITConfig(USART2, USART_IT_TXE, DISABLE); } } } void usart_init(void) { USART_InitTypeDef USART_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2); GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; 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(USART2, &USART_InitStructure); NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_Cmd(USART2, ENABLE); USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); } void send_data(uint8_t *data, uint16_t len) { uint16_t i; for (i = 0; i < len; i++) { tx_buffer[tx_head] = data[i]; tx_head = (tx_head + 1) % BUFFER_SIZE; } USART_ITConfig(USART2, USART_IT_TXE, ENABLE); } void receive_data(uint8_t *data, uint16_t len) { uint16_t i; for (i = 0; i < len; i++) { while (rx_head == rx_tail); data[i] = rx_buffer[rx_tail]; rx_tail = (rx_tail + 1) % BUFFER_SIZE; } } int main(void) { uint8_t data[] = "Hello, world!\r\n"; uint8_t buffer[32]; usart_init(); send_data(data, sizeof(data)); while (1) { receive_data(buffer, sizeof(buffer)); printf("%s", buffer); } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值