реклама на сайте
подробности

 
 
> STM32F100 USART1 виснет в прерывании. Что делаю не так?, Не получается заставить работать USART1 на прерываниях.
NeoMage
сообщение Jun 11 2012, 19:15
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 5-06-12
Пользователь №: 72 183



STM32F100 UART1 когда уходит на прерывание - зависает. Точку останова на прерывании не
ставиться (IAR 6.21).
Если обработчик прерывания оставляю пустым (оставляю только сброс прерывания)- тоже
виснет.
Причем программа работает, а как только от компьютера отправляю байт контроллеру - он
виснет, даже если функция по приему прерывания пустая.
Может неправильно биты прерывания сбрасываю и он в цикл уходит?
Полная программа во вложении. Помогите пожалуйста.
.... инициализация ....
.....
USART1->CR1 |= USART_CR1_TE;
USART1->CR1 |= USART_CR1_RE;
USART1->CR1 |= USART_CR1_RXNEIE;
.....
Обработчик прерывания (отправляет/принемает в буфер)
....
void USART1_IRQHandler(void)
{
if((USART1->SR & USART_SR_RXNE)) //Если прием
{
USART1->SR &= ~USART_SR_RXNE; //сброс флага
rx1_buffer[rx1w] = USART1->DR ; // сохраняем байт в буфер
if(rx1w >= (RX1_BUFFER_SIZE - 1)) //
{
rx1w = 0; //
} else {
rx1w++; //
};
};
if((USART1->SR & USART_SR_TXE)) //по опустошению
{
USART1->SR &= ~USART_SR_TXE; //сброс флага
USART1->DR = tx1_buffer[tx1r];
if(tx1r >= (TX1_BUFFER_SIZE - 1)) //
{
tx1r = 0; //
} else {
tx1r++; //
};
tx1_count++;
if(tx1_count == TX1_BUFFER_SIZE) USART1->CR1 &= ~USART_CR1_TXEIE; //Если все отправили -
выключаем прерывание на отправку
}
}
Прикрепленные файлы
Прикрепленный файл  USART1.ZIP ( 92.34 килобайт ) Кол-во скачиваний: 12
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ierofant
сообщение Jun 13 2012, 12:28
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 3-02-11
Из: Украина, Киев
Пользователь №: 62 695



QUOTE
STM32F100 UART1 когда уходит на прерывание - зависает.


Как зависает? Вываливается в Hard Fault или зацикливается в обработчике?

Попробуйте считывать статус-регистр в буффер, потом уже с буфера проверять, установлены ли флаги. Вот работающий пример, проверьте, может где-то ошиблись:

CODE
void init_uart()
{
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.
// Скорость 9.6 kbps. USARTDIV=FSYS/(16*baud) = 24e6/(16*9600)=156.25
USART1->BRR=(156<<4); // Целая часть коэффициента деления USART1.
USART1->BRR|=4; // Дробная часть*16 = 0,25*16 = 4.
USART1->CR1 |=USART_CR1_UE; // Включение USART1.
USART1->CR1 |=USART_CR1_RXNEIE; // Разрешить прерывания RXNE.
NVIC_EnableIRQ(USART1_IRQn); // Разрешить прерывание USART1_IRQn в NVIC.
NVIC_SetPriority(USART1_IRQn, 3); //Задать приоритет прерыванию
}

void USART1_IRQHandler (void) // Обработчик USART1.
{
uint16_t status = USART1->SR;
if (status & USART_SR_RXNE)// Если прерывание по приёму.
{
....
}
else if (status & USART_SR_TXE) // Если прерывание по осовобождению передатчика.
{
....
}
USART1->SR&=~(USART_SR_TXE|USART_SR_RXNE); //очистка флагов
}

void begin_uart_transm()
{
USART1->CR1 |=USART_CR1_TXEIE;
}


Сообщение отредактировал ierofant - Jun 13 2012, 12:31
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 07:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01366 секунд с 7
ELECTRONIX ©2004-2016