初级会员

- 积分
- 113
- 金钱
- 113
- 注册时间
- 2014-7-11
- 在线时间
- 0 小时
|

楼主 |
发表于 2014-10-9 09:04:25
|
显示全部楼层
程序
u8 HC05_1_Init(void)
{
u8 retry=10,t;
u8 temp=1;
RCC->APB2ENR|=1<<2; //使能PORTA时钟
RCC->APB2ENR|=1<<4; //使能PORTC时钟
// GPIOA->CRH&=0XFFFFFFF0; //PA8,输入
// GPIOA->CRH|=0X00000008;
// GPIOA->ODR|=1<<8; //PA8上拉
GPIOC->CRL&=0XFFFFFF0F; //PC1,推挽输出
GPIOC->CRL|=0X00000030;
GPIOC->ODR&=0<<1; //PC1输出0
uart_init(72,9600); //初始化串口1为:9600,波特率.
delay_ms(3000);
while(retry--)
{
HC05_1_KEY=1; //KEY置高,进入AT模式
delay_ms(100);
PrintChar("AT\r\n"); //发送AT测试指令
delay_ms(100);
HC05_1_KEY=0; //KEY拉低,退出AT模式
for(t=0;t<10;t++) //最长等待50ms,来接收HC05模块的回应
{
if(USART_RX_STA&0X8000)break;
delay_ms(5);
}
if(USART_RX_STA&0X8000) //接收到一次数据了
{
temp=USART_RX_STA&0X7FFF; //得到数据长度
USART_RX_STA=0;
if(temp==4&&USART_RX_BUF[0]=='O'&&USART_RX_BUF[1]=='K')
{
temp=0;//接收到OK响应
break;
}
}
}
if(retry==0)temp=1; //检测失败
return temp;
}
void uart_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状态设置
GPIOA->CRH|=0X000008B0;//IO状态设置
RCC->APB2RSTR|=1<<14; //复位串口1
RCC->APB2RSTR&=~(1<<14);//停止复位
//波特率设置
USART1->BRR=mantissa; // 波特率设置
USART1->CR1|=0X200C; //1位停止,无校验位.
#if EN_USART1_RX //如果使能了接收
//使能接收中断
USART1->CR1|=1<<8; //PE中断使能
USART1->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(3,3,USART1_IRQn,2);//组2,最低优先级
#endif
} |
|