打印

为什么我的STM32F103RE的UART只能发不能收啊

[复制链接]
4834|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tbbt|  楼主 | 2009-3-24 08:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
为什么我的STM32F103RE的UART只能发不能收啊

用的是KEIL 3.24,可以ISP,说明串口部分电路是好的,搞了2天了,还是不行,大家帮我看一下是程序问题吗?下面是中断和GPIO,UART和中断处理的代码。

void RCC_Configuration(void)
{   
    ErrorStatus HSEStartUpStatus;

    //使能外部晶振
    RCC_HSEConfig(RCC_HSE_ON);
    //等待外部晶振稳定
    HSEStartUpStatus = RCC_WaitForHSEStartUp();
    //如果外部晶振启动成功,则进行下一步操作
    if(HSEStartUpStatus==SUCCESS)
    {
        //设置HCLK(AHB时钟)=SYSCLK
        RCC_HCLKConfig(RCC_SYSCLK_Div1);

        //PCLK1(APB1) = HCLK/2
        RCC_PCLK1Config(RCC_HCLK_Div2);

        //PCLK2(APB2) = HCLK
        RCC_PCLK2Config(RCC_HCLK_Div1);
        
        //设置ADC时钟频率
        RCC_ADCCLKConfig(RCC_PCLK2_Div2); 

        //FLASH时序控制
        //推荐值:SYSCLK = 0~24MHz   Latency=0
        //        SYSCLK = 24~48MHz  Latency=1
        //        SYSCLK = 48~72MHz  Latency=2
        FLASH_SetLatency(FLASH_Latency_2);
        //开启FLASH预取指功能
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

        //PLL设置 SYSCLK/1 * 9 = 8*1*9 = 72MHz
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
        //启动PLL
        RCC_PLLCmd(ENABLE);
        //等待PLL稳定
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
        //系统时钟SYSCLK来自PLL输出
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
        //切换时钟后等待系统时钟稳定
        while(RCC_GetSYSCLKSource()!=0x08);

        
    }

    //下面是给各模块开启时钟
    //启动GPIO
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);
    //启动AFIO
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    //启动USART1
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
    //启动DMA时钟
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
    //启动ADC1时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    //启动TIM1 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); 
    //启动I2C1
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);


}

 void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    //PA口8,11,12脚设置GPIO输出,推挽 50M
    GPIO_InitStructure.GPIO_Pin =GPIO_Pin_8 | GPIO_Pin_11 | GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    //PB口8,9,10,11,12,13,14,15脚设置GPIO输入
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |GPIO_Pin_4 | GPIO_Pin_5 |GPIO_Pin_6 | GPIO_Pin_7 |GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 |GPIO_Pin_12 |GPIO_Pin_13;
    GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    //PC口0,1,2,3,4,5,,6,7,8,9,10,11,12,13脚设置GPIO输出,推挽 50M
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |GPIO_Pin_4 | GPIO_Pin_5 |GPIO_Pin_6 | GPIO_Pin_7 |GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 |GPIO_Pin_12 |GPIO_Pin_13;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
 
    //I2C设置GPIO输出,50M
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    //USART1_TX
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    //USART1_RX
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    //ADC_CH0,1,2,3--> PA
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &GPIO_InitStructure); 

}

void NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;

    //设置NVIC优先级分组为Group2:0-3抢占式优先级,0-3的响应式优先级
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    //串口中断打开
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQChannel;    //更新事件 
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;   //抢占优先级0 
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;             //允许中断 
    NVIC_Init(&NVIC_InitStructure);                             //写入设置 
    /*
    NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    */
}

void USART1_Configuration(void)
{
    USART_InitTypeDef USART_InitStructure;
    
    USART_InitStructure.USART_BaudRate = 57600;
    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_Tx | USART_Mode_Rx;
    USART_Init(USART1, &USART_InitStructure);
    
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    USART_Cmd(USART1, ENABLE);
}

void USART1_IRQHandler (void) {
  //if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  if (USART1->SR & USART_FLAG_RXNE)   // read interrupt 
   {
    /* Read one byte from the receive data register */
    //rbuf[rin ] = USART_ReceiveData(USART1);   
    rbuf[rin]=(USART1->DR & 0xFF); 
    if( rin <RBUF_SIZE)  rin++;
   }
}
沙发
zusen| | 2009-3-24 09:26 | 只看该作者

看你的程序,不如我给个程序你参考,嘿嘿

void SetupUSART (void)  {

    USART_InitTypeDef USART_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;

    USART_NVIC();
    RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA| RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3|RCC_APB1Periph_USART2, ENABLE);
    /* Configure USART1 USART2 Rx (PA10) as input floating                             */
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* Configure USART1 USART2 Tx (PA9) as alternate function push-pull                */
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* Configure USART2 Rx (PA3) as input floating                             */
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* Configure USART2 Tx (PA2) as alternate function push-pull                */
    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);

    /* Configure USART3 Rx (PB11) as input floating                             */
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    /* Configure USART3 Tx (PB10) as alternate function push-pull                */
    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);



    USART_InitStructure.USART_BaudRate            = 9600;
    USART_InitStructure.USART_WordLength          = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits            = USART_StopBits_1;
    USART_InitStructure.USART_Parity              = USART_Parity_No ;//USART_Parity_Odd
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;



    USART_Init(USART1, &USART_InitStructure);
    USART_Init(USART2, &USART_InitStructure);
    USART_Init(USART3, &USART_InitStructure);

    /* Enable the USART Receive interrupt: this interrupt is generated when the 
       USART1 receive data register is not empty */
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);

    /* Enable USART1 */
    USART_Cmd(USART1, ENABLE);
    USART_Cmd(USART2, ENABLE);
    USART_Cmd(USART3, ENABLE);

    uart_rx_time4 = uart_rx_time4_max;
}
/*******************************************************************************
 * Function Name  : NVIC_Configuration
 * Description    : Configures the nested vectored interrupt controller.
 * Input          : None
 * Output         : None
 * Return         : None
 *******************************************************************************/
void USART_NVIC(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;

    /* Enable the USART1 Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

}

使用特权

评论回复
板凳
tbbt|  楼主 | 2009-3-24 09:33 | 只看该作者

可是我的代码好象和你的一样的啊

使用特权

评论回复
地板
zusen| | 2009-3-24 10:54 | 只看该作者

那就查查你的硬件问题罗

使用特权

评论回复
5
tbbt|  楼主 | 2009-3-24 11:06 | 只看该作者

但是可以ISP的呀,那不是说明UART1在硬件上是没问题的

使用特权

评论回复
6
alenthj| | 2009-3-24 11:23 | 只看该作者

看看 stm32f10x_vector.c文件

你中断向量里面的名字和位置,是否和你的串口中断一致

使用特权

评论回复
7
tbbt|  楼主 | 2009-3-24 11:27 | 只看该作者

我刚才调试看了,是USART_IT_RXNE没有变,也没进中断

我刚才调试看了,是USART_IT_RXNE没有变,也没进中断
我在MAIN循环里查询USART_GetITStatus(USART1, USART_IT_RXNE)也没变化

使用特权

评论回复
8
tbbt|  楼主 | 2009-3-24 11:32 | 只看该作者

我好象没引用这个文件stm32f10x_vector.c啊

to alenthj:
我好象没引用这个文件stm32f10x_vector.c啊

使用特权

评论回复
9
tbbt|  楼主 | 2009-3-24 11:35 | 只看该作者

会不会是ISP的问题

差不多的程序在103RB和101R8上用过的,这次想换个大点FLASH的芯片,结果就不行,会不会是ISP的问题,下载时他有个警告:
11:32:11 连接目标板......
11:32:11 连接成功,准备获取器件信息......
11:32:11 器件信息不可识别.
11:32:11 FLASH容量为: 512K; RAM容量为: 64K.

使用特权

评论回复
10
zusen| | 2009-3-24 13:17 | 只看该作者

还是用我的程序代进去试试吧,呵呵

我程序是通过测试完全没问题的,嘿嘿

103ZE

使用特权

评论回复
11
hjiongh| | 2009-3-24 15:42 | 只看该作者

zusen,你有没有usart接收用DMA方式?

有的话,能否贴一下你的代码

使用特权

评论回复
12
香水城| | 2009-3-24 20:53 | 只看该作者

STM32固件库中有使用DMA操作USART的例子

使用特权

评论回复
13
tbbt|  楼主 | 2009-3-24 23:18 | 只看该作者

现在算是搞定了

to hjiongh: 没使用DMA,代码很简单,就是开UART1中断,然后在MAIN主循环中不停查询接受到的内容,结果就是收不到。

实在是没办法了,我就把那片F103RE吹下来,焊在之前的一个103RB的板子,用JTAG下载了上面的程序,嘿,能收了。

估计是那个ISP下载程序对103RE支持的不好,。ISP软件,ST的和国人做的那个,我都用过,都不行。

使用特权

评论回复
14
hjiongh| | 2009-3-25 10:05 | 只看该作者

固件库的DMA操作USART是USART发送的

我依照发送的方式,修改成了接收。也该了DMA_Channel为5 ,但是接收有问题,我在这个帖子“主题:香主 ,请教个uart 接收中断的问题 
”里面描述了

to tbbt: 我必须要用DMA接收USART,否则会频繁进入中断,影响我应用程序的处理。

使用特权

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

本版积分规则

5

主题

30

帖子

1

粉丝