Estoy intentando obtener un Módulo Bluetooth HC-05 que trabaja con el módulo stm32f103c8t6 ( píldora azul ). Usé este usb para el módulo en serie para probar cada una de las placas mencionadas y esta aplicación de Android para conectarse a bluetooth. Tanto STM32 como HC05 funcionan bien individualmente. Puedo enviar y recibir datos a través de la aplicación serial y Android sin problemas a una velocidad de 9600 (usando USART1 de stm32f103).
ElproblemaesquecuandoconectoelHC05yelmicrocontrolador,nofunciona.ElmicropuederecibirdatosdeBluetooth(loséporqueenciendeyapagaelLED)peronopuedoverningúndatorecibidoenmiteléfonoAndroid.Aquíestámicódigo(elcódigosecompilayflasheaconCoocoxIDE):
#include"stm32f103xb.h"
#include <stdlib.h>
#include <stdio.h>
#include "STM32_USART.h"
int main(void)
{
// Configure system clock and prescalers
RCC->CR |= RCC_CR_HSION;
// Wait till HSI is ready
while((RCC->CR & RCC_CR_HSIRDY) != RCC_CR_HSIRDY){}
RCC->CFGR &= ~(RCC_CFGR_HPRE); // set AHB prescaler to 1
RCC->CFGR = ((RCC->CFGR & ~(RCC_CFGR_PPRE1)) | RCC_CFGR_PPRE1_DIV2); // set APB1 prescaler to 2 (PCLK1)
RCC->CFGR = ((RCC->CFGR & ~(RCC_CFGR_PPRE2)) | RCC_CFGR_PPRE2_DIV1); // set APB2 prescaler to 1 (PCLK2)
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // Enable Port A
// Configure a pin for LED
GPIOA->CRL |= GPIO_CRL_MODE1;
GPIOA->CRL &= ~GPIO_CRL_CNF1;
GPIOA->BSRR |= GPIO_BSRR_BS1;
// Initialize USART1 communication
usart_init();
while(1){
char data = usartByteReceive();
// usartByteSend(85);
// char data = ' ';
if(data == '1')
{
// Turn LED on
GPIOA->BSRR |= GPIO_BSRR_BS1;
usartByteSend('F'); // send F
usartByteSend('\r');
usartByteSend('\n');
}
else if(data == '0')
{
// Turn LED off
GPIOA->BRR |= GPIO_BRR_BR1;
usartByteSend('S'); // send S
usartByteSend('\r');
usartByteSend('\n');
}
}
}
Después de esto, pensé que tal vez el problema es el reloj del sistema, así que cambié a PLL clock para el reloj del sistema usando un cristal externo de 8MHz (incorporado en el módulo) para tener un reloj más preciso, pero sin suerte: \
Aquí está el código para eso:
#include "stm32f103xb.h"
#include <stdlib.h>
#include <stdio.h>
#include "STM32_USART.h"
int main(void)
{
// Configure system clock and prescalers
// Set the HSE on
RCC->CR |= RCC_CR_HSEON;
// Wait till HSE is ready
while((RCC->CR & RCC_CR_HSERDY) != RCC_CR_HSERDY){}
// Set HSI on
RCC->CR |= RCC_CR_HSION;
// Wait till HSI is ready
while((RCC->CR & RCC_CR_HSIRDY) != RCC_CR_HSIRDY){}
// Disable the PLL
RCC->CR &= ~RCC_CR_PLLON;
// Wait till main PLL is disabled
while((RCC->CR & RCC_CR_PLLRDY) == RCC_CR_PLLRDY){}
// Configure the HSE prediv factor
// It can be written only when the PLL is disabled. Not used in PLL source is different than HSE
RCC->CFGR &= ~RCC_CFGR_PLLXTPRE;
RCC->CFGR = (RCC->CFGR & ~(RCC_CFGR_PLLMULL | RCC_CFGR_PLLSRC)) | (RCC_CFGR_PLLMULL2 | RCC_CFGR_PLLSRC);
// Enable the PLL
RCC->CR |= RCC_CR_PLLON;
// Wait till main PLL is enabled
while((RCC->CR & RCC_CR_PLLRDY) != RCC_CR_PLLRDY){}
// SYSTEM CLOCK
FLASH->ACR = (FLASH->ACR & ~(FLASH_ACR_LATENCY)) | FLASH_ACR_LATENCY_1;
RCC->CFGR &= ~(RCC_CFGR_HPRE); // set AHB prescaler to 1
RCC->CFGR |= RCC_CFGR_SW_PLL; // set SYSCLK to PLL source
// wait till system clock is set to PLL
while((RCC->CFGR & RCC_CFGR_SWS_PLL) != RCC_CFGR_SWS_PLL){}
RCC->CFGR = ((RCC->CFGR & ~(RCC_CFGR_PPRE1)) | RCC_CFGR_PPRE1_DIV2); // set APB1 prescaler to 2 (PCLK1)
RCC->CFGR = ((RCC->CFGR & ~(RCC_CFGR_PPRE2)) | RCC_CFGR_PPRE2_DIV1); // set APB2 prescaler to 1 (PCLK2)
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // Enable Port A
// Configure a pin for LED
GPIOA->CRL |= GPIO_CRL_MODE1;
GPIOA->CRL &= ~GPIO_CRL_CNF1;
GPIOA->BSRR |= GPIO_BSRR_BS1;
// Initialize USART1 communication
usart_init();
while(1){
char data = usartByteReceive();
// usartByteSend(85);
// char data = ' ';
if(data == '1')
{
// Turn LED on
GPIOA->BSRR |= GPIO_BSRR_BS1;
usartByteSend('F'); // Send F
usartByteSend('\r');
usartByteSend('\n');
}
else if(data == '0')
{
// Turn LED off
GPIOA->BRR |= GPIO_BRR_BR1;
usartByteSend('S'); // Send S
usartByteSend('\r');
usartByteSend('\n');
}
}
}
¿Tienen alguna idea de lo que está mal?
Creo que vale la pena mencionar que quería ver si el micro está enviando algo o no, conecté el usb al módulo serial al USART1 mientras que el bluetooth también estaba conectado al USART1. Después de esto, pude enviar y recibir datos desde el microcontrolador en mi aplicación de Android, pero no pude enviar ni recibir nada en mi computadora a través de usb al módulo en serie.: \
¿Hay algún problema con el voltaje? (He conectado bluetooth a 5v y 3.3v de STM32, no hay diferencia)