用STM32自制鼠标

单片机 同时被 2 个专栏收录
4 篇文章 0 订阅
3 篇文章 0 订阅

一. 说明

1. 功能说明
        通过手机控制电脑,手机作为鼠标,通过手机蓝牙与STM32外接的HC06模块相连。手机界面类似笔记本的触摸板,无滚轮(中间)功能。
2. 硬件&软件:
        硬件
              --七星虫德飞莱STM32F103ZET6最小系统一块
              --HC06蓝牙模块一块
              --MiniUSB数据线一根
        软件
              --Windows10 + Keil4
              --STM32的JoyStickMouse例程
              --基于Android的鼠标APP
3.鼠标数据格式
   鼠标数据共4字节,解释如下:
       byte1:
                bit0:    1表示左键按下
                bit1:    1表示右键按下
       byte2:x移动量(-128——127)
       byte3:y移动量(-128——127)
       byte4:滚轮移动量(这里未使用),恒为0

二. 代码修改过程

 1.因为HC06模块通过UART与STM32相连,所以应初始化UART,写出中断服务函数。此处使用STM32的USART2。

USART2配置代码如下:
 
void UART2_Configuration(void){
	
	GPIO_InitTypeDef GPIO_USART2; 
	USART_InitTypeDef USART_InitStructure;	  
	NVIC_InitTypeDef NVIC_InitStructure;

	//开启USART2和GPIOA的时钟(因为USART2的TX和RX都在GPIOA)
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); 

	//配置USART2的TX(PA2)和RX(PA3)
	GPIO_USART2.GPIO_Pin 		= GPIO_Pin_2;
	GPIO_USART2.GPIO_Speed 		= GPIO_Speed_50MHz;
	GPIO_USART2.GPIO_Mode		= GPIO_Mode_AF_PP;
	GPIO_Init(GPIOA, &GPIO_USART2);

	GPIO_USART2.GPIO_Pin		= GPIO_Pin_3;
	GPIO_USART2.GPIO_Mode		= GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOA, &GPIO_USART2);

	//配置USART2,波特率115200,8位,停止位1位,无校验,无硬件流控,使用发送和接受
	USART_InitStructure.USART_BaudRate = 115200;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_HardwareFlowControl =	USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
	USART_Init(USART2, &USART_InitStructure);

	//使能USART2
	USART_Cmd(USART2, ENABLE);
	//开启USART2的接收中断
	USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); 

	//配置USART2的接收中断
	NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);		   
}

USART2中断服务函数:
void USART2_IRQHandler(){

	if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET){
		//把接收到的数据存到缓冲区中
		Mouse_Buffer[index] = USART_ReceiveData(USART2);
		index++;	
		//因为鼠标数据格式为4字节,故当4字节够了后,就对标志置为(在main中会循环检测标志)	
		if(index == 4)
			flag = 1;
		//等待清中断标志
		USART_ClearITPendingBit(USART2,USART_IT_RXNE);
	}
}
2. 因为原样例中发送数据函数(Joystick_Send)不适用,故再其基础上,写出自己的发送数据函数。
发送数据函数(Mouse_Send)代码如下:
void Mouse_Send(uint8_t Mouse_Buffer[4])
{
  PrevXferComplete = 0;
  USB_SIL_Write(EP1_IN, Mouse_Buffer, 4);  //这一步里,把数据拷贝到USB缓冲区
  SetEPTxValid(ENDP1);
}

3. main函数,直接贴代码。
int main(void)
{			
  UART2_Configuration();
  Set_System();	  
  USB_Interrupts_Config();			 
  Set_USBClock();		  
  USB_Init();			
  	
  while (1)
  {
	if (bDeviceState == CONFIGURED){
	  	if(flag){
			flag=0;
			index=0;
			Mouse_Send(Mouse_Buffer);
		}  
	}
  }
}

3. 下载调试
     下载运行后,通过USB线连接至电脑,会自动完成枚举。安装手机端软件(http://download.csdn.net/detail/u013771867/9520422);


至此完成!!
另附
Android端APP源码:http://download.csdn.net/detail/u013771867/9520431
STM32的一大堆USB样例:http://download.csdn.net/detail/u013771867/9520437


另外,写的比较仓促,没说清楚或可改进的地方欢迎评论交流。


  • 7
    点赞
  • 5
    评论
  • 19
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值