求助407的串口2设置成智能卡模式,只能实现发送接收不了??

2019-07-20 13:29发布

最近做一个项目,需要用到STM32F407ZGT6的串口2的智能卡模式,我依据数据手册来进行设置,PA2设置为复用开漏输出,PA4用于发送固定的频率脉冲,用于智能卡的时钟输入,结果是可以数据发送,却不可以数据的接收,是不是我的设置错误了,有哪位大神做过,能不能帮忙看下哪里设置错误
void USART2_Init(u32 pclk1,u32 bound)
{   
    float temp;
    u16 mantissa;
    u16 fraction;          
    temp=(float)(pclk1*1000000)/(bound*16);//得到USARTDIV@OVER8=0
    mantissa=temp;                                 //得到整数部分
    fraction=(temp-mantissa)*16; /得到小数部分@OVER8=0
    mantissa<<=4;
    mantissa+=fraction;        
    RCC->AHB1ENR|=1<<0;           //使能PORTA的时钟
    RCC->APB1ENR|=1<<17;          //使能串口2的时钟
    GPIO_Set(GPIOA,PIN2,GPIO_MODE_AF,GPIO_OTYPE_OD,GPIO_SPEED_50M,GPIO_PUPD_NONE);//PA2 复用开漏输出
    GPIO_Set(GPIOA,PIN4,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);//PA4 复用推挽输出
    GPIO_AF_Set(GPIOA,2,7);        //PA2,AF7
    GPIO_AF_Set(GPIOA,4,7);//PA4,AF7     

   USART2->BRR=mantissa;         //波特率设置       
   USART2->GTPR|=3<<1;                 //SCLK的时钟频率是系统时钟的12分频
   USART2->GTPR|=1<<13;    //保护时间16个时间单位
   USART2->CR1&=~(1<<15);         //OVER8=0
   USART2->CR1|=1<<12;                 //M=1
   USART2->CR1|=1<<10;                 //PCE=1
   USART2->CR1|=1<<3;                   //发送使能
   USART2->CR1|=1<<2;                   //接收时能
   USART2->CR2&=~(1<<14);  //LINEN=0
   USART2->CR2|=7<<11;                  //stop 1.5  使能SCLK
   USART2->CR3|=1<<5;                  //使能智能卡模式
   USART2->CR3&=~(1<<3);   //HDSEL=0
   USART2->CR3&=~(1<<1);   //LREN=0       
   USART2->CR1|=1<<5;            //接收缓冲区非空中断使能                   
   MY_NVIC_Init(3,2,USART2_IRQn,2);
   USART2->CR1|=1<<13;           //使能串口2
}

还是说管脚设置为复用开漏输出要什么外接电路

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
htcq
2019-07-20 14:36
正点原子 发表于 2016-6-1 21:02
帮顶

已经解决了,其实是我自己犯错误了,启动智能卡模式的话,要等到串口的配置参数配置完全才能使能智能卡模式,所以程序是没有问题,主要是这条指令要放到初始完所有配置后面,启动完智能卡后PA2(开漏输出)就能输入和输出了,PA4能发送频率脉冲,很方便,不需要使用外接电路,希望这个能帮到初次使用407做智能卡模式的人
void USART2_Init(u32 pclk1,u32 bound)
{   
    float temp;
    u16 mantissa;
    u16 fraction;           
    temp=(float)(pclk1*1000000)/(bound*16);//得到USARTDIV@OVER8=0
    mantissa=temp;                                 //得到整数部分
    fraction=(temp-mantissa)*16; /得到小数部分@OVER8=0
    mantissa<<=4;
    mantissa+=fraction;         
    RCC->AHB1ENR|=1<<0;           //使能PORTA的时钟
    RCC->APB1ENR|=1<<17;          //使能串口2的时钟
    GPIO_Set(GPIOA,PIN2,GPIO_MODE_AF,GPIO_OTYPE_OD,GPIO_SPEED_50M,GPIO_PUPD_NONE);//PA2 复用开漏输出
    GPIO_Set(GPIOA,PIN4,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);//PA4 复用推挽输出
    GPIO_AF_Set(GPIOA,2,7);        //PA2,AF7
    GPIO_AF_Set(GPIOA,4,7);//PA4,AF7     

   USART2->BRR=mantissa;         //波特率设置        
   USART2->GTPR|=3<<1;                 //SCLK的时钟频率是系统时钟的12分频
   USART2->GTPR|=1<<13;    //保护时间16个时间单位
   USART2->CR1&=~(1<<15);         //OVER8=0
   USART2->CR1|=1<<12;                 //M=1
   USART2->CR1|=1<<10;                 //PCE=1
   USART2->CR1|=1<<3;                   //发送使能
   USART2->CR1|=1<<2;                   //接收时能
   USART2->CR2&=~(1<<14);  //LINEN=0
   USART2->CR2|=7<<11;                  //stop 1.5  使能SCLK
//  USART2->CR3|=1<<5;                  //使能智能卡模式 不能放这里
   USART2->CR3&=~(1<<3);   //HDSEL=0
   USART2->CR3&=~(1<<1);   //LREN=0        
   USART2->CR1|=1<<5;            //接收缓冲区非空中断使能                    
   MY_NVIC_Init(3,2,USART2_IRQn,2);
   USART2->CR3|=1<<5;                  //使能智能卡模式,这个指令要放在这里才行,等到所有配置完成后
   USART2->CR1|=1<<13;           //使能串口2
}

一周热门 更多>