新手上路
- 积分
- 42
- 金钱
- 42
- 注册时间
- 2014-3-9
- 在线时间
- 0 小时
|
原子大哥,我用你们的GPS模块和旗舰板子,按照教程用USART2是没问题,但直接接USART3就没反应,下面是我贴出的代码,完全仿照USART2写的。
__align(8) u8 USART3_TX_BUF[USART3_MAX_SEND_LEN];
#ifdef USART3_RX_EN
u8 USART3_RX_BUF[USART3_MAX_RECV_LEN];
u16 USART3_RX_STA=0;
void USART3_IRQHandler(void)
{
u8 res;
if(USART3->SR&(1<<5))//??????????
{
res=USART3->DR;
if(USART3_RX_STA<USART3_MAX_RECV_LEN) //??????????????
{
TIM4->CNT=0; //?????÷????
if(USART3_RX_STA==0)TIM4_Set2(1); //?????¨?±?÷4??????
USART3_RX_BUF[USART3_RX_STA++]=res; //??????????????
}else
{
USART3_RX_STA|=1<<15; //????±ê???????ê??
}
}
}
void USART3_Init(u32 pclk1,u32 bound)
{
RCC->APB2ENR|=1<<8; //????PORTG???±??
GPIOG->CRH&=0XFFFFFF0F; //IO×????è??
GPIOG->CRH|=0X00000030; //IO×????è??
RCC->APB2ENR|=1<<3; //????PORTA???±??
GPIOB->CRH&=0XFFFF00FF; //IO×????è??
GPIOB->CRH|=0X00008B00; //IO×????è??
RCC->APB1ENR|=1<<18; //?????????±??
RCC->APB2RSTR|=1<<18; //????????2
RCC->APB1RSTR&=~(1<<18);//????????
//?¨?????è??
USART3->BRR=(pclk1*1000000)/(bound);// ?¨?????è??
USART3->CR1|=0X200C; //1??????,?????é??.
USART3->CR3=1<<7; //????????2??DMA·???
UART_DMA_Config2(DMA1_Channel7,(u32)&USART3->DR,(u32)USART3_TX_BUF);//DMA1?¨??7,???è??????2,?????÷??USART2_TX_BUF
#ifdef USART3_RX_EN //??????????????
//????????????
USART3->CR1|=1<<8; //PE????????
USART3->CR1|=1<<5; //??????????·???????????
MY_NVIC_Init(2,3,USART3_IRQn,2);//×é2??×?????????
TIM4_Init2(99,7199); //10ms????
USART3_RX_STA=0; //????
TIM4_Set2(0); //??±??¨?±?÷4
#endif
}
void u3_printf(char* fmt,...)
{
va_list ap2;
va_start(ap2,fmt);
vsprintf((char*)USART3_TX_BUF,fmt,ap2);
va_end(ap2);
while(DMA1_Channel7->CNDTR!=0); //?????¨??7?????ê??
UART_DMA_Enable2(DMA1_Channel7,strlen((const char*)USART3_TX_BUF)); //?¨??dma·???????
}
void TIM4_IRQHandler2(void)
{
if(TIM4->SR&0X01)//???ü??????
{
USART3_RX_STA|=1<<15; //±ê???????ê??
TIM4->SR&=~(1<<0); //????????±ê????
TIM4_Set2(0); //??±?TIM4
}
}
void TIM4_Set2(u8 sta)
{
if(sta)
{
TIM4->CNT=0; //?????÷????
TIM4->CR1|=1<<0; //?????¨?±?÷4
}else TIM4->CR1&=~(1<<0);//??±??¨?±?÷4
}
void TIM4_Init2(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<2; //TIM4?±??????
TIM4->ARR=arr; //?è?¨?????÷×?????×°??
TIM4-> SC=psc; //?¤·????÷
TIM4->DIER|=1<<0; //???í?ü??????
TIM4->CR1|=0x01; //?????¨?±?÷4
MY_NVIC_Init(1,3,TIM4_IRQn,2);//????2??×???????3??×é2 ??2????????×???
}
#endif
void UART_DMA_Config2(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar)
{
RCC->AHBENR|=1<<0; //????DMA1?±??
delay_us(5);
DMA_CHx->CPAR=cpar; //DMA1 ???è???·
DMA_CHx->CMAR=cmar; //DMA1,?????÷???·
DMA_CHx->CCR=0X00000000; //????
DMA_CHx->CCR|=1<<4; //???????÷??
DMA_CHx->CCR|=0<<5; //???¨????
DMA_CHx->CCR|=0<<6; //???è???··?????????
DMA_CHx->CCR|=1<<7; //?????÷????????
DMA_CHx->CCR|=0<<8; //???è?????í????8??
DMA_CHx->CCR|=0<<10; //?????÷?????í??8??
DMA_CHx->CCR|=1<<12; //??????????
DMA_CHx->CCR|=0<<14; //·??????÷???????÷????
}
//????????DMA????
void UART_DMA_Enable2(DMA_Channel_TypeDef*DMA_CHx,u8 len)
{
DMA_CHx->CCR&=~(1<<0);
DMA_CHx->CNDTR=len;
DMA_CHx->CCR|=1<<0;
}
在主函数里面直接
把原本2换成3
USART3_Init(36,38400); |
|