请教各位个问题,我用的VC的片子,分别初始化了USART1 USART2 UART4 UART5
其中唯独USART2进不了接收中断,百思不得其解,请各位高人解惑. 现贴USART2 USART1(用于比较)代码如下:
[mw_shl_code=c,true]void usart2_init( unsigned int pclk1, unsigned int baud )
{
float temp;
unsigned short mantissa, fraction;
temp = ( float )( pclk1 * 1000000 ) / ( baud << 4 );
mantissa = temp;
fraction = ( temp - mantissa ) * 16 + 0.5;
mantissa <<= 4;
mantissa |= fraction & 0x000F;
/* 使能USART2 */
RCC->APB1ENR |= 1 << 17;
/* AFIO时钟 */
//RCC->APB2ENR |= 1;
/* 开启USART2重映射 */
//AFIO->MAPR |= 1 << 3;
/* 使能PD */
RCC->APB2ENR |= 1<<2;//1 << 5;
/* PD5(TX)推挽输出50M PD6(RX)上拉输入 */
//GPIOD->CRL &= 0xF00FFFFF;
//GPIOD->CRL |= 0x08B00000;
GPIOA->CRL &= 0xFFFF00FF;
GPIOA->CRL |= 0x00008b00;
/* 重启USART2 */
RCC->APB1RSTR |= 1 << 17;
RCC->APB1RSTR &= ~( 1 << 17 );
/* 置BAUD率 */
USART2->BRR = mantissa;
/* 使能USART2 使能接收和发送 8个数据位 无奇偶校验 */
USART2->CR1 = 0x200C;
/* 一个停止位 */
USART2->CR2 &= ~0x3000;
/* 处理接收 */
/* 开奇偶校验(PE)中断 */
USART2->CR1 |= 1 << 8;
/* 开接收区不空中断(RXNEIE) 也就是有数据就中断(包括过载 过载就是数据有了还来 多了) */
USART2->CR1 |= 1 << 5;
/* 两个优先级各2位 3 2 比USART1高
通道为USART2_IRQn 对应处理函数为USART2_IRQHandler 在startup的汇编文件中 */
set_ir( 3, 2, USART2_IRQn );
}
void usart2_send( unsigned char* dat, unsigned int size )
{
unsigned int i;
while ( !( USART2->SR & ( 1 << 6 ) ) );
if ( !size )
{
for ( i = 0; dat; i ++ )
{
USART2->DR = dat;
while ( !( USART2->SR & ( 1 << 6 ) ) );
}
}
else
{
for ( i = 0; i < size; i ++ )
{
USART2->DR = dat;
while ( !( USART2->SR & ( 1 << 6 ) ) );
}
}
}
void USART2_IRQHandler( void )
{
unsigned char dr;
if ( USART2->SR & ( 1 << 5 ) )
{
dr = USART2->DR;
usart2_send( (unsigned char*)&dr, 1 );
}
}[/mw_shl_code]
下面是USART1的,一切正常.上面USART2试过映射 映射也还是进不了中断.
[mw_shl_code=c,true]void usart1_init( unsigned int pclk2, unsigned int baud )
{
float temp;
unsigned short mantissa, fraction;
temp = ( float )( pclk2 * 1000000 ) / ( baud << 4 );
mantissa = temp;
fraction = ( temp - mantissa ) * 16 + 0.5;
mantissa <<= 4;
mantissa |= fraction & 0x000F;
/* 使能USART1 */
RCC->APB2ENR |= 1 << 14;
/* 使能PA */
RCC->APB2ENR |= 1 << 2;
/* PA9(TX)推挽输出50M PA10(RX)上拉输入 */
GPIOA->CRH &= 0xFFFFF00F;
GPIOA->CRH |= 0x000008B0;
/* 重启USART1 */
RCC->APB2RSTR |= 1 << 14;
RCC->APB2RSTR &= ~( 1 << 14 );
/* 置BAUD率 */
USART1->BRR = mantissa;
/* 使能USART1 使能接收和发送 8个数据位 无奇偶校验 */
USART1->CR1 = 0x200C;
/* 一个停止位 */
USART1->CR2 &= ~0x3000;
/* 处理接收 */
/* 开奇偶校验(PE)中断 */
USART1->CR1 |= 1 << 8;
/* 开接收区不空中断(RXNEIE) 也就是有数据就中断(包括过载 过载就是数据有了还来 多了) */
USART1->CR1 |= 1 << 5;
/* 两个优先级各2位 3 3 全是最低
通道为USART1_IRQn 对应处理函数为USART1_IRQHandler 在startup的汇编文件中 */
set_ir( 3, 3, USART1_IRQn );
}
void usart1_send( unsigned char* dat, unsigned int size )
{
unsigned int i;
while ( !( USART1->SR & ( 1 << 6 ) ) );
if ( !size )
{
for ( i = 0; dat; i ++ )
{
USART1->DR = dat;
while ( !( USART1->SR & ( 1 << 6 ) ) );
}
}
else
{
for ( i = 0; i < size; i ++ )
{
USART1->DR = dat;
while ( !( USART1->SR & ( 1 << 6 ) ) );
}
}
}
void USART1_IRQHandler( void )
{
unsigned char dr;
if ( USART1->SR & ( 1 << 5 ) )
{
dr = USART1->DR;
usart1_send((unsigned char*)&dr, 1);
}
}[/mw_shl_code]
请各位不吝赐教,谢谢了. |