最近做一个项目,需要用到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
}
还是说管脚设置为复用开漏输出要什么外接电路
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
已经解决了,其实是我自己犯错误了,启动智能卡模式的话,要等到串口的配置参数配置完全才能使能智能卡模式,所以程序是没有问题,主要是这条指令要放到初始完所有配置后面,启动完智能卡后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
}
一周热门 更多>