新手上路
- 积分
- 48
- 金钱
- 48
- 注册时间
- 2012-12-22
- 在线时间
- 1 小时
|

楼主 |
发表于 2013-3-15 16:17:20
|
显示全部楼层
回复【楼主位】shuuger:
---------------------------------
下面是串口3的初始化和中断处理函数
#ifdef EN_USART3_RX //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误
u8 USART3_RX_BUF[USART3_REC_LEN]; //串口3接收缓冲区,最大USART3_REC_LEN个字节,末字节为换行符
u8 USART3_RX_TEMP[USART3_REC_LEN]; //缓存串口3数据,全局变量
u16 usart3_rx_len; //串口3接收到的的字节数,全局变量
//接收状态
//bit7,接收完成标志
//bit6,接收到0x0d
//bit5~0,接收到的有效字节数目
u16 USART3_RX_STA=0; //串口3接收状态标记
u16 usart3_rx_cnt; //计数器
u16 as=0;
void USART3_IRQHandler(void)
{
u8 res;
if(USART3->SR&(1<<5))//接收到数据
{
res=USART3->DR;
if((USART3_RX_STA&0x8000)==0)//接收未完成
{
if(USART3_RX_STA&0x4000)//接收到了0x0d
{
if(res!=0x0a)
{
USART3_RX_STA=0;//接收错误,重新开始
}
else
{
as=0;
USART3_RX_STA|=0x8000; //接收完成了
usart3_rx_len=USART3_RX_STA&0x3fff; //获取接收到的数据长度
for(usart3_rx_cnt=0;usart3_rx_cnt<usart3_rx_len;usart3_rx_cnt++)//缓存串口数据
{
USART3_RX_TEMP[usart3_rx_cnt]=USART3_RX_BUF[usart3_rx_cnt];
}
}
}else //还没收到0X0D
{
if(res==0x0d)
{
USART3_RX_STA|=0x4000;
}
else
{
USART3_RX_BUF[USART3_RX_STA&0X3FFF]=res;
USART3_RX_STA++;
as++;
if(USART3_RX_STA>USART3_REC_LEN)USART3_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
}
#endif
//初始化IO 串口3
//pclk2 CLK2时钟频率(Mhz)
//bound:波特率
//CHECK OK
//091209
void usart3_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<<3; //使能PORTB口时钟
RCC->APB1ENR|=1<<18; //使能串口3时钟
// RCC->APB2ENR|=1<<0; //开启辅助时钟
// AFIO->MAPR&=0XFFFFFFE7; //清除MAPR的[26:24]
GPIOB->CRH&=0XFFFF00FF; //PB11-RX,PB10-TX
GPIOB->CRH|=0X00008B00;//IO状态设置
RCC->APB1RSTR|=1<<18; //复位串口3,只有串口1的寄存器在APB2RSTR中
RCC->APB1RSTR&=~(1<<18);//停止复位
//波特率设置
USART3->BRR=mantissa; // 波特率设置
USART3->CR1|=0X200C; //1位停止,无校验位.
//USART3->CR2&=0XCFFF; //1个停止位
#ifdef EN_USART3_RX //如果使能了接收
//使能接收中断
USART3->CR1|=1<<8; //PE中断使能
USART3->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(3,3,USART3_IRQChannel,2);//组2,抢占3,优先级2
#endif
} |
|