新手上路
- 积分
- 26
- 金钱
- 26
- 注册时间
- 2021-10-24
- 在线时间
- 10 小时
|
1金钱
我仿照原子哥的例程,修改了hc05蓝牙的代码,可是蓝牙一直初始化失败好像是一直无法进入中断服务函数(我设定,进入一次中断服务函数,LED会闪一次)
usart2.h代码
extern UART_HandleTypeDef UART2_Handler;
#define USART2_MAX_RECV_LEN 200
#define USART2_MAX_SEND_LEN 200
#define USART2_RX_EN 1
extern u8 USART2_RX_BUF[USART2_MAX_RECV_LEN];
extern u8 USART2_TX_BUF[USART2_MAX_SEND_LEN];
extern u16 USART2_RX_STA;
#define BRXBUFFERSIZE 1
extern u8 bRxBuffer[BRXBUFFERSIZE];
void USART2_Init(u32 bound);
void u2_printf(char* fmt, ...);
#endif
usart2.c代码
UART_HandleTypeDef UART2_Handler;
__align(8) u8 USART2_TX_BUF[USART2_MAX_SEND_LEN];
#ifdef USART2_RX_EN
u8 USART2_RX_BUF[USART2_MAX_RECV_LEN];
u8 bRxBuffer[BRXBUFFERSIZE];
u16 USART2_RX_STA=0;
void USART2_Init(u32 bound)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_USART2_CLK_ENABLE();
__HAL_RCC_AFIO_CLK_ENABLE();
GPIO_Initure.Pin=GPIO_PIN_2;
GPIO_Initure.Mode=GPIO_MODE_AF_PP;
GPIO_Initure.Pull=GPIO_PULLUP;
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
GPIO_Initure.Pin=GPIO_PIN_3;
GPIO_Initure.Mode=GPIO_MODE_INPUT;
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
UART2_Handler.Instance=USART2;
UART2_Handler.Init.BaudRate=bound;
UART2_Handler.Init.WordLength=UART_WORDLENGTH_8B;
UART2_Handler.Init.StopBits=UART_STOPBITS_1;
UART2_Handler.Init.Parity=UART_PARITY_NONE;
UART2_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;
UART2_Handler.Init.Mode=UART_MODE_TX_RX;
HAL_UART_Init(&UART2_Handler);
HAL_UART_Receive_IT(&UART2_Handler, (u8 *)bRxBuffer, BRXBUFFERSIZE);
#ifdef USART2_RX_EN
HAL_NVIC_EnableIRQ(USART2_IRQn);
HAL_NVIC_SetPriority(USART2_IRQn,2,3);
#endif
TIM4_Init(99,7199);
USART2_RX_STA=0;
__HAL_TIM_DISABLE(&TIM4_Handler);
}
void u2_printf(char* fmt,...)
{
u16 i,j;
va_list ap;
va_start(ap,fmt);
vsprintf((char*)USART2_TX_BUF,fmt,ap);
va_end(ap);
i=strlen((const char*)USART2_TX_BUF);
printf("%s",USART2_TX_BUF);
for(j=0;j<i;j++)
{
while((USART2->SR&0X40)==0);
USART2->DR=USART2_TX_BUF[j];
}
}
void USART2_IRQHandler(void)
{
u8 res;
LED1=!LED1;//进入中断会闪烁LED灯一次
if(__HAL_UART_GET_FLAG(&UART2_Handler,UART_FLAG_RXNE)!=RESET)
{
res=USART2->DR;
if((USART2_RX_STA&(1<<15))==0)
{
if(USART2_RX_STA<USART2_MAX_RECV_LEN)
{
__HAL_TIM_SET_COUNTER(&TIM4_Handler,0);
if(USART2_RX_STA==0)
{
__HAL_TIM_ENABLE(&TIM4_Handler);
}
USART2_RX_BUF[USART2_RX_STA++]=res;
}else
{
USART2_RX_STA|=1<<15;
}
}
}
HAL_UART_IRQHandler(&UART2_Handler);
}
#endif
hc05初始化函数
u8 HC05_Init(void)
{
u8 retry=10,t;
u8 temp=1;
GPIO_InitTypeDef GPIO_InitStructure;
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitStructure.Pin = GPIO_PIN_4;
GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
GPIO_InitStructure.Pull = GPIO_PULLUP;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.Pin = GPIO_PIN_4;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP ;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,GPIO_PIN_SET);
USART2_Init(9600);
while(retry--)
{
HC05_KEY=1;
delay_ms(10);
u2_printf("AT\r\n"); //发送AT到串口2
HC05_KEY=0;
for(t=0;t<10;t++)
{
if(USART2_RX_STA&0X8000)break;
delay_ms(5);
}
if(USART2_RX_STA&0X8000) Ë
{
temp=USART2_RX_STA&0X7FFF;
USART2_RX_STA=0;
if(temp==4&&USART2_RX_BUF[0]=='O'&&USART2_RX_BUF[1]=='K')
{
temp=0;
break;
}
}
}
if(retry==0)temp=1;
return temp;
}
|
|