[STM32F1]

咨询 stm32f103VET6 usart3使用方法

[复制链接]
3181|13
手机看帖
扫描二维码
随时随地手机跟帖
sackfc|  楼主 | 2015-10-15 15:43 | 显示全部楼层 |阅读模式
//³õʼ»¯IO ´®¿Ú3
//bound:²¨ÌØÂÊ
void uart3_init(u32 bound)
{
       
       
       
    //GPIO¶Ë¿ÚÉèÖÃ
  GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
         
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);        //ʹÄÜUSART3ʱÖÓ
        USART_DeInit(USART3);  //¸´Î»´®¿Ú3
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);        //ʹÄÜGPIODʱÖÓ
         //USART3_TX   PD.8
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //PD.8
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //¸´ÓÃÍÆÍìÊä³ö
    GPIO_Init(GPIOD, &GPIO_InitStructure); //³õʼ»¯PD.8
   
    //USART3_RX          PD.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿ÕÊäÈë
    GPIO_Init(GPIOD, &GPIO_InitStructure);  //³õʼ»¯PD.9

   //Usart3 NVIC ÅäÖÃ

  NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=4 ;//ÇÀÕ¼ÓÅÏȼ¶3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;                //×ÓÓÅÏȼ¶3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQͨµÀʹÄÜ
        NVIC_Init(&NVIC_InitStructure);        //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯VIC¼Ä´æÆ÷
  
   //USART3 ³õʼ»¯ÉèÖÃ

        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); //³õʼ»¯´®¿Ú
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//¿ªÆôÖжÏ
    USART_Cmd(USART3, ENABLE);                    //ʹÄÜ´®¿Ú

}

以上是usart3初始化,
用 USART_SendData(USART3, 0x55);函数发送0x55,输出端没有反应,不知问题出在哪里,
哪位有时间帮忙看下,谢谢!
beyondjobs| | 2015-10-15 15:46 | 显示全部楼层
首先你先排除下硬件是否有问题,比如短接stm32的RXD TXD 线看串口调试助手能否收到自己发出的数据

使用特权

评论回复
sackfc|  楼主 | 2015-10-15 15:58 | 显示全部楼层
硬件连接应该没问题,USART1  USART2 都好使,看文档usart3和前两个的初始化应该是一样的,我用示波器测试tx没输出

使用特权

评论回复
beyondjobs| | 2015-10-15 16:06 | 显示全部楼层
sackfc 发表于 2015-10-15 15:58
硬件连接应该没问题,USART1  USART2 都好使,看文档usart3和前两个的初始化应该是一样的,我用示波器测试t ...

进入发送中断么?

使用特权

评论回复
sackfc|  楼主 | 2015-10-15 16:20 | 显示全部楼层
发送程序
int main(void)
{               

        delay_init();                     //ÑÓʱº¯Êý³õʼ»¯          
        NVIC_Configuration();          //ÉèÖÃNVICÖжϷÖ×é2:2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶
        uart1_init(9600);             //´®¿Ú³õʼ»¯Îª9600
        uart2_init(9600);             //´®¿Ú³õʼ»¯Îª9600
        uart3_init(9600);             //´®¿Ú³õʼ»¯Îª9600
        LED_Init();                             //LED¶Ë¿Ú³õʼ»¯
        TIM3_Int_Init(2999,7199);//10KhzµÄ¼ÆÊýƵÂÊ£¬¼ÆÊýµ½5000Ϊ500ms  
        TIM4_Int_Init(4999,7199);//10KhzµÄ¼ÆÊýƵÂÊ£¬¼ÆÊýµ½5000Ϊ500ms  
          

        while(1)
        {
                //LED0=!LED0;
                delay_ms(100);       
       
               
                USART_SendData(USART1, 0x55);         
                USART_SendData(USART2, 0x55);
                USART_SendData(USART3, 0x55);
                //USARTx_Putc(USART1, 0x55);
                //USARTx_Putc(USART2, 0x55);
                //USARTx_Putc(USART3, 0x55);
               
               
       
        }         


}         

前两个都有输出,第三个输出低电平,不知问题所在,看初始化应该没问题

使用特权

评论回复
sackfc|  楼主 | 2015-10-15 16:21 | 显示全部楼层
没有用到中断

使用特权

评论回复
lgh9990| | 2015-10-15 20:19 | 显示全部楼层
uart3端口remap

使用特权

评论回复
SLHSu37| | 2015-10-16 08:31 | 显示全部楼层
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);
不开AFIO时钟吗?

使用特权

评论回复
鹏鹏0830| | 2015-10-16 08:38 | 显示全部楼层
你看下手册,有3组IO口可以用USART3功能,默认的话是PB10和PB11,而你用的是PD8和PD9,所以如果你没有重影像的话,这两个脚是没有串口功能的,所以你要做一件事,把USART3这个功能从PB10和PB11引脚上切换到PD8和PD9上。你把你的RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); 这句话换成
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO,ENABLE);  //RCC_APB2Periph_AFIO是复用IO口时钟
再在后面加上
GPIO_PinRemapConfig(GPIO_FullRemap_USART3,ENABLE);  //完全重映像。
试试
多说一句,如果你要用的是PC10和PC11做USART3功能,则配置成GPIO_PinRemapConfig(GPIO_PartialRemap_USART3,ENABLE);部分重映像。你说你USART1和USART2都成功了,应该是你用PA9和PA10做USART1,;PA2和PA3做USART2,正好串口功能正好在这两个脚上。否则的话,也需要配置重映像才可以使用。
QQ截图20151016082002.jpg

使用特权

评论回复
beyondjobs| | 2015-10-16 10:48 | 显示全部楼层
鹏鹏0830 发表于 2015-10-16 08:38
你看下手册,有3组IO口可以用USART3功能,默认的话是PB10和PB11,而你用的是PD8和PD9,所以如果你没有重影 ...

靠谱答案

使用特权

评论回复
songchenping| | 2015-10-16 12:35 | 显示全部楼层
一看见多行代码就头疼

使用特权

评论回复
元方义城| | 2015-10-16 14:06 | 显示全部楼层

可以结贴了

使用特权

评论回复
sackfc|  楼主 | 2015-10-27 19:46 | 显示全部楼层
感谢10楼和8楼的解答,确实是这个问题。初学stm32,问题多多,还请各位多多帮忙!在此谢谢各位了,特别是10楼的耐心解答。

使用特权

评论回复
gejigeji521| | 2017-10-5 12:16 | 显示全部楼层
学习楼主的先进经验来了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

69

帖子

1

粉丝