OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8075|回复: 3

STM32F103RBT6 串口2,3一直不能配置成功 急求以例子 望提鼠相助

[复制链接]

22

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
226
金钱
226
注册时间
2012-3-11
在线时间
31 小时
发表于 2014-3-5 15:45:34 | 显示全部楼层 |阅读模式
主控芯片是STM32F103RBT6  就是MINI板的那种  使用库函数,串口1成功工作,

对应COPY+修改生产串口2,3的初始化代码  但是就是工作不正常,配置完成时会进一次中断

其后发送接收均无任何反应 

代码贴上很碍眼 就只发一下初始化代码 

有跑通的求给例程   可以帮我解决的就看下代码吧 

RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB2Periph_GPIOA, ENABLE);
     //USART3_TX   PB.10  A2
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
   
    //USART3_RX  B.11   PA3
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);  

RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE);//
RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,DISABLE);//

        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
 
   
USART_InitStructure.USART_BaudRate = bound;//
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);
USART_Cmd(USART2, ENABLE);                   
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
        USART_ITConfig(USART2, USART_IT_TC, ENABLE);








正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2011-12-9
在线时间
4 小时
发表于 2014-3-5 15:58:34 | 显示全部楼层
void USART2_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

/* config USART2 clock */ //在使用外设时,不仅要使能其时钟,还要调用此函数使能外设才可以正常使用
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);    // APB2Periph
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 , ENABLE);    // APB1Periph   注意:USART2 是 APB1Periph 

/* USART2 GPIO config */
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;              //PA2 TX
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOA, &GPIO_InitStructure);                

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;              //PA3 RX
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //浮空输入
   GPIO_Init(GPIOA, &GPIO_InitStructure);  
  
/* USART2 mode config */
USART_InitStructure.USART_BaudRate = 9600;  // 波特率设置
USART_InitStructure.USART_WordLength = USART_WordLength_8b;  // 串口传输的字长:8位字长,也可以设置为9位
USART_InitStructure.USART_StopBits = USART_StopBits_1;  // 停止位设置为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;  // 配置双线全双工通讯,需要把Rx和Tx模式都开启
USART_Init(USART2, &USART_InitStructure);   //填充完结构体,调用库函数USART_Init()向寄存器写入配置参数

    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;         //抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;          //IRQ通道使能
NVIC_Init(&NVIC_InitStructure);                                  //根据指定的参数初始化VIC寄存器
   
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启中断

USART_Cmd(USART2, ENABLE);  //调用USART_Cmd() 使能USART外设

}



void USART2_IRQHandler(void)
{

if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  
{
 USART_ClearITPendingBit(USART2,  USART_IT_RXNE);          //清除接收中断标志 

     USART_SendData(USART2, USART_ReceiveData(USART2));    //将数据回送至超级终端
   

         while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);  //等待数据发送完毕
            
}
}

试试这个,自发自收,应该可以的。
回复 支持 反对

使用道具 举报

22

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
226
金钱
226
注册时间
2012-3-11
在线时间
31 小时
 楼主| 发表于 2014-3-5 17:11:23 | 显示全部楼层
多谢大神 
发现问题所在使能USRT2的时钟应该用RCC_APB1PeriphResetCmd(*,ENABLE);函数
而不能用RCC_APB2PeriphResetCmd(*,ENABLE);函数 
具体 原因细看STM32时钟那一块的PDF就会明白,很简单
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2015-7-25
在线时间
2 小时
发表于 2015-10-16 15:50:50 | 显示全部楼层
终于明白了。感谢论坛这么多好人
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-18 23:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表