4645|3

32

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

为什么进不去USART中断,求大神指教,调试了2星期了 [复制链接]


#include "includes.h"

#define USART_REC_LEN 64
#define USART2_MAX_RECV_LEN 64
                u16 USART2_RX_STA;
         u16 USART2_RX_BUF[];#include "includes.h"

ErrorStatus HSEStartUpStatus;
void RCC_Configuration(void);
void NVIC_Configuration(void);
//void SysTick_Configuration(u16 period);
void GPIO_Configuration(void);
void USART1_Configuration(void);
void USART2_Configuration(void);
//Ïμí33õê¼»ˉ
void Sys_Init( void )
{
    RCC_Configuration();
    /* NVIC configuration */
    NVIC_Configuration();
    GPIO_Configuration();
                USART1_Configuration();
                USART2_Configuration();
    //SysTick_Configuration(10);//10ms
}
/*******************************************************************************
* Function Name  : RCC_Configuration
* Description    : Configures the different system clocks.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
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)
  {
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);

    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);

    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1);

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

    /* 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)
    {
    }
  }

  /* DMA1 clock enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

  /* TIM2,TIM3 TIM4 clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO , ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  /* Enable USART1, GPIOA, ADC1, ADC2 and AFIO clocks */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO , ENABLE);
            RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
}


/*******************************************************************************
* Function Name  : NVIC_Configuration
* Description    : Configures the nested vectored interrupt controller.
* Input          : None
* Output         : None
* Return         : None
******************************************************************************/
void NVIC_Configuration(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;
#ifdef  VECT_TAB_RAM  
  /* Set the Vector Table base location at 0x20000000 */
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */
  /* Set the Vector Table base location at 0x08000000 */
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);

#endif

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);       
/*USART1*/
     NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0 ;
     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0 ;
     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

        /*USART2*/
        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3 ;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

     NVIC_Init(&NVIC_InitStructure);       

}
/******************************************************************************
* Function Name  : GPIO_Configuration
* Description    : Configures the different GPIO ports.
* Input          : None
* Output         : None
* Return         : None
******************************************************************************/
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef 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_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

        //USART2_TX
        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);

                //USART2_RX
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

                GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void USART1_Configuration(void)
{
         USART_InitTypeDef USART_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_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);
    //USART_DMA_Config(DMA1_Channel4,(u32)&USART2->DR,(u32)USART2_TX_BUF);
    USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
}

  void USART2_Configuration(void)
        {
                USART_InitTypeDef USART_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_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
        USART_Init(USART2, &USART_InitStructure);
        /*?????*/
        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);

        USART_Cmd(USART2, ENABLE);
        }
#ifdef  DEBUG
/*******************************************************************************
* Function Name  : assert_failed
* Description    : Reports the name of the source file and the source line number
*                  where the assert_param error has occurred.
* Input          : - file: pointer to the source file name
*                  - line: assert_param error line source number
* Output         : None
* Return         : None
*******************************************************************************/
void assert_failed(u8* file, u32 line)
{
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}


#endif

        void delays(void);


        int main()
        {


        u16 i,rxlen;
  Sys_Init();




        while(1)
        {
                if(USART2_RX_STA&0X8000)
                {
                        rxlen=USART2_RX_STA&0X7FFF;
                        for(i=0;i                         {        USART_SendData(USART1, USART2_RX_BUF);
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                        }
                                USART2_RX_STA=0;
                                //USART1_TX_BUF=0;

                }
        }
}
        u8 USART_RX_BUF[USART_REC_LEN];
u16 USART_RX_STA=0;
void USART1_IRQHandler(void)
{
        u8 res;
        if(USART_GetFlagStatus(USART1, USART_IT_RXNE) != RESET)
        {
                res=USART_ReceiveData(USART1);
                if((USART_RX_STA&0x8000)==0)
                {
                        if(USART_RX_STA&0x4000)
                        {
                                if(res!=0x0a)USART_RX_STA=0;
                                else USART_RX_STA|=0x8000;
                        }else
                        {
                                if(res==0x0d)USART_RX_STA|=0x4000;
                                else
                                {
                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=res;
                                        USART_RX_STA++;
                                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;
                                }
                        }
                }
        }
}


u16 USART2_RX_BUF[USART2_MAX_RECV_LEN];
//u8 USART2_TX_BUF[USART2_MAX_SEND_LEN];
u16 USART2_RX_STA=0;
void USART2_IRQHandler(void)
{
        u8 res;
        if(USART_GetFlagStatus(USART2, USART_IT_RXNE) != RESET)
        {
                res=USART_ReceiveData(USART2);
                if(USART2_RX_STA                 {

                        if(USART2_RX_STA==0)
                        USART2_RX_BUF[USART2_RX_STA++]=res;
                }else
                {
                        USART2_RX_STA|=1<<15;
                }
        }



}
/******************************************************************************
* Function Name  : delays
* Description     : delay
* Input          : None
* Output         : None
* Return         : None
******************************************************************************/
void delays(void)
{
  u32 k=10000;
  while(k--);
}





最新回复

你这要是能进中断那就真怪了,你设置gpio的时候,对应的GPIO时钟也没有使能,第二,你也没有把对应的GPIO映射为串口。第三,对应GPIO模式应该是复用。算了,剩下的懒得看了。  详情 回复 发表于 2016-11-1 11:34
点赞 关注

回复
举报

650

帖子

8

TA的资源

纯净的硅(初级)

沙发
 
你调试先把rx和tx短接,自己发送自己接收试试是否正常
 
 

回复

173

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);  
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);       
GPIO配置缺少上面两句
 
 
 

回复

146

帖子

0

TA的资源

一粒金砂(中级)

4
 
你这要是能进中断那就真怪了,你设置gpio的时候,对应的GPIO时钟也没有使能,第二,你也没有把对应的GPIO映射为串口。第三,对应GPIO模式应该是复用。算了,剩下的懒得看了。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表