Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: stm32f4 cmsis usart +terminal1,9 b

Вт июл 27, 2021 22:18:43

Лёд тронулся.Правда на stm32f103.

Добавлено 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);-так не работает.А как же мне строку отправить?
Вложения
main.c
(17.72 KiB) Скачиваний: 127

Re: stm32f4 cmsis usart +terminal1,9 b

Ср июл 28, 2021 07:05:59

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);
Для чего вы это пишите? Проговорите словами, что вы хотите сделать такой строкой.

Зачем словами? Я говорю в данном случае на языке программирования. И говорю я, что не забыл про эти биты, более того, мне нужно, чтобы в этой точке программы они были равны нулю.

Re: stm32f4 cmsis usart +terminal1,9 b

Ср июл 28, 2021 08:31:47

ivan dimir писал(а):Лёд тронулся.Правда на stm32f103.
Ну вот, F4 не тянет, а F103 потянул.
ivan dimir писал(а):А как же мне строку отправить?
Способов много, от printf до всяких там xprintf.
Как вариант, самодельный

Re: stm32f4 cmsis usart +terminal1,9 b

Ср июл 28, 2021 18:10:45

операцией ИЛИ "0" 1-цу не погасит, но при просто присвоении "1" и нет. Получается запись просто на память

Парамеиры в функцию передаются через запятую. Сколько параметров нужно MODIFY_REG(.......) ? как можно убрать запятую? проверяйте что вы хотите от регистра

Re: stm32f4 cmsis usart +terminal1,9 b

Чт июл 29, 2021 17:46:39

Я выложил примеры настройки и тактирования, и УАРТ.
usart->SR &= ~USART_SR_TXE;

Так делать нельзя! Читайте описание регистра SR.
Правильная запись для сброса бита TXE: usart->SR = ~USART_SR_TXE;
Ваша запись, кроме того что не неоптимальна, так ещё и может сбрасывать другие случайные флаги.

Да и вообще смысл этого участка неясен... Видимо записали символ в буфер передачи теперь хотите чтобы вызвалось прерывание передачи (TXEIE)?
Но зачем-то перед его его разрешением пытаетесь сбрасывать флаг TXE. :facepalm:
Т.е. - если буфер передатчика был уже пуст к этому моменту, то флаг TXE стоял. Вы его принудительно сбросили и только потом разрешили прерывание TXEIE. Ну так оно никогда и не сработает, так как TXE принудительно сброшен.

Вообще флаги в регистре SR редко когда нужно принудительно сбрасывать. Они сбрасываются сами при определённых событиях (TXE - при записи символа в регистр передатчика).
Последний раз редактировалось jcxz Чт июл 29, 2021 18:06:04, всего редактировалось 2 раз(а).

Re: stm32f4 cmsis usart +terminal1,9 b

Чт июл 29, 2021 17:55:36

jcxz, ну что за бред? Бит TXE - read only! Сбрасывается он, если в DR что-то будет записано...

Re: stm32f4 cmsis usart +terminal1,9 b

Чт июл 29, 2021 18:04:46

jcxz, ну что за бред? Бит TXE - read only! Сбрасывается он, если в DR что-то будет записано...
Бред был в исходном коде (сброс TXE) в посте, на который я отвечал.
Если TXE - read only, то та строка вообще бессмысленна.

Re: stm32f4 cmsis usart +terminal1,9 b

Чт июл 29, 2021 18:07:42

Да там вообще много чего бессмысленного. И читать такой код страшно.
Ответить