Перейти к содержанию
    

usart stm32l

Добрый день!

Неполучается уже второй день запустить USART на STM32L-DISCOVERY Среда Coocox

Логическим анализатором смотрю нету ничего...

РА 2Tx

PA 3Rx

 

КОД:

#include "stm32l1xx_gpio.h"
#include "stm32l1xx_rcc.h"
#include "stm32l1xx.h"
#include "misc.h"
#include "stm32l1xx_usart.h"



void Usart1_Transmit(uint8_t); //Объявление функции передачи символа через USART
void Usart1_Transmit_str(char* str); //Объявление функции передачи строки через USART
void usart(void);

void RCC_Configuration(void)
{
 SystemInit(); // Сброс по умолчанию
 GPIO_DeInit(GPIOA);
 GPIO_DeInit(GPIOB);
 GPIO_DeInit(GPIOC);
 GPIO_DeInit(GPIOD);
 GPIO_DeInit(GPIOE);

 RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB |
                        RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOD |
                        RCC_AHBPeriph_GPIOE, ENABLE);

 RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOAEN, ENABLE);
 RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIODEN, ENABLE);
 RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOBEN, ENABLE);
}

void init_led()
{
GPIO_InitTypeDef PORT;
PORT.GPIO_Pin = (GPIO_Pin_7 | GPIO_Pin_6);
PORT.GPIO_Mode = GPIO_Mode_OUT;
PORT.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init( GPIOB , &PORT);
}

void init_but()
{
GPIO_InitTypeDef BUTA;
BUTA.GPIO_Pin = GPIO_Pin_0;
BUTA.GPIO_Mode = GPIO_Mode_IN;
BUTA.GPIO_Mode = GPIO_PuPd_NOPULL; 
BUTA.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init( GPIOA , &BUTA);

GPIO_InitTypeDef BUTD;
BUTD.GPIO_Pin = GPIO_Pin_2;
BUTD.GPIO_Mode = GPIO_Mode_IN;
BUTD.GPIO_Mode = GPIO_PuPd_UP;
BUTD.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init( GPIOD , &BUTD);
}

void usart()
{

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //Включаем тактирование USART1
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);   //Rx
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2); //Tx
  GPIO_InitTypeDef    GPIO_InitStruct;
  GPIO_InitStruct.GPIO_Pin = (GPIO_Pin_2); //Настройки будут производится для вывода PA2 TX
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; //Режим альтернативной функции
  GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //Выход Push-Pull
  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; //Выход без подтягивающих резисторов
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_40MHz; //Скорость порта максимальная
  GPIO_Init(GPIOA, &GPIO_InitStruct); //Заданные настройки сохраняем в регистрах GPIOА

  GPIO_InitStruct.GPIO_Pin = (GPIO_Pin_3); //Настройки будут производится для вывода PA3 //Rx
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; //Режим альтернативной функции
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; //Режим альтернативной функции
  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; //Выход без подтягивающих резисторов
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_40MHz; //Скорость порта максимальная
  GPIO_Init(GPIOA, &GPIO_InitStruct); //Заданные настройки сохраняем в регистрах GPIOА
  //Инициализация USART1


  USART_InitTypeDef    USART_InitStruct;
  USART_InitStruct.USART_BaudRate = 9600; //Скорость обмена 9600 бод
  USART_InitStruct.USART_WordLength = USART_WordLength_8b; //Длина слова 8 бит
  USART_InitStruct.USART_StopBits = USART_StopBits_1; //1 стоп-бит
  USART_InitStruct.USART_Parity = USART_Parity_No ; //Без проверки четности
  USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //Без аппаратного контроля
  USART_InitStruct.USART_Mode = USART_Mode_Tx ; //Включен только передатчик USART1
  USART_Init(USART2, &USART_InitStruct); //Заданные настройки сохраняем в регистрах USART1
  USART_Cmd(USART2, ENABLE); //Включаем USART1
}
void Usart1_Transmit(uint8_t data)
{
 while(!(USART2->SR & USART_SR_TC)); //Ждем установки флага TC - завершения передачи
 USART2->DR = data;
}
void Usart1_Transmit_str(char* str)
{
 uint8_t i=0;
 while(str[i])
 {
   Usart1_Transmit(str[i]);
   i++;
 }
 Usart1_Transmit('n');
 Usart1_Transmit('r');
}


int main(void)
{
RCC_Configuration();
init_led();
init_but();
usart();

int i=0;
while(1)
{
 Usart1_Transmit_str('STM32L-DISCOVERY'); //Вызов функции передачи строки через USART
 for(i=0; i<1000; i++); //Временная задержка
}

}

Изменено пользователем Dele

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

while(!(USART2->SR & USART_SR_TC)); //Ждем установки флага TC - завершения передачи

USART1->DR = data;

 

Ждете и настраиваете второго, пишите в первый.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

while(!(USART2->SR & USART_SR_TC)); //Ждем установки флага TC - завершения передачи

USART1->DR = data;

 

Ждете и настраиваете второго, пишите в первый.

Поправил результат тот же, это я сначала первый пробовал думал там контакты LCD мешают, теперь так же со вторым пробую и так же...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не вижу включение тактирования альтернативных функций.

В самом начале определил тактирование на все порты и Альт. функции в RCC_Configuration(void)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если USART настроен только на вывод, зачем подключать пин на ввод?

Когда использовали USART1 подключали к APB1 или APB2?

Попробуйте включить прерывания по TXE и TC, посмотреть будут ли срабатывать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В самом начале определил тактирование на все порты и Альт. функции в RCC_Configuration(void)

 

надо не забывать, о правильном выставления делителя для первого usart-а. Он(и 6, если память не подводит) тактируется с другой шины чем 2,3 и т.д..

на приёмнике при этом приём идёт, но принимает крокозябрики.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пробовал уже без пина на ввод РА3 так же.

USART1 тактировал через APB2, USART2 соответственно через APB1, как описано в stm32l1xx_usart.h

Я был бы рад кракозябрям, да и их то нету(

 

А прерывания по USART настраивать это если только самому принимать данные, мне же надо только отправить...

 

Вообщем заработало!

Посмотрел дебагером, в функции Usart1_Transmit_str(char* str) на while(str) отправляет нас в startup_stm32l1xx_md.c а там в бесконечный цикл

 

static void Default_Handler(void)

{

/* Go into an infinite loop. */

while (1)

{ }

}

Такие вот дела...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну нормальные дела, заглушка от не назначенной функции....

бесят меня библиотеки этим, если какая ошибка, они предпочитают повиснуть, нежели работать не верно. Для библиотеки это здорово, сразу видно что какие-то ошибки, но для остального проекта? Отвал одной функции, причем может быть второстепенной рубит весь проект... абалденно придумано...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

бесят меня библиотеки этим, если какая ошибка, они предпочитают повиснуть, нежели работать не верно. Для библиотеки это здорово, сразу видно что какие-то ошибки, но для остального проекта? Отвал одной функции, причем может быть второстепенной рубит весь проект... абалденно придумано...

Что Вы так разоряетесь? Знаете-же рецепт? Не использовать чужой код... даже под пытками ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Знаю, но чем дальше тем труднее противостоять экспансии... к примеру ТСР/IP стэк, как не крути а свой писать долго, и славы никакой, одна механика... а там тоже таких приколов хватает в драйверах конкретных процов...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А я вот как раз сейчас в одном из проектов его и перепахиваю ;)

Уже в нём нарвались ранее на баг, приводивший к зависанию соединения. Теперь вот больше не доверяю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Планирую дальше организовать радиосвязь между двумя платами STM32DISCOVERY, модуль HOPE RFM22B, приемник выводит через UART в терминал то что пришло от передатчика... чувствую скоро еще тему создам)

Изменено пользователем Dele

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...