Добавлено after 7 minutes 9 seconds:
У меня единственное.Не получается строку отправить.Проблема была в прерывании системного таймера.А вторая проблемаMODIFY_REG(USART1->CR1,
USART_CR1_M | USART_CR1_PCE | USART_CR1_PS ,USART_CR1_TE |USART_CR1_RE); в этой строке а вернее с запятой.Если её убрать
MODIFY_REG(USART1->CR1,
USART_CR1_M | USART_CR1_PCE | USART_CR1_PS |USART_CR1_TE |USART_CR1_RE);-так не работает.А как же мне строку отправить?
Professor Chaos писал(а):Извиняюсь, ошибся. У вас так:
Reg = (0<<Pos1)|(0<<Pos2);
Надо лишь помнить, что такой записью вы портите содержимое всех прочих битовых полей регистра Reg, что тоже нежелательно.
ComPort UART_base::open
(
ComPort _port,
uint32 _baudRate,
uint8 _dataBits,
Parity _parity,
StopBits _stopBits
)
{
// Сбросим все конфигурационные биты. По ходу разбора параметров будем
// выставлять нужные.
usart -> CR1 = \
usart -> CR2 = \
usart -> CR3 = 0;
.......
usart -> SR = 0;
setEvents(); // Разрешаем нужные нам прерывания.
.......
return( port );
}
///////////////////////////////////////
void
ConIO::setEvents( void )
{
// Сначала сбросим биты событий.
//usart -> ISR = 0;
usart -> CR1 =
(
// Запрос прерывания в следующих случаях:
0 << USART_CR1_TCIE_Pos | // - по установке бита TC регистра SR,
// т.е. при окончании передачи;
0 << USART_CR1_TXEIE_Pos | // - по установке бита TXE регистра SR,
// т.е. при начале передачи;
0 << USART_CR1_RXNEIE_Pos | // - что-то пришло в УАРТ.
// Не забываем включить сам модуль и выводы:
1 << USART_CR1_TE_Pos | // - включаем передатчик;
1 << USART_CR1_RE_Pos | // - включаем приёмник;
1 << USART_CR1_UE_Pos // - включение USART.
);
// Разрешаем приём, передачу, устанавливаем обработчики прерываний,
// включаем тактирование.
installInterruptHandler( usart_IRQn );
}
Я их не просто порчу, а устанавливаю в нужные мне значения!
Reg |= (0<<Pos1)|(0<<Pos2);
Для чего вы это пишите? Проговорите словами, что вы хотите сделать такой строкой.
Зачем словами? Я говорю в данном случае на языке программирования. И говорю я, что не забыл про эти биты, более того, мне нужно, чтобы в этой точке программы они были равны нулю.
операцией ИЛИ "0" 1-цу не погасит, но при просто присвоении "1" и нет. Получается запись просто на память
Парамеиры в функцию передаются через запятую. Сколько параметров нужно MODIFY_REG(.......) ? как можно убрать запятую? проверяйте что вы хотите от регистра
[uquote="tonyk",url="/forum/viewtopic.php?p=4066709#p4066709"]Я выложил примеры настройки и тактирования, и УАРТ.
usart->SR &= ~USART_SR_TXE;[/uquote]
Так делать нельзя! Читайте описание регистра SR.
Правильная запись для сброса бита TXE: usart->SR = ~USART_SR_TXE;
Ваша запись, кроме того что не неоптимальна, так ещё и может сбрасывать другие случайные флаги.
Да и вообще смысл этого участка неясен... Видимо записали символ в буфер передачи теперь хотите чтобы вызвалось прерывание передачи (TXEIE)?
Но зачем-то перед его его разрешением пытаетесь сбрасывать флаг TXE.
Т.е. - если буфер передатчика был уже пуст к этому моменту, то флаг TXE стоял. Вы его принудительно сбросили и только потом разрешили прерывание TXEIE. Ну так оно никогда и не сработает, так как TXE принудительно сброшен.
Вообще флаги в регистре SR редко когда нужно принудительно сбрасывать. Они сбрасываются сами при определённых событиях (TXE - при записи символа в регистр передатчика).
Последний раз редактировалось jcxz Чт июл 29, 2021 18:06:04, всего редактировалось 2 раза.
jcxz, ну что за бред? Бит TXE - read only! Сбрасывается он, если в DR что-то будет записано...
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4067694#p4067694"]jcxz, ну что за бред? Бит TXE - read only! Сбрасывается он, если в DR что-то будет записано...[/uquote]Бред был в исходном коде (сброс TXE) в посте, на который я отвечал.
Если TXE - read only, то та строка вообще бессмысленна.
Да там вообще много чего бессмысленного. И читать такой код страшно.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ