STM32 USART3只能接收不能发送

使用单片机STM32F103VE调试USART3的时候发现只能接收不能发送,引脚使用PB10、PB11最后发现是初始化RCC_APB2Periph_GPIOB初始化时候错误,使用了RCC_APB1PeriphClockCmd,实际应该使用RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

如下是初始化代码,亲实测通过

void RS232_Init(u32 baudrate)
{
    GPIO_InitTypeDef gpio_InitStructure;
    USART_InitTypeDef usart_InitStructure;
    NVIC_InitTypeDef nvic_InitStructure;
    
    
    //使能GPIOA,D时钟 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
    USART_DeInit(USART3);	//串口恢复到默认的状态 然后再进行初始化

    //PB10端口配置 USART1_TXD
    gpio_InitStructure.GPIO_Pin = GPIO_Pin_10;
    gpio_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    //复用推挽
    gpio_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOB, &gpio_InitStructure);
    
    //PB11端口配置 USART1_RXD
    gpio_InitStructure.GPIO_Pin = GPIO_Pin_11;
    //浮空输入
    gpio_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
//    gpio_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOB, &gpio_InitStructure);
    
    //设置波特率
    usart_InitStructure.USART_BaudRate = baudrate;
    //8为数据长度
    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;
    //初始化串口1
    USART_Init(USART3, &usart_InitStructure);
    USART_Cmd(USART3, ENABLE);
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
    //使能串口2中断
//    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    nvic_InitStructure.NVIC_IRQChannel = USART3_IRQn; 
    //设置中断优先级 先占优先级2级
    nvic_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    //从优先级2级
    nvic_InitStructure.NVIC_IRQChannelSubPriority = 0;
    nvic_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
    //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 
    NVIC_Init(&nvic_InitStructure);
}

//发送
void RS232_Send_Data(u8 *buf, u8 len)
{
    while (len--)
    {
        //等待发送区为空
        while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);     
        USART_SendData(USART3, *(buf++));
    }
    //等待发送完成
    while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
}

 

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
stm32串口1和串口3数据互通,经测试同时发256字节不丢包 void usart3_init(u32 bound) { NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // GPIOBʱÖÓ RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //´®¿Ú3ʱÖÓʹÄÜ USART_DeInit(USART3); //¸´Î»´®¿Ú3 //USART3_TX PB10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸´ÓÃÍÆÍìÊä³ö GPIO_Init(GPIOB, &GPIO;_InitStructure); //³õʼ»¯PB10 //USART3_RX PB11 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿ÕÊäÈë GPIO_Init(GPIOB, &GPIO;_InitStructure); //³õʼ»¯PB11 USART_InitStructure.USART_BaudRate = bound;//²¨ÌØÂÊÒ»°ãÉèÖÃΪ9600; 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_Cmd(USART3, ENABLE); //ʹÄÜ´®¿Ú //ʹÄܽÓÊÕÖÐ¶Ï USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//¿ªÆôÖÐ¶Ï //ÉèÖÃÖжÏÓÅÏȼ¶ NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//ÇÀÕ¼ÓÅÏȼ¶3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //×ÓÓÅÏȼ¶3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀʹÄÜ NVIC_Init(&NVIC;_InitStructure); //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷ TIM4_Int_Init(1000-1,7200-1); //10msÖÐ¶Ï USART3_RX_STA=0; //ÇåÁã TIM_Cmd(TIM4,DISABLE); //¹Ø±Õ¶¨Ê±Æ÷7 } //´®¿Ú3,printf º¯Êý //È·±£Ò»´Î·¢ËÍÊý¾Ý²»³¬¹ýUSART3_MAX_SEND_LEN×Ö½Ú void u3_printf(char* fmt,...) { u16 i,j; va_list ap; va_start(ap,fmt); vsprintf((char*)USART3_TX_BUF,fmt,ap); va_end(ap); i=strlen((const char*)USART3_TX_BUF); //´Ë´Î·¢ËÍÊý¾ÝµÄ³¤¶È for(j=0;j<i;j++) //Ñ­»··¢ËÍÊý¾Ý { while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //Ñ­»··¢ËÍ,Ö±µ½·¢ËÍÍê±Ï USART_SendData(USART3,USART3_TX_BUF[j]); } }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值