7回答

2收藏

基于GD32F190的蓝牙LED控制

GD32 GD32 5915 人阅读 | 7 人回复 | 2016-06-11

一、方案名称
       基于GD32F190的蓝牙LED控制
二、简介
       GD32F190具有两个USART,USART2和板载的usb转串口相连接,还剩下USART1可以使用。蓝牙模块选用的是HC05。通过串口简单设置就可以使用。如果使用RGB三色LED,通过调节三个LED的亮度,会产生不同的颜色,可以控制的亮度级别越多,产生的颜色种类也就越多。小红板上有三颗与GPIO相连接的LED,但都是黄色的,就不能通过调节亮度来组合颜色。本方案中对两个LED是开关量控制,对另外一个是分为三种不同亮度进行调节。
三、设计
       首先,需要使用到的小红版的资源有GPIO、USART、TIMER、三颗LED。所使用的蓝牙模块由于没有引出改变模式的引脚,需要用上面的小按钮来控制,需要用手动操作,就没有再代码里加设置部分的设置。而是通过usb转串口与蓝牙模块相连接,用串口助手发送命令将蓝牙模块设置好。之后直接与小红板相连,实现透传。手机端需要安装蓝牙调试助手,我选择的是键盘模式。





      说到控制LED,不得不说GD32F190的独特之处。190的芯片多了GPIO电平反转寄存器,也不需要去判断之前的输出状态,也不用位带控制。很方便。在库函数中也提供了用于反转的函数
void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
见名知意,输入参数为不同组别GPIO和其中的某个引脚。
  1. void USART1_Config(unsigned int bound)
  2. {
  3.      GPIO_InitPara GPIO_InitStructure;
  4.     USART_InitPara USART_InitStructure;
  5.     NVIC_InitPara NVIC_InitStructure;
  6.         
  7.     RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_GPIOA,ENABLE);
  8.         
  9.     RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_USART1,ENABLE);
  10.         
  11.     GPIO_PinAFConfig(GPIOA,GPIO_PINSOURCE9,GPIO_AF_1);
  12.         
  13.     GPIO_PinAFConfig(GPIOA,GPIO_PINSOURCE10,GPIO_AF_1);
  14.                
  15.     GPIO_InitStructure.GPIO_Pin=GPIO_PIN_9|GPIO_PIN_10;
  16.     GPIO_InitStructure.GPIO_Mode=GPIO_MODE_AF;
  17.     GPIO_InitStructure.GPIO_Speed=GPIO_SPEED_50MHZ;
  18.     GPIO_InitStructure.GPIO_OType=GPIO_OTYPE_PP;
  19.     GPIO_InitStructure.GPIO_PuPd=GPIO_PUPD_NOPULL;
  20.         
  21.     GPIO_Init(GPIOA,&GPIO_InitStructure);
  22.         
  23.     NVIC_PRIGroup_Enable(NVIC_PRIGROUP_0);
  24.         
  25.     NVIC_InitStructure.NVIC_IRQ = USART1_IRQn;
  26.     NVIC_InitStructure.NVIC_IRQPreemptPriority = 0;
  27.     NVIC_InitStructure.NVIC_IRQSubPriority = 1;
  28.     NVIC_InitStructure.NVIC_IRQEnable = ENABLE;
  29.     NVIC_Init(&NVIC_InitStructure);
  30.                
  31.     USART_DeInit(USART1);
  32.         
  33.     USART_InitStructure.USART_BRR=bound;
  34.     USART_InitStructure.USART_WL=USART_WL_8B;
  35.     USART_InitStructure.USART_STBits=USART_STBITS_1;
  36.     USART_InitStructure.USART_Parity=USART_PARITY_RESET;
  37.     USART_InitStructure.USART_HardwareFlowControl=USART_HARDWAREFLOWCONTROL_NONE;
  38.     USART_InitStructure.USART_RxorTx=USART_RXORTX_RX|USART_RXORTX_TX;
  39.         
  40.     USART_Init(USART1,&USART_InitStructure);
  41.         
  42.     /* Enable the USART1 Receive interrupt */
  43.    USART_INT_Set(USART1, USART_INT_RBNE, ENABLE );
  44.           //USART_INT_Set(USART1, USART_INT_IDLEF, ENABLE );//???????ú???á??????????????????????????
  45.         
  46.         USART_Enable(USART1,ENABLE);
  47. }

  48. void USART1_IRQHandler(void)
  49. {
  50.               u8 res;        
  51.         if(USART1->STR&(1<<5))//??????????
  52.         {         
  53.                 //res=USART1->DR;
  54.                 res = USART_DataReceive(USART1) ;
  55.                 if(res=='A')
  56.                         GPIO_ToggleBits(GPIOB,GPIO_PIN_8);
  57.                
  58.                 if(res=='B')
  59.                         GPIO_ToggleBits(GPIOB,GPIO_PIN_9);
  60.         
  61.                
  62.                 if(res=='D')
  63.                                 TIMER_Compare3Config( TIMER2, 299);
  64.                 if(res=='E')
  65.                                 TIMER_Compare3Config( TIMER2, 699);
  66.                 if(res=='F')
  67.                                 TIMER_Compare3Config( TIMER2, 1599);
  68.         }
  69. }
复制代码
在实际使用中,为了方便可以将printf函数重定向,有两种方法:
一、使用microlib,需要在工程中设置。
二、不需要使用microlib
代码如下:
  1. struct __FILE
  2. {
  3.         int handle;

  4. };

  5. FILE __stdout;      
  6. //?¨??_sys_exit()??±???????°??÷?ú????   
  7. _sys_exit(int x)
  8. {
  9.         x = x;
  10. }
  11. int fputc(int ch, FILE *f)
  12. {
  13.     /* Place your implementation of fputc here */
  14.     /* e.g. write a character to the USART */
  15.     USART_DataSend( USART2 , (uint8_t) ch );

  16.     /* Loop until transmit data register is empty */
  17.     while ( USART_GetBitState( USART2 , USART_FLAG_TBE ) == RESET)
  18.     {}

  19.     return ch;
  20. }
复制代码
只不过,这次并没有使用printf函数。

回复本帖下载完整代码

游客,如果您要查看本帖隐藏内容请回复
分享到:
回复

使用道具 举报

回答|共 7 个

倒序浏览

沙发

糖悦之果飞

发表于 2016-6-12 10:58:42 | 只看该作者

不错,赞一个!
板凳

康仔呦

发表于 2016-6-12 16:32:12 | 只看该作者

能不能看下,为什么我这个存在这种问题?https://www.cirmall.com/bbs/thread-47866-1-1.html
地板

糖悦之果飞

发表于 2016-6-29 09:10:21 | 只看该作者

文章不错,将内容去经验频道一并发一下,可以有双重奖励哟http://jingyan.eeboard.com/
5#

lukobe

发表于 2016-6-29 09:14:52 | 只看该作者

楼主分享的赞赞赞
6#

戏如人生

发表于 2016-7-7 23:23:52 | 只看该作者

赞一个!!!!
7#

jackliu-417543

发表于 2017-4-19 14:29:28 | 只看该作者

不错赞一个!
8#

zhq0510

发表于 2017-11-27 09:52:08 | 只看该作者


不错,赞一个!
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条