Stm32_Clock_Init(9);
delay_init(72);
LED_Init(); //LED,????????IO,????????????????,·??ò????????????±????????????¨IO
uart1_init(72,19200); //????1 19200
uart2_init(36,19200); //????2 19200
使用串口1 PA9,10 串口2 PA2,3
LED PA4 PA5 PA6 PA7
发现串口1不正常,有时候进不了中断,串口2正常,换了好几块单片机还是这个问题.
求指点谢谢
void uart1_init(u32 pclk2,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16); //????USARTDIV
mantissa=temp; //??????????·?
fraction=(temp-mantissa)*16; //??????????·?
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2; //????PORTA???±??
RCC->APB2ENR|=1<<14; //?????????±??
GPIOA->CRH&=0XFFFFF00F; //IO×????è??PA9-TX,PA10-RX
GPIOA->CRH|=0X000008B0; //IO×????è??,TX-0XB±í??????????,RX-0X8??/???????
GPIOA->ODR|=(1<<9)|(1<<10);
RCC->APB2RSTR|=1<<14; //????????5
RCC->APB2RSTR&=~(1<<14); //????????5
//?¨?????è??
USART1->BRR=mantissa; // ?¨?????è??
USART1->CR1|=0X200C; //8n1,?????é??
//USART1->CR2|=(2<<12);
//????????????
USART1->CR1|=1<<8; //PE????????
USART1->CR1|=1<<5; //??????????·???????????
//MY_NVIC_Init(0,0,USART1_IRQChannel,2);//????1???ì??1??×é2
MY_NVIC_Init(0,4,USART1_IRQChannel,0);//????0???ì??1??×é0
}
void USART1_IRQHandler(void)
{
if(USART1->SR&(1<<5)) //??????????
{ if (UART_timer == 0) com_cnts = 0;
UART_timer = 20;
if (com_cnts <= (dlen-1))//??????????12??×??? 50 xx ...
{
com_buffer[com_cnts]=USART1->DR;//??DR?????ê????RXNE??????
com_cnts ++;//????????
}
Com_work();
}
}
void uart2_init(u32 pclk1,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk1*1000000)/(bound*16); //????USARTDIV
mantissa=temp; //??????????·?
fraction=(temp-mantissa)*16; //??????????·?
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=(1<<2); //????PORTAB???±??|(1<<3)
RCC->APB1ENR|=1<<17; //????????2?±??
GPIOA->CRL&=0XFFFF00FF; //IO×????è??PA2,3
GPIOA->CRL|=0X00008B00; //IO×????è??,0XB±í??????????2-TX;0X8 ±í????/???????3-RX
GPIOA->ODR|=(1<<2)|(1<<3); //???
RCC->APB1RSTR|=1<<17; //????????
RCC->APB1RSTR&=~(1<<17); //????????
//?¨?????è??
USART2->BRR=mantissa; //?¨?????è??
USART2->CR1|=0X200C; //8n1,?????é??
//????????????
USART2->CR1|=1<<8; //PE????????
USART2->CR1|=1<<5; //??????????·???????????
MY_NVIC_Init(0,5,USART2_IRQChannel,0); //????1???ì??1??×é2
}
void USART2_IRQHandler(void)
{
if(USART2->SR&(1<<5)) //??????????
{
if (UART2_timer == 0) com2_cnts = 0;
UART2_timer = 20;
if (com2_cnts <= (dlen-1))
{
com2_buffer[com2_cnts]=USART2->DR;//??DR?????ê????RXNE??????
com2_cnts ++;//????????
}
Com2_work();
}
}
void LED_Init(void)
{
RCC->APB2ENR|=(1<<2); //????PORTA?±??
GPIOA->CRL&=0X0000ffff;
GPIOA->CRL|=0X33330000; //PA1 ???ì????
GPIOA->ODR|=(15<<4); //PA4-7 ??????
GPIOA->CRH&=0XFFF0FFFF;
GPIOA->CRH|=0X00030000; //PA12 ???ì????
GPIOA->ODR|=(1<<12); //PA12 ??????
}
|