中级会员
 
- 积分
- 419
- 金钱
- 419
- 注册时间
- 2013-12-6
- 在线时间
- 46 小时
|

楼主 |
发表于 2014-9-26 11:41:03
|
显示全部楼层
回复【2楼】冷焰寒冰:
---------------------------------
//串口初始化
void usart3_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<<3; //使能PORTB口时钟
RCC->APB1ENR|=1<<18; //使能串口时钟
GPIOB->CRH&=0XFFFF00FF;//IO状态设置,PB10,PB11
GPIOB->CRH|=0X00008B00;//IO状态设置
RCC->APB1RSTR|=1<<18; //复位串口2
RCC->APB1RSTR&=~(1<<18);//停止复位
//波特率设置
USART3->BRR=mantissa; // 波特率设置
USART3->CR1|=0X200C; //1位停止,无校验位.
//使能接收中断
USART3->CR1|=1<<8; //PE中断使能
USART3->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(0,1,USART3_IRQn,2),
}
//串口中断接收
void USART3_IRQHandler(void)
{
OSIntEnter();
enter_int_num++;//进入中断的次数
if(USART3->SR&(1<<5))//接收到数据
{
if(recv_count>=RECV_SIZE){
recv_count = 0;
}
recv_buff[recv_count++] = USART3->DR;//循环接收
OSSemPost(recv_sem);
}
OSIntExit();
}
不好意思,我开启了usart3的中断接收功能,初始化usart3的波特率为19200,8位数据位,无校验位,1个停止位,发送(saveOK),发现usart3接收有时候会丢失数据,检查usart3中断进入次数,发现也不对。 |
|