OpenEdv-开源电子网

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

用作485的串口不入中断,求大侠指点...

[复制链接]

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2012-3-31
在线时间
7 小时
发表于 2012-6-7 19:56:54 | 显示全部楼层 |阅读模式

RCC的配置:
void RCC_Configuration(void)
{
  /* RCC system reset(for debug purpose) */
  RCC_DeInit();

  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);

  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if(HSEStartUpStatus == SUCCESS)
  {
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
 
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1);

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

    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

    /* Enable PLL */
    RCC_PLLCmd(ENABLE);

    /* Wait till PLL is ready */
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }

    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /* Wait till PLL is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }
  /* Enable USART1, GPIOA, GPIOx and AFIO clocks */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO| RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE
         ,ENABLE);
        
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
  /* Enable USART2 clock */

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);

  /*
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 | RCC_APB1Periph_USART3 | RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3
         | RCC_APB1Periph_WWDG, ENABLE);
  */      
}
NVIC的配置:
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

   /* Configure the NVIC Preemption Priority Bits */ 
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

  /* Enable the USART2 Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}
GPIO的配置:
void GPIO_Configuration (void)
{
 GPIO_InitTypeDef GPIO_InitStructure;
 //AD
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
 GPIO_Init(GPIOA, &GPIO_InitStructure);
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
 GPIO_Init(GPIOC, &GPIO_InitStructure);
 //RFM23 SDI,SCK,NSEL
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_15;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
 GPIO_Init(GPIOB, &GPIO_InitStructure);
 //RFM23 SDO,IRQ
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_14;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
 GPIO_Init(GPIOB, &GPIO_InitStructure);
 //R485 & 串口1
 /*串口1 RX管脚配置*/
    /* Configure USART1 Rx as input floating */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /*R485 RX管脚配置*/
    /* Configure R485 Rx as input floating */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure); 
 
    /*串口1 TX管脚配置*/
    /* Configure USART1 Tx 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);

    /*R485 TX管脚配置*/
    /* Configure R485 Tx 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);
 /* 配置RS485方向控制管脚*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);    
}
485(串口2)的配置:
void R485_Configuration (void)
{

    /*配置串口1 */
  USART_InitStructure.USART_BaudRate = 115200;               /*设置波特率为115200*/
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;/*设置数据位为8*/
  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;  /*发送和接收*/

  USART_Init(USART1, &USART_InitStructure);
   /*配置R485*/
  USART_InitStructure.USART_BaudRate = 9600;               /*设置波特率为115200*/
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;/*设置数据位为8*/
  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;  /*发送和接收*/

  USART_Init(USART2, &USART_InitStructure);
  /* 使能串口1 */
//USART_Cmd(USART1, ENABLE);

  /* 使能 R485, 配置完毕 */
  USART_Cmd(USART2, ENABLE);       //使能485
  GPIO_ResetBits(GPIOB,GPIO_Pin_0);            //初始化时首先进入接收模式
  USART_ITConfig(USART2,USART_IT_RXNE,ENABLE); //开接收中断
}
以上是配置,还请路过的大侠指点下~~~

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-6-7 22:46:45 | 显示全部楼层
回复 支持 反对

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2012-3-31
在线时间
7 小时
 楼主| 发表于 2012-6-8 08:37:20 | 显示全部楼层

 第一次发帖,基本上都是想求指点,这样才能饮水思源....还请原子大哥指点下~~

 

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-6-8 09:00:32 | 显示全部楼层
回复【3楼】timewang:
---------------------------------
参考我们的串口中断.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2012-3-31
在线时间
7 小时
 楼主| 发表于 2012-6-8 09:45:12 | 显示全部楼层
这已经是参考过很多例子的,还是找不到原因,会不会和启动文件相关?我用的是STM32F10x.s,是每次建工程时系统自动生成的,请大侠们指点~~,感激不尽~~
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-6-8 12:35:39 | 显示全部楼层
建议你先做串口中断.做好了之后再稍作修改就可以适应485通信了.
你中断进不了,参考我们的串口实验.我们的串口实验有接收中断的(发送中断,没做.).
至于你说的很多例子,我不知道有没有我们的例子.因为网上很多开发板都是千篇一律的..
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2012-3-31
在线时间
7 小时
 楼主| 发表于 2012-6-8 16:30:05 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
不知道是咋回事,之前在这个程序中写的ADC和DMA也都不能进中断,但是System tick就可以。现在程序我试过了,可以用查询方式去读收到的值,但就是不中断,可以确定是配置问题。用开发板上的例程改写的简单的485收发程序在自己划的板子上运行都收发自如,但自己配的就不行(驱动程序是单独写在一个.C文件里,会不会有影响?),请大侠帮忙看下程序,帮忙指点下错误,感激不尽~~
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-6-8 16:43:42 | 显示全部楼层
对比一下你自己配置的和开发板配置的就知道问题出在哪里了.
最好是直接看配置后的寄存器状态.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2012-3-31
在线时间
7 小时
 楼主| 发表于 2012-6-8 18:59:56 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
哦,搞定了,犯得错误有点弱智,就不说了,以上程序都是对的,没有问题,有需要的可以参考,感谢原子大哥的支持~
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 05:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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