Подключил HC-06 к STM32F100 по USART (выводы PA9, PA10)
Модуль включается.
К нему успешно подключается смартфон.
Смартфон на андроиде с установленным bluetooth терминалом.
Данные принимает.
При передаче символа, прерывание срабатывает 6-7 раз.
При этом выводит непонятные числа.
Вот к прмеру при вводе на терминале символа "z", в USART1->DR считываю вот такой массив:
120.128.248.120.248.0.128
При этом код состояния USART1->SR везде 128.
Может кто знает что не так ?
Код:
#include "stm32f10x.h"
#include "mcu_gpio.h"
void usart_init_2 (void) {
RCC->CR|=RCC_CR_HSEON; // Включить генератор HSE.
while (!(RCC->CR & RCC_CR_HSERDY)) {} // Ожидание готовности HSE.
RCC->CFGR &=~RCC_CFGR_SW; // Очистить биты SW0, SW1.
RCC->CFGR |= RCC_CFGR_SW_HSE; // Выбрать HSE для тактирования SW0=1.
RCC->APB2ENR|= RCC_APB2ENR_IOPAEN; // Разрешить тактирование порта A.
RCC->APB2ENR|= RCC_APB2ENR_AFIOEN; // Тактирование альтернативных функций GPIO.
RCC->APB2ENR|= RCC_APB2ENR_USART1EN; // Включение тактирования USART1.
GPIOA->CRH |= GPIO_CRH_MODE9; // Вывод TX PA.9 - на выход.
GPIOA->CRH &=~GPIO_CRH_CNF9; GPIOA->CRH |=GPIO_CRH_CNF9_1; // Альтернативный выход.
USART1->CR1 |=(USART_CR1_RE | USART_CR1_TE); // Разрешить выводы RX, TX.
// Скорость 115.2 kbps. USARTDIV=FSYS/(16*baud) = 8e6/(16*115200)=4.34.
// USART1->BRR=(4<<4); // Целая часть коэффициента деления USART1.
// USART1->BRR|=5; // Дробная часть*16 = 0,34*16 = 5 (окр).
USART1->BRR=(13<<4); // Целая часть коэффициента деления USART1.
USART1->BRR|=0; // Дробная часть*16 = 0,34*16 = 5 (окр).
USART1->CR1 |=USART_CR1_UE; // Включение USART1.
// Затем задаем событие(я), которые будут генерить прерывания:
USART1->CR1 |= USART_CR1_TCIE; //прерывание по окончанию передачи
USART1->CR1 |= USART_CR1_RXNEIE; //прерывание по приему данных
NVIC_EnableIRQ (USART1_IRQn); //разрешить прерывания от USART1
}
// выполнение
int main (void) {
usart_init_2 ();
while (1)
{
}
}
// USART interrupt
void USART1_IRQHandler(void)
{
unsigned char tmp;
//
if((USART1->SR & USART_SR_RXNE)!=0)
{
tmp = USART1->DR; //прочитать принятый байт
}
//если причина прерывания окончание передачи
if((USART1->SR & USART_SR_TC)!=0)
{
USART1->SR &= ~USART_SR_TC; //очистить флаг
}
}