Например TDA7294

Форум РадиоКот • Просмотр темы - Проблема с прерыванием USART STM8L
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Чт апр 25, 2024 00:56:25

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Проблема с прерыванием USART STM8L
СообщениеДобавлено: Пн июн 03, 2013 18:15:17 
Родился

Зарегистрирован: Пт май 17, 2013 21:52:00
Сообщений: 18
Рейтинг сообщения: 0
Доброго времени суток!

Работаю с STM8L-Discovery (STM8L152C6) в IAR.
Настроил USART на передачу, теперь пытаюсь настроить USART на прием. Никак не могу попасть в прерывание(или попадаю и не могу выйти). Перечитал похожие проблемы: у кого-то библиотеки в IAR неправильные адреса прерываний выдают, у кого-то флаг не сбрасывается (так и не понял как сбросить флаг) - все равно не работает

Настроил порты USART на ввод и вывод, установил кварц и скорость USART. Задача слушать вход и после прихода символа выдавать что-то на выход (Hello)

Код:
#define STM8L15X_MD
#include "iostm8l152c6.h"
#include "stm8l15x.h"
#include "intrinsics.h"

// !!! Edit stm8l15x_conf.h to enable peripheral header
// !!! Test STM8L15X_MD in stm8l15x.h to the target STM8L device used
// Current selected:
// STM8L15x devices are STM8L151C4, STM8L151C6, STM8L152C4,
// STM8L152C6, STM8L151K4, STM8L151K6, STM8L152K4, STM8L152K6, STM8L151G4,
// STM8L151G6, STM8L152G4 and STM8L152G6


void main(){

// Настройка портов

PC_DDR_bit.DDR3 = 1; //P.3.3 - на выход
PC_CR1_bit.C13 = 1; // Push-pull
PC_CR2_bit.C23 = 0;

PC_DDR_bit.DDR2 = 0; //P.3.2 - на вход
PC_CR1_bit.C12 = 1; // Push-pull
PC_CR2_bit.C22 = 1; // с прерыванием

// Настройки кварца

CLK->ICKCR |= CLK_ICKCR_HSION;
CLK->ICKCR |= CLK_ICKCR_HSION; // внутренний
CLK->SWCR |= CLK_SWCR_SWEN;
CLK->SWR = 0x01;
CLK->CKDIVR = CLK_CKDIVR;

while(CLK_SCSR!=0x01); //ждем стабилизации


CLK->PCKENR1 |= CLK_PCKENR1_USART1;


USART1->BRR2 = 0x00; // Скорость 9600 при кварце 2 МГЦ
USART1->BRR1 = 0x0D;


USART1->CR1 = 0;
USART1->CR3 = 0;

USART1->CR4 = 0;
USART1->CR5 = 0;

USART1->CR2 = USART_CR2_REN; // Разрешение приема и передачи и разрешение прерывания
USART1->CR2 = USART_CR2_RIEN;
USART1->CR2 = USART_CR2_TEN;

__enable_interrupt();
while(1) // ждем символа на вход
{ }
}

#pragma vector=USART_R_OR_vector
__interrupt void USART_RXNE(void)
{
// Выводим Hello!

while (1)
{
USART1->DR = 'H';
while(!(USART1->SR & USART_SR_TC));
USART1->DR = 'e';
while(!(USART1->SR & USART_SR_TC));
USART1->DR = 'l';
while(!(USART1->SR & USART_SR_TC));
USART1->DR = 'l';
while(!(USART1->SR & USART_SR_TC));
USART1->DR = 'o';
while(!(USART1->SR & USART_SR_TC));
USART1->DR = '!';
while(!(USART1->SR & USART_SR_TC));
}
}



Может кто-нибудь знает где тут подводные камни?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблема с прерыванием USART STM8L
СообщениеДобавлено: Чт фев 02, 2017 12:01:16 
Держит паяльник хвостом

Карма: 1
Рейтинг сообщений: 2
Зарегистрирован: Ср июл 07, 2010 06:48:57
Сообщений: 986
Рейтинг сообщения: 0
Прерывание нужно делать на по входу С2, а по заполнению приемного регистра - UART1_CR2_RIEN. А так получается, что обработчик запускается по первому фронту первого бита в посылке и контроллер вместо приема байта и записи его в регистр, пытается обработать не нужное прерывание.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблема с прерыванием USART STM8L
СообщениеДобавлено: Чт янв 23, 2020 12:28:01 
Друг Кота
Аватар пользователя

Карма: 107
Рейтинг сообщений: 1031
Зарегистрирован: Пт дек 17, 2010 15:07:50
Сообщений: 12366
Откуда: Крымский Федеральный Округ
Рейтинг сообщения: 0
Добрый день, друзья! Тема конечно мертва, но наткнулся на точно такую же проблему. Передавать могу, но при попытке принимать в прерывании всё ломается. Сейчас обработчик такой:
Войти в прерывание, зажечь светодиод, считать принятый байт, запустить его же на передачу, погасить светодиод и выйти из прерывания. Флаг, судя по даташиту, должен сняться в момент считывания USART_DR. Нооооооооо ничего не происходит. МК вообще наглухо повисает после принятия байта, и до резета молчит. Есть версия, что ошибка в самих библиотеках/компиляторе -- и дело в векторе прерывания и возвращения из него. Нооооо... может всё-таки ошибка на моей стороне? Подскажет кто чего? :dont_know:

Код:
#pragma vector=USART_R_OR_vector
__interrupt void USART_RXNE(void)
{
PB_ODR_bit.ODR2 = 1;
USART1_DR = USART1_DR;
PB_ODR_bit.ODR2 = 0;
}

_________________
Изображение
И ты врёшь!!! © Vladisman
Изображение


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y