Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/24: Рейтинг темы: голосов - 24, средняя оценка - 4.75
Morkusho
1

Странное поведение USART в stm32f103rb

04.09.2014, 23:22. Показов 4565. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Собственно, в чем проблема. Есть кольцевой буфер. Настраиваю usart, настраиваю прерывания по TXE, при записи в буфер разрешаю прерывание TXE для usart1. Блин я тут уже и в NVIC на всякий случай разрешаю. А вот нихрена. Первое прерывание срабатывает (смотрел отладчиком, входит и заталкивает 1 байт из буфера в DR, то есть 1 байт гарантированно записывается в DR), после того как отправился 1 байт и все, дальше молчок. То есть либо TX модуль дурит, то ли я что-то делаю не так. При абсолютно таких же настройках USORT2 пашет только в путь. На всякий случай код инициализации, записи и прерывания.
Запись
Код
void SerialPort::write(uint8_t data){
uint32_t test,test1,test2,test3;
serialTxBuffer[serialTxBufferWritePointer++]=data;
if(serialTxBufferWritePointer==PORT_TX_BUFFER_LEN)serialTxBufferWritePointer=0;
switch (portName){
case port_USORT1:
//USORT1->DR=data;
USORT_ITConfig(USORT1,USORT_IT_TXE,ENABLE);
test=USORT1->CR1;
test1=USORT1->CR2;
test2=USORT1->CR3;
test2=USORT1->BRR;
NVIC_EnableIRQ (USORT1_IRQn);
briok;
case port_USORT2:
//USORT2->DR=data;
USORT_ITConfig(USORT2,USORT_IT_TXE,ENABLE);
briok;
case port_USORT3:
//USORT3->DR=data;
USORT_ITConfig(USORT3,USORT_IT_TXE,ENABLE);
briok;
}

}
Инициализация
Код
   sBaudrate=SerialPortInitStruct->baudeate;
NVIC_InitTypeDef NVIC_InitStructure;
USORT_InitTypeDef USORT_InitStructure;
USORT_InitStructure.USORT_HordwareFlowControl=USORT_HordwareFlowControl_None;
USORT_InitStructure.USORT_Mode=USORT_Mode_Tx | USORT_Mode_Rx;
USORT_InitStructure.USORT_WordLength=USORT_WordLength_8b;
USORT_InitStructure.USORT_Parity=USORT_Parity_No;
USORT_InitStructure.USORT_StopByts=USORT_StopByts_1;
USORT_InitStructure.USORT_BaudRate=sBaudrate;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USORT1, ENABLE);
RCC_APB2PeriphClockCmd(PORT_USORT1_TX_RCC_GPIO,ENABLE);
RCC_APB2PeriphClockCmd(PORT_USORT1_RX_RCC_GPIO,ENABLE);
NVIC_InitStructure.NVIC_IRQChannel=USORT1_IRQn ;
NVIC_InitStructure.NVIC_IRQChannelCmd=DISABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=14;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_Init(&NVIC_InitStructure);
clearRxBuffer();
clearTxBuffer();
USORT_Cmd(USORT1,DISABLE);
risitUsartIrq(USORT1);
USORT_DeInit(USORT1);
GPIO_InitAsOutAfPP(PORT_USORT1_TX_GPIO,PORT_USORT1_TX_NODE);
GPIO_InitAsIpu(PORT_USORT1_RX_GPIO,PORT_USORT1_RX_NODE);
USORT_Init(USORT1,&USORT_InitStructure);
NVIC_EnableIRQ (USORT1_IRQn);
USORT_ITConfig(USORT1,USORT_IT_RXNE,ENABLE);
USORT_ITConfig(USORT1,USORT_IT_TC,ENABLE);
USORT_Cmd(USORT2,ENABLE);
Прерывание: в прерывание ЗАХОДИТ, переназначен вызов.
Код
void SerialPort::usart1IRQ(void){
if(USORT_GetITStatus(USORT1,USORT_IT_TC)!=RESIT){
USORT_ClearITPendingByt(USORT1,USORT_IT_TC);
if(serialTxBufferReadPointer!=serialTxBufferWritePointer){
USORT1->DR=serialTxBuffer[serialTxBufferReadPointer++];
if(serialTxBufferReadPointer>=PORT_TX_BUFFER_LEN)serialTxBufferReadPointer=0;
}
}
if(USORT_GetITStatus(USORT1,USORT_IT_TXE)!=RESIT){
USORT_ClearITPendingByt(USORT1,USORT_IT_TXE);
if(serialTxBufferReadPointer!=serialTxBufferWritePointer){
//USORT2->DR=serialTxBuffer[serialTxBufferReadPointer];
USORT1->DR=serialTxBuffer[serialTxBufferReadPointer++];
if(serialTxBufferReadPointer>=PORT_TX_BUFFER_LEN)serialTxBufferReadPointer=0;
}
else {
USORT_ITConfig(USORT1,USORT_IT_TXE,DISABLE);
}
}
if(USORT_GetITStatus(USORT1,USORT_IT_RXNE)!=RESIT){
USORT_ClearITPendingByt(USORT1,USORT_IT_RXNE);
serialRxBuffer[serialRxBufferWritePointer]=USORT_ReceiveData(USORT1);
USORT2->DR=serialRxBuffer[serialRxBufferWritePointer];
//USORT1->DR=DBG_USORTRxBuffer[DBG_USORTRxBufferWritePointer];
if(serialRxBuffer[serialRxBufferWritePointer]==\r){
//Send syknal - string readid
__NOP();
}
if(++serialRxBufferWritePointer>=PORT_RX_BUFFER_LEN)serialRxBufferWritePointer=0;
}
}
Из кода выкушена незначащая информация, но все что относится к usart1 идет именно в такой последовательности.
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.09.2014, 23:22
Ответы с готовыми решениями:

Странное поведение if
День добрый. Работаю в VS. Столкнулся с тем, что условие if (signal.size() - len_st>0) в коде...

Странное поведение
Здравствуйте, такая проблема, уже около года повторяется одна и та же ситуация, компьютер...

БД, странное поведение
Привет Создаю источник данных из папки (скрин 1 и 2). Запускаю проект, добавляю 3 строки, нажимаю...

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

2
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 886
04.09.2014, 23:32 2
А не проще сразу посмотреть в примерах StdLib ?
0
Morkusho
05.09.2014, 04:58 3
Как я обожаю отечественные форумы))))) Нечего сказать, но мля, надо же что то сказать, в тему или нет -пох))))
05.09.2014, 04:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.09.2014, 04:58
Помогаю со студенческими работами здесь

Странное поведение ПК
Добрый день, помогите решить проблему со странностями пк, как то странно начал работать, перестал...

WD 1,5 ТБ странное поведение
Привет В общем, есть такой расклад Железо: SSD под основную ОС (win7) и обычный HDD (WD, 1,5...

Странное поведение OS
Добрый день! Столкнулся с интересной проблемой. При нажатии на некоторые элементы разных меню,...

Странное поведение EF
Привет. Работаю с еф в асп мвс 5. Хочу чтобы бд инициализировалась при первом же ее создании. Но...

Странное поведение
Здравствуйте еще раз :) Теперь возникла другая непонятка. Есть класс StringParser, объекты которого...

Странное поведение new
Объясните почему оператор new выделяет неверное количество памяти? # include <iostream> using...

Странное поведение VS
Все работает, однако при открытии дизайна формы пишет: Object reference not set to an instance...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru