TA的每日心情 | 奋斗 2024-9-22 22:20 |
---|
签到天数: 944 天 连续签到: 1 天 [LV.10]以坛为家III
|
一、方案名称
基于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和其中的某个引脚。- void USART1_Config(unsigned int bound)
- {
- GPIO_InitPara GPIO_InitStructure;
- USART_InitPara USART_InitStructure;
- NVIC_InitPara NVIC_InitStructure;
-
- RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_GPIOA,ENABLE);
-
- RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_USART1,ENABLE);
-
- GPIO_PinAFConfig(GPIOA,GPIO_PINSOURCE9,GPIO_AF_1);
-
- GPIO_PinAFConfig(GPIOA,GPIO_PINSOURCE10,GPIO_AF_1);
-
- GPIO_InitStructure.GPIO_Pin=GPIO_PIN_9|GPIO_PIN_10;
- GPIO_InitStructure.GPIO_Mode=GPIO_MODE_AF;
- GPIO_InitStructure.GPIO_Speed=GPIO_SPEED_50MHZ;
- GPIO_InitStructure.GPIO_OType=GPIO_OTYPE_PP;
- GPIO_InitStructure.GPIO_PuPd=GPIO_PUPD_NOPULL;
-
- GPIO_Init(GPIOA,&GPIO_InitStructure);
-
- NVIC_PRIGroup_Enable(NVIC_PRIGROUP_0);
-
- NVIC_InitStructure.NVIC_IRQ = USART1_IRQn;
- NVIC_InitStructure.NVIC_IRQPreemptPriority = 0;
- NVIC_InitStructure.NVIC_IRQSubPriority = 1;
- NVIC_InitStructure.NVIC_IRQEnable = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
-
- USART_DeInit(USART1);
-
- USART_InitStructure.USART_BRR=bound;
- USART_InitStructure.USART_WL=USART_WL_8B;
- USART_InitStructure.USART_STBits=USART_STBITS_1;
- USART_InitStructure.USART_Parity=USART_PARITY_RESET;
- USART_InitStructure.USART_HardwareFlowControl=USART_HARDWAREFLOWCONTROL_NONE;
- USART_InitStructure.USART_RxorTx=USART_RXORTX_RX|USART_RXORTX_TX;
-
- USART_Init(USART1,&USART_InitStructure);
-
- /* Enable the USART1 Receive interrupt */
- USART_INT_Set(USART1, USART_INT_RBNE, ENABLE );
- //USART_INT_Set(USART1, USART_INT_IDLEF, ENABLE );//¼ÓÕâ¾ä´úÂë»á³öÏÖÎÊÌ⣬½øÈëÖжϲ»ÄܳöÀ´
-
- USART_Enable(USART1,ENABLE);
- }
- void USART1_IRQHandler(void)
- {
- u8 res;
- if(USART1->STR&(1<<5))//½ÓÊÕµ½Êý¾Ý
- {
- //res=USART1->DR;
- res = USART_DataReceive(USART1) ;
- if(res=='A')
- GPIO_ToggleBits(GPIOB,GPIO_PIN_8);
-
- if(res=='B')
- GPIO_ToggleBits(GPIOB,GPIO_PIN_9);
-
-
- if(res=='D')
- TIMER_Compare3Config( TIMER2, 299);
- if(res=='E')
- TIMER_Compare3Config( TIMER2, 699);
- if(res=='F')
- TIMER_Compare3Config( TIMER2, 1599);
- }
- }
复制代码 在实际使用中,为了方便可以将printf函数重定向,有两种方法:
一、使用microlib,需要在工程中设置。
二、不需要使用microlib
代码如下:- struct __FILE
- {
- int handle;
- };
- FILE __stdout;
- //¶¨Òå_sys_exit()ÒÔ±ÜÃâʹÓðëÖ÷»úģʽ
- _sys_exit(int x)
- {
- x = x;
- }
- int fputc(int ch, FILE *f)
- {
- /* Place your implementation of fputc here */
- /* e.g. write a character to the USART */
- USART_DataSend( USART2 , (uint8_t) ch );
- /* Loop until transmit data register is empty */
- while ( USART_GetBitState( USART2 , USART_FLAG_TBE ) == RESET)
- {}
- return ch;
- }
复制代码 只不过,这次并没有使用printf函数。
回复本帖下载完整代码
|
|