Не передаются данные по USART

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Аватара пользователя
FireProoF
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Чт май 14, 2015 15:11:39
Откуда: Саратов

Не передаются данные по USART

Сообщение FireProoF »

Здравствуйте! Возникла проблема с передачей данных по USART с STM32 на Android. Именно с передачей, так как с получение данных по Bluetooth все норм. Т.е. на stm32 данные приходят, а с STM32 на Android - нет.
Вот код:
Спойлер

Код: Выделить всё

#include "stm32f10x_usart.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "misc.h"
 
int i;
 
//ErrorStatus HSEStartUpStatus;
 
void NVIC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(void);
void USART1_IRQHandler(void);
void UARTSend(const unsigned char *pucBuffer, unsigned long ulCount);
void usart_rxtx(void);

int main(void)
{
    usart_rxtx();
    while(1)
    {
			UARTSend("Hello!", sizeof("Hello!"));
			for(int i = 0; i <= 800000; i++)	__nop();
			USART_SendData(USART2, 0xFF);
			for(int i = 0; i <= 800000; i++)	__nop();
    }
}
 
/******************************************************************************/
/*            STM32F10x Peripherals Interrupt Handlers                        */
/******************************************************************************/
 
/**
  * @brief  This function handles USARTx global interrupt request
  * @param  None
  * @retval None
  */
void USART1_IRQHandler(void)
{
    if ((USART1->SR & USART_FLAG_RXNE) != (u16)RESET)
    {
        i = USART_ReceiveData(USART1);
        if(i == '1'){
            GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);        // Set '1' on PA8
            UARTSend("LED ON\r\n",sizeof("LED ON\r\n"));    // Send message to UART1
        }
        else if(i == '0'){
            GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);      // Set '0' on PA8
            UARTSend("LED OFF\r\n",sizeof("LED OFF\r\n"));
        }
    }
}
 
void usart_rxtx(void)
{
    const unsigned char welcome_str[] = " Welcome to Bluetooth!\r\n";
 
    /* Enable USART1 and GPIOA clock */
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
		/* Remap USART1: TX -> PB6, RX -> PB7 */
		GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOC, ENABLE);
 
    /* NVIC Configuration */
    NVIC_Configuration();
 
    /* Configure the GPIOs */
    GPIO_Configuration();
 
    /* Configure the USART1 */
    USART_Configuration();
 
    /* Enable the USART1 Receive interrupt: this interrupt is generated when the
         USART1 receive data register is not empty */
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
 
    /* print welcome information */
    UARTSend(welcome_str, sizeof(welcome_str));
}
 
/*******************************************************************************
* Function Name  : GPIO_Configuration
* Description    : Configures the different GPIO ports
*******************************************************************************/
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
 
  /* Configure (PC.13) as output */
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_13;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOC, &GPIO_InitStructure); // Save
 
  /* Configure USART1 Tx (PB.06) as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
 
  /* Configure USART1 Rx (PB.07) as input floating */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}
 
/*******************************************************************************
* Function Name  : USART_Configuration
* Description    : Configures the USART1
*******************************************************************************/
void USART_Configuration(void)
{
  USART_InitTypeDef USART_InitStructure;
 
/* USART1 configuration ------------------------------------------------------*/
  USART_InitStructure.USART_BaudRate = 9600;        // Baud Rate
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
 
  USART_Init(USART1, &USART_InitStructure);
 
  /* Enable USART1 */
  USART_Cmd(USART1, ENABLE);
}
 
/**
  * @brief  Configures the nested vectored interrupt controller.
  * @param  None
  * @retval None
  */
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
 
  /* Enable the USARTx Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}
 
/*******************************************************************************
* Function Name  : UARTSend
* Description    : Send a string to the UART.
* Input          : - pucBuffer: buffers to be printed.
*                : - ulCount  : buffer's length
*******************************************************************************/
void UARTSend(const unsigned char *pucBuffer, unsigned long ulCount)
{
    //
    // Loop while there are more characters to send.
    //
    while(ulCount--)
    {
        USART_SendData(USART1, (uint16_t) *pucBuffer++);
        /* Loop until the end of transmission */
        while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
        {
        }
    }
}
Пытался передавать двумя функциями сразу - не работает. Принимаю данные по Android телефону. Пробовал два разных телефона.
Кабели не перебиты. Во время соединения Bluetooth модуль HC-05 прерывисто мигает.
Подключал модуль напрямую к плате с МК. Может надо через подтяжку как здесь?
Проверил пайку на плате. Пайка в норме
Реклама
BorisSPB
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

Re: Не передаются данные по USART

Сообщение BorisSPB »

А где включение тактирования GPIOB?
Реклама
Аватара пользователя
FireProoF
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Чт май 14, 2015 15:11:39
Откуда: Саратов

Re: Не передаются данные по USART

Сообщение FireProoF »

BorisSPB писал(а):А где включение тактирования GPIOB?
Ох и правда) Думал, что тактирования UART хватит)
Затактировал порт B. Теперь данные отсылаются с stm32, но не принимаются) :shock:
Отлаживаю код, отсылаю МК с терминала данные, код в входит в обработчик прерывания, но не выполняется это условие:
if ((USART1->SR & USART_FLAG_RXNE) != (u16)RESET)

Да и, сразу после входа в прерывание, код переходит в функцию void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT)
В своём коде я переместил эту функцию в конец, но всё равно она вызывается первой.

Всё ребят, походу разобрался) Нескомпилировал код и полез в отладку)
P.S. Всем спасибо
arteomng
Открыл глаза
Сообщения: 64
Зарегистрирован: Сб апр 19, 2014 19:25:20

Re: Не передаются данные по USART

Сообщение arteomng »

Всем привет!
Возникла проблема с передачей данных по UART.
Суть: есть контроллер ATmega8A PU, нужно от него передавать данные на компьютер.
Есть два потенциальных переходника: 1-й от старого телефона Samsung SGH-X640 на базе PL2303;
2-й вот такой
Спойлерhttps://www.winford.com/products/uiaser.php
При проверке каждого в отдельности программой Terminal (замыкаю RxD на TxD, посылаю данные, данные приходят) они работают.
При отправке данных с одного переходника на другой - дуля :(. То же если их подключить к мк.

Подскажите, можно их прикрутить к мк или без MAX232 не обойтись? Или посоветуйте другой вариант пожалуйста...
Реклама
Эиком - электронные компоненты и радиодетали
arteomng
Открыл глаза
Сообщения: 64
Зарегистрирован: Сб апр 19, 2014 19:25:20

Re: Не передаются данные по USART

Сообщение arteomng »

Вот такое чудо
Спойлерhttp://ru.aliexpress.com/item/USB-to-TT ... 3.2.7UClCN
Как работает?
Реклама
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Re: Не передаются данные по USART

Сообщение Myp3ik »

Иван Сусанин - первый полупроводник :solder:
Реклама
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Не передаются данные по USART

Сообщение dosikus »

arteomng писал(а):Всем привет!
Возникла проблема с передачей данных по UART.
Суть: есть контроллер ATmega8A PU, нужно от него передавать данные на компьютер.
И причем здесь ARM? :)))
Есть куча способов .
От USB<->UART на FT232RL и CH340G-CH340( исключая PL2303 - ибо г*** несусветное) , до bridge на Wifi и Bluetooth( ESP8266 и HC-0x)
Последние весьма вкусные ибо изначально изолированы гальванически.
arteomng
Открыл глаза
Сообщения: 64
Зарегистрирован: Сб апр 19, 2014 19:25:20

Re: Не передаются данные по USART

Сообщение arteomng »

dosikus
ARM тут действительно не причем... тут причем Не передаются данные по USART :))
Спасибо за сообщение!
Вот уже заказал такую штуку (на CH340G)
Спойлерhttp://ru.aliexpress.com/item/CH340-mod ... 59382.html
Еще думаю заказать такую как вы советуете ESP8266
Спойлерhttp://ru.aliexpress.com/item/Free-ship ... 3.2.a7DAIP
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Не передаются данные по USART

Сообщение dosikus »

Ответить

Вернуться в «ARM»