Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: usart stm32l
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Dele
Добрый день!
Неполучается уже второй день запустить USART на STM32L-DISCOVERY Среда Coocox
Логическим анализатором смотрю нету ничего...
РА 2Tx
PA 3Rx

КОД:
CODE
#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++); //Временная задержка
}

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

Ждете и настраиваете второго, пишите в первый.
Dele
Цитата(Timma @ Apr 13 2014, 06:29) *
while(!(USART2->SR & USART_SR_TC)); //Ждем установки флага TC - завершения передачи
USART1->DR = data;

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

Поправил результат тот же, это я сначала первый пробовал думал там контакты LCD мешают, теперь так же со вторым пробую и так же...
alexdos
не вижу включение тактирования альтернативных функций.
Dele
Цитата(alexdos @ Apr 13 2014, 08:55) *
не вижу включение тактирования альтернативных функций.

В самом начале определил тактирование на все порты и Альт. функции в RCC_Configuration(void)
Timma
Если USART настроен только на вывод, зачем подключать пин на ввод?
Когда использовали USART1 подключали к APB1 или APB2?
Попробуйте включить прерывания по TXE и TC, посмотреть будут ли срабатывать.
kolobok0
Цитата(Dele @ Apr 13 2014, 08:57) *
В самом начале определил тактирование на все порты и Альт. функции в RCC_Configuration(void)


надо не забывать, о правильном выставления делителя для первого usart-а. Он(и 6, если память не подводит) тактируется с другой шины чем 2,3 и т.д..
на приёмнике при этом приём идёт, но принимает крокозябрики.
Dele
Пробовал уже без пина на ввод РА3 так же.
USART1 тактировал через APB2, USART2 соответственно через APB1, как описано в stm32l1xx_usart.h
Я был бы рад кракозябрям, да и их то нету(

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

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

static void Default_Handler(void)
{
/* Go into an infinite loop. */
while (1)
{ }
}
Такие вот дела...
Golikov A.
ну нормальные дела, заглушка от не назначенной функции....
бесят меня библиотеки этим, если какая ошибка, они предпочитают повиснуть, нежели работать не верно. Для библиотеки это здорово, сразу видно что какие-то ошибки, но для остального проекта? Отвал одной функции, причем может быть второстепенной рубит весь проект... абалденно придумано...
adnega
Может, в HardFault улетает?
jcxz
Цитата(Golikov A. @ Apr 13 2014, 19:13) *
бесят меня библиотеки этим, если какая ошибка, они предпочитают повиснуть, нежели работать не верно. Для библиотеки это здорово, сразу видно что какие-то ошибки, но для остального проекта? Отвал одной функции, причем может быть второстепенной рубит весь проект... абалденно придумано...

Что Вы так разоряетесь? Знаете-же рецепт? Не использовать чужой код... даже под пытками wink.gif
Golikov A.
Знаю, но чем дальше тем труднее противостоять экспансии... к примеру ТСР/IP стэк, как не крути а свой писать долго, и славы никакой, одна механика... а там тоже таких приколов хватает в драйверах конкретных процов...
jcxz
А я вот как раз сейчас в одном из проектов его и перепахиваю wink.gif
Уже в нём нарвались ранее на баг, приводивший к зависанию соединения. Теперь вот больше не доверяю.
Dele
Планирую дальше организовать радиосвязь между двумя платами STM32DISCOVERY, модуль HOPE RFM22B, приемник выводит через UART в терминал то что пришло от передатчика... чувствую скоро еще тему создам)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.