查看: 451|回复: 5

[GD32F190方案分享] 基于GD32F190的蓝牙LED控制

[复制链接]

10

主题

0

好友

2175

积分

进士

Rank: 5Rank: 5

  • TA的每日心情
    奋斗
    9 小时前
  • 签到天数: 470 天

    [LV.9]以坛为家II

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


    Screenshot_2016-06-11-15-24-51.jpg


    QQ图片20160611153142.png

          说到控制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函数。

    回复本帖下载完整代码

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

    使用道具 举报

    195

    主题

    3

    好友

    9626

    积分

    超级版主

    Rank: 8Rank: 8

    该用户从未签到

    发表于 2016-6-12 10:58:42 |显示全部楼层
    不错,赞一个!
    回复

    使用道具 举报

    5

    主题

    0

    好友

    90

    积分

    童生

    Rank: 2

  • TA的每日心情
    开心
    2016-5-11 12:27
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2016-6-12 16:32:12 |显示全部楼层
    能不能看下,为什么我这个存在这种问题?http://www.eeboard.com/bbs/thread-47866-1-1.html
    回复

    使用道具 举报

    195

    主题

    3

    好友

    9626

    积分

    超级版主

    Rank: 8Rank: 8

    该用户从未签到

    发表于 2016-6-29 09:10:21 |显示全部楼层
    文章不错,将内容去经验频道一并发一下,可以有双重奖励哟http://jingyan.eeboard.com/
    回复

    使用道具 举报

    38

    主题

    0

    好友

    418

    积分

    秀才

    Rank: 3Rank: 3

    该用户从未签到

    发表于 2016-6-29 09:14:52 |显示全部楼层
    楼主分享的赞赞赞
    回复

    使用道具 举报

    9

    主题

    0

    好友

    658

    积分

    举人

    Rank: 4

  • TA的每日心情
    开心
    2016-9-23 23:16
  • 签到天数: 101 天

    [LV.6]常住居民II

    发表于 2016-7-7 23:23:52 |显示全部楼层
    赞一个!!!!
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

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


    手机版|爱板网 |网站地图  

    GMT+8, 2016-12-5 18:38 , Processed in 0.110733 second(s), 15 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部