stm32f4 cmsis usart +terminal1,9 b

Кто любит RISC в жизни, заходим, не стесняемся.
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

stm32f4 cmsis usart +terminal1,9 b

Сообщение ivan dimir »

у меня вопрос .Я пытаюсь вывести на терминал текст .А выводятся какие то 0<0> и козябрики.в халеЛЛ тоже самое.?Кто подскажет умную мыспь?

Добавлено after 36 minutes 14 seconds:
ии

Добавлено after 32 seconds:
Вложения
main.c
(39.04 КБ) 311 скачиваний
Реклама
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: stm32f4 cmsis usart +terminal1,9 b

Сообщение Eddy_Em »

Ну и жесть! От этого кода глаза вытекают просто!!! Никакой культуры…
P.S. Если выводятся "козябрики", это означает, что тактирование неправильно настроено.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Реклама
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

Re: stm32f4 cmsis usart +terminal1,9 b

Сообщение ivan dimir »

И в кубе тоже?

Добавлено after 4 minutes 48 seconds:
Тактирование контроллера настроенно.Правильно или неправильно.Но I2C работает.Да я не программист.И культуры написания программы.Не научен.Да и На AVR тоже самое.

Добавлено after 28 minutes 26 seconds:
Может я не так понял.Тактирование контроллера? Или usart ?
a797945
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Re: stm32f4 cmsis usart +terminal1,9 b

Сообщение a797945 »

зациклите выдачу 0х55 в режиме 8n1 и замерьте частоту ( можете кратно снизить скорость передачи, чтоб однозначно оценить даже dso138тым). с учетом что 2 бита '10' это период частоты - это и будет скорость вашего уарта. Сами понимаете, что она должна быть равна выставленной в терминале.
Реклама
Эиком - электронные компоненты и радиодетали
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: stm32f4 cmsis usart +terminal1,9 b

Сообщение Dimon456 »

В int main(void) после RCC_init(); выполните следующий код

Код: Выделить всё

        RCC_ClocksTypeDef RCC_Clocks;
        RCC_GetClocksFreq (&RCC_Clocks);
покажите результат с отладчика структуры RCC_Clocks {...}
Реклама
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

Re: stm32f4 cmsis usart +terminal1,9 b

Сообщение ivan dimir »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4017357#p4017357"]В int main(void) после RCC_init(); выполните следующий код

Код: Выделить всё

        RCC_ClocksTypeDef RCC_Clocks;
        RCC_GetClocksFreq (&RCC_Clocks);
покажите результат с отладчика структуры RCC_Clocks {...}[/uquote]
на жто компелятор ругается

Добавлено after 7 minutes 22 seconds:
и это по моему в кубе.А в кубе тоже самое.
Реклама
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: stm32f4 cmsis usart +terminal1,9 b

Сообщение Dimon456 »

ivan dimir писал(а):на жто компелятор ругается
Как ругается?
Проверьте что бы был подключен файл

Код: Выделить всё

#include <stm32f4xx_rcc.h>
У вас под сомнением

Код: Выделить всё

RCC_PLLCFGR_PLLP
AHB Prescaler
APB2 Prescaler
да и сомнительный разгон, думаю как раз с куба все бы и работало.

Давайте сюда данные регистров RCC->CFGR RCC->PLLCFGR до выполнения функции RCC_init() и после выполнения, и насколько кварц стоит? Сам посчитаю.

Либо делайте то что предложил a797945
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

Re: stm32f4 cmsis usart +terminal1,9 b

Сообщение ivan dimir »

в кубе тоже самое.Козябрики .#include <stm32f4xx_rcc.h> этого файла нет.Он есть в кубе.Но в кубе я генерировал проект .Правда функция передачи на cmsis.AVR тоже козябрики?
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: stm32f4 cmsis usart +terminal1,9 b

Сообщение Dimon456 »

Попробуй так сделать:
в функции USART1_init() заинкрементировать строки

Код: Выделить всё

USART1->CR1     |= USART_CR1_RXNEIE;
NVIC_EnableIRQ (USART1_IRQn);
далее сверху функции int main(void) добавляем код
Спойлер

Код: Выделить всё

void UsartInit(uint16_t baud)
{
    USART1->BRR = (uint16_t)baud;
    USART1->CR1 |= USART_CR1_TE | USART_CR1_RE | USART_CR1_UE;
    USART1->CR2 = 0;
    USART1->CR3 = 0;
}

void nast_uart(void)
{ uint16_t i; 

	for( i=100; i<0xFFF0; i++ )
	{
		UsartInit(i);

		tx_uart1 (0x0a); tx_uart1 (0x0d);
		tx_uart1 ('K');tx_uart1 ('O');tx_uart1 ('D');tx_uart1 ('=');
		tx_uart1 ((i/10000)%10+0x30);
		tx_uart1 ((i/1000)%10+0x30);
		tx_uart1 ((i/100)%10+0x30);
		tx_uart1 ((i/10)%10+0x30);
		tx_uart1 ((i/1)%10+0x30);
		tx_uart1 (0x0a); tx_uart1 (0x0d);
	}
}
в функции int main(void) после USART1_init();
вставляем nast_uart();
Спойлер

Код: Выделить всё

		 	timer6_init();
		 	//ds18b20_init();
		 	USART1_init();
			nast_uart();	////////////////////
		 	// adc_init();
		 	 I2C_Init();
подключаемся терминалом на скорости, к примеру 19200, и жмем резет на stm32f4,
функция последовательно будет перебирать регистр USART1->BRR, пока не получите адекватную информацию в терминале.
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

Re: stm32f4 cmsis usart +terminal1,9 b

Сообщение ivan dimir »

Я настроил просто на резонатор 8Мгц работает.А включаю PLL и понеслись козябрики .Меня вот что интересует.Там на рисунке есть PLL и что такое R я не нашол
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: stm32f4 cmsis usart +terminal1,9 b

Сообщение tonyk »

Там на рисунке есть PLL и что такое R я не нашол
Найди. Без него никак.

Какой хоть у тебя МК?
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

Re: stm32f4 cmsis usart +terminal1,9 b

Сообщение ivan dimir »

stm32f407

Добавлено after 6 minutes 52 seconds:
или это бит сброса.Но я его его в регистрах не вижу.
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: stm32f4 cmsis usart +terminal1,9 b

Сообщение tonyk »

Открой файл "system_stm32f4xx.c" и посмотри, что это за параметр.

Твой код крайне сложно читать, посмотри на примеры из тех же библиотек от СТМ. И не заметил у тебя настройку поля досчёта делителя частоты для УАРТ. Ниже фрагмент класса класса последовательного порта для F411, работающего под FreeRTOS.
Спойлер

Код: Выделить всё

ComPort UART_base::open
(
    ComPort     _port,
    uint32      _baudRate,
    uint8       _dataBits,
    Parity      _parity,
    StopBits    _stopBits
)
{
    switch( _port )
    {
        case COMPORT1:
        {
            usart = USART1;
            break;
        }
        case COMPORT2:
        {
            usart = USART2;
            break;
        }
        case COMPORT6:
        {
            usart = USART6;
            break;
        }
        default:
        {
            usart = 0;
            _port = UNKNOWNPORT;
            break;
        }
    }
    
    port     = _port;
    baudRate = _baudRate;
    dataBits = _dataBits;
    parity   = _parity;
    stopBits = _stopBits;
    
    if
    ( 
        ( port == UNKNOWNPORT ) || 
        ( usart == 0 )
    )
    {
        return UNKNOWNPORT;
    }

    // ---- _baudRate ----

    if( ( _baudRate == 0 ) || ( _baudRate > 921000UL ) )
    {
        lastError = INVALID_BAUDRATE;
        return port;
    }

    // ---- _dataBits ----

    if( _dataBits != 8 )
    {
        lastError = UNSUPPORTED_DATA_BITS_VALUE;
        return port;
    }
    //  Расчитаем делители частоты УАРТа.
    //  Определим частоту тактирования шины, к которой подключен УАРТ.
    
    switch( port )
    {
        case COMPORT1:      // Этот порт подключен к APB2.
        {
            APB_n = 2;
            
            usart_IRQn = USART1_IRQn;

            // Извлечём делитель частоты,
            APB_divider = ( RCC -> CFGR >> RCC_CFGR_PPRE2_Pos ) & 0x07;
            
            taskENTER_CRITICAL();
            {
                // Включаеи тактирование порта.
                RCC -> APB2ENR |= RCC_APB2ENR_USART1EN;

            }
            taskEXIT_CRITICAL();
            
            break;
        }
        case COMPORT2:      // Этот порт подключен к APB1.
        {
            APB_n = 1;
            
            usart_IRQn = USART2_IRQn;

            // Извлечём делитель частоты,
            APB_divider = ( RCC -> CFGR >> RCC_CFGR_PPRE1_Pos ) & 0x07;
            
            taskENTER_CRITICAL();
            {
                // Включаеи тактирование порта.
                RCC -> APB1ENR |= RCC_APB1ENR_USART2EN;
            }
            taskEXIT_CRITICAL();
            
            break;
        }
        case COMPORT6:  // Этот порт подключен к APB2.
        {
            APB_n = 2;
            
            usart_IRQn = USART6_IRQn;

            // Извлечём делитель частоты,
            APB_divider = ( RCC -> CFGR >> RCC_CFGR_PPRE2_Pos ) & 0x07;

            taskENTER_CRITICAL();
            {
                // Включаеи тактирование порта.
                RCC -> APB2ENR |= RCC_APB2ENR_USART6EN;
            }
            taskEXIT_CRITICAL();
            
            break;
        }
        default: 
        { 
            lastError = INVALID_PORT;
            return port;
        }
    }

    // Сбросим все конфигурационные биты. По ходу разбора параметров будем
    // выставлять нужные.
    usart -> CR1 = \
    usart -> CR2 = \
    usart -> CR3 = 0;

    // Преобразуем код делителя в число.
    switch( APB_divider )
    {
        case 0x0:   // 000b
        case 0x1:   // 001b
        case 0x2:   // 010b
        case 0x3:   // 011b
        {
            // Без делителя, напрямую.
            APB_divider = 1;
            break;
        }
        case 0x4:   // 100b
        {
            APB_divider = 2;
            break;
        }
        case 0x5:   // 101b
        {
            APB_divider = 4;
            break;
        }
        case 0x6:   // 110b
        {
            APB_divider = 8;
            break;
        }
        case 0x7:   // 111b
        {
            APB_divider = 16;
            break;
        }
    }

    uint32 
        floor = SystemCoreClock / ( APB_divider * (uint32)_baudRate * 16UL );

    int32  
        frac = 
            ( 
                ( SystemCoreClock / APB_divider ) -
                ( (uint32)_baudRate * floor * 16UL ) 
            ) / 200L,

        fracfrac = frac % 100L;

    frac /= 100L;

    if( fracfrac > 50 )
    {
        ++frac;
    }

    usart -> BRR = ( floor << 4 ) | frac;   // Выставили делитель.

    // ---- parity ----

    switch( _parity )
    {
        case NO_PARITY:
        {
            break;
        }
        case ODD:       // Нечётность
        {
            usart -> CR1 |= 
            (
                USART_CR1_PCE | // Разрешение контроля чётности-нечётности.
                USART_CR1_M   | // Длина символа 9 бит.
                USART_CR1_PS    // Работаем с признаком нечётности.
            );
            break;
        }
        case PARITY:    // Чётность
        {
            usart -> CR1 |= 
            (
                USART_CR1_PCE | // Разрешение контроля чётности-нечётности.
                USART_CR1_M     // Длина символа 9 бит.
            );
            break;
        }
        default:
        {
            return port;
        }
    }

    // ---- stopBits ----
    // 00 — 1 бит, 01 — 0.5 бит, 10 — 2 бит, 11 — 1.5 бит;

    switch( _stopBits )
    {
        case ONE_STOP_BIT:
        {
            break;
        }
        case ONE_AND_HALF_STOP_BIT:
        {
            usart -> CR2 |= USART_CR2_STOP;
            break;
        }
        case TWO_STOP_BITS:
        {
            usart -> CR2 |= USART_CR2_STOP_1;
            break;
        }
        default:
        {
            lastError = UNSUPPORTED_STOP_BITS_VALUE;
            return port;
        }
    }

    purgeTxBuff();
    purgeRxBuff();

    usart -> SR = 0;
    setEvents();	// Разрешаем нужные нам прерывания.

    return( port );
}
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

Re: stm32f4 cmsis usart +terminal1,9 b

Сообщение ivan dimir »

"Открой файл "system_stm32f4xx.c" и посмотри, что это за параметр." Что за параметр?.Я настраиваю просто на резонатор.И настраиваю скорость usart2 -работает.А настраиваю на PLL шину на скорость 168Мгц.Пшик
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: stm32f4 cmsis usart +terminal1,9 b

Сообщение Dimon456 »

ivan dimir писал(а):stm32f407
по ходу дела выбранный вами проц не вытягивает ваш код, то есть слабоват будет.
Может вам попробовать что нибудь из Cortex-R, а еще лучше Cortex-A? К примеру не плохой будет выбор ARM Cortex-A710.
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: stm32f4 cmsis usart +terminal1,9 b

Сообщение tonyk »

[uquote="ivan dimir",url="/forum/viewtopic.php?p=4066289#p4066289"]"Открой файл "system_stm32f4xx.c" и посмотри, что это за параметр." Что за параметр?.Я настраиваю просто на резонатор.И настраиваю скорость usart2 -работает.А настраиваю на PLL шину на скорость 168Мгц.Пшик[/uquote]
Судя по используемым терминам, ты не понимаешь, что тебе нужно делать. Разберись с устройством ФАПЧ, тогда станет понятно что тебе нужно настраивать и как рассчитать необходимые параметры.
Dimon456 писал(а):по ходу дела выбранный вами проц не вытягивает ваш код, то есть слабоват будет.
Я конечно понимаю, что тут грамотных людей меньше, чем хотелось бы, но такое первый раз встречаю. Ты если покурил или бухнул чего, то не следует сразу сюда выплёскивать отрыжку своего повреждённого мозга.

ТС, тебе для понимания: у 405/407 и 411 одинаковые УАРТы. И системы тактирования тоже одинаковые (не помню есть у 405/407 SAI или нет, но тебе это точно пока не понадобится). Намёк понятен? У меня на 411 работает текстовая консоль на 115200 и два Модбас на 115200, мастер и слэйв. Частота 411 у меня 96МГц.
Спойлер

Код: Выделить всё

#define RCC_PLLCFGR_PLLP_div2              (0x0U << RCC_PLLCFGR_PLLP_Pos)      /*!< 0x00000000 */
#define RCC_PLLCFGR_PLLP_div4              (0x1U << RCC_PLLCFGR_PLLP_Pos)      /*!< 0x00010000 */
#define RCC_PLLCFGR_PLLP_div6              (0x2U << RCC_PLLCFGR_PLLP_Pos)      /*!< 0x00020000 */
#define RCC_PLLCFGR_PLLP_div8              (0x3U << RCC_PLLCFGR_PLLP_Pos)      /*!< 0x00030000 */
#define RCC_CFGR_MCO2_SYSCLK               (0x0U << RCC_CFGR_MCO2_Pos)
#define RCC_CFGR_MCO2_PLLI2S               (0x1U << RCC_CFGR_MCO2_Pos)
#define RCC_CFGR_MCO2_HSE                  (0x2U << RCC_CFGR_MCO2_Pos)
#define RCC_CFGR_MCO2_PLL                  (0x3U << RCC_CFGR_MCO2_Pos)
#define RCC_CFGR_MCO2PRE_div1              (0x0U << RCC_CFGR_MCO2PRE_Pos)
#define RCC_CFGR_MCO2PRE_div2              (0x4U << RCC_CFGR_MCO2PRE_Pos)
#define RCC_CFGR_MCO2PRE_div3              (0x5U << RCC_CFGR_MCO2PRE_Pos)
#define RCC_CFGR_MCO2PRE_div4              (0x6U << RCC_CFGR_MCO2PRE_Pos)
#define RCC_CFGR_MCO2PRE_div5              (0x7U << RCC_CFGR_MCO2PRE_Pos)
#define RCC_CFGR_MCO1PRE_div1              (0x0U << RCC_CFGR_MCO1PRE_Pos)
#define RCC_CFGR_MCO1PRE_div2              (0x4U << RCC_CFGR_MCO1PRE_Pos)
#define RCC_CFGR_MCO1PRE_div3              (0x5U << RCC_CFGR_MCO1PRE_Pos)
#define RCC_CFGR_MCO1PRE_div4              (0x6U << RCC_CFGR_MCO1PRE_Pos)
#define RCC_CFGR_MCO1PRE_div5              (0x7U << RCC_CFGR_MCO1PRE_Pos)
#define RCC_CFGR_I2SSRC_PLLI2S             (0x0U << RCC_CFGR_I2SSRC_Pos)
#define RCC_CFGR_I2SSRC_EXT                (0x1U << RCC_CFGR_I2SSRC_Pos)
#define RCC_CFGR_MCO1_HSI                  (0x0U << RCC_CFGR_MCO1_Pos)
#define RCC_CFGR_MCO1_LSE                  (0x1U << RCC_CFGR_MCO1_Pos)
#define RCC_CFGR_MCO1_HSE                  (0x2U << RCC_CFGR_MCO1_Pos)
#define RCC_CFGR_MCO1_PLL                  (0x3U << RCC_CFGR_MCO1_Pos)

...

    __disable_irq();

    // Настройка FLASH
    FLASH -> ACR = \
        FLASH_ACR_PRFTEN    |
        FLASH_ACR_ICEN      |
        FLASH_ACR_DCEN      |
        FLASH_ACR_LATENCY_3WS;

    // Тактирование ------------------------------------------------------------
    // Включаем HSE = 8 MHz
    RCC -> CR = _VAL2FLD(RCC_CR_HSITRIM,16) | RCC_CR_HSION | RCC_CR_HSEON;

    while( !( RCC -> CR & RCC_CR_HSERDY ) )
    {};

    // Задаём источники тактирования и прескалеры SYSCLK = 96 МГц  USB = 48 МГц
    RCC -> PLLCFGR = \
        RCC_PLLCFGR_PLLSRC_HSE              |
        _VAL2FLD( RCC_PLLCFGR_PLLQ,  4 )     |
        _VAL2FLD( RCC_PLLCFGR_PLLN, 96 )    |
        _VAL2FLD( RCC_PLLCFGR_PLLM,  4 )    |
        RCC_PLLCFGR_PLLP_div2;

    RCC -> CR = \
        _VAL2FLD( RCC_CR_HSITRIM, 16 )  |
        RCC_CR_HSION |
        RCC_CR_HSEON |
        RCC_CR_PLLON;   //Включаем PLL

    while( !( RCC -> CR & RCC_CR_PLLRDY ) )
    {};

    // Переключаемся на PLL с установленнными ранее прескалерами
    RCC -> CFGR = \
        RCC_CFGR_MCO2_HSE       |
        RCC_CFGR_MCO2PRE_div1   |
        RCC_CFGR_MCO1PRE_div1   |
        RCC_CFGR_I2SSRC_PLLI2S  |
        RCC_CFGR_MCO1_HSE       |
        _VAL2FLD( RCC_CFGR_RTCPRE, 8 )  |
        RCC_CFGR_PPRE2_DIV1     |
        RCC_CFGR_PPRE1_DIV2     |
        RCC_CFGR_HPRE_DIV1      |
        RCC_CFGR_SW_PLL;

    SystemCoreClock = 96000000;

    RCC-> CR = \
        _VAL2FLD( RCC_CR_HSITRIM, 16 )  |
        RCC_CR_HSEON                    |
        RCC_CR_PLLON;                       // Выключаем HSI
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

Re: stm32f4 cmsis usart +terminal1,9 b

Сообщение ivan dimir »

Судя по используемым терминам, ты не понимаешь, что тебе нужно делать. Разберись с устройством ФАПЧ, тогда станет понятно что тебе нужно настраивать и как рассчитать необходимые параметры.
Правильно устройство ФАПЧ,Я настроил по чужим примерам.А в USart нужно точная настройка.По поводу контроллера.Это писал такой же амматор как и я.В кубе я смотрел, похоже вот только чего то не хватает.Я поэтому и к вам обратился.Спецам.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: stm32f4 cmsis usart +terminal1,9 b

Сообщение Dimon456 »

ivan dimir писал(а):Это писал такой же амматор как и я
у меня то ума хватит на это
a797945 писал(а):зациклите выдачу 0х55 в режиме 8n1 и замерьте частоту
либо это
Dimon456 писал(а):функция последовательно будет перебирать регистр USART1->BRR, пока не получите адекватную информацию в терминале.
а так же тупо нажать "паузу" в отладчике и выдернуть для анализа, после выполнения или разгона,
ivan dimir писал(а):А настраиваю на PLL шину на скорость 168Мгц.
содержимое регистров

Код: Выделить всё

RCC->CR
RCC->PLLCFGR
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: stm32f4 cmsis usart +terminal1,9 b

Сообщение tonyk »

Я выложил примеры настройки и тактирования, и УАРТ. Всё с комментариями, и даже на русском. Я не понимаю, что ещё нужно показать. Единственное, возможно, для консольного режима приём-передачу по одному символу. Читай комментарии и держи перед глазами описание SFR.
Спойлер////////////////////////////////////////////////////////////////////////////////

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 );
}

////////////////////////////////////////////////////////////////////////////////

int16
ConIO::putChar( int16 _c )
{
if( usart == 0 )
{
return EOF;
}

while( outBuff -> isFull() )
{
Task::yield();
}

outBuff -> put( _c & 0xFF );

__disable_irq();
{
if( !( usart -> CR1 & USART_CR1_TXEIE ) )
{
usart -> SR &= ~USART_SR_TXE;
usart -> CR1 |= USART_CR1_TXEIE;
}
}
__enable_irq();

return _c;
}
////////////////////////////////////////////////////////////////////////////////

void
ConIO::IRQ_Handler( void )
{
if( !usart )
{
abort();
}

// Разберёмся с причиной попадания сюда.

uint8
ch;

uint32
status = usart -> SR;

if( status & USART_SR_TXE )
{
// Данные отправлены в передатчик, регистр данных опустел.
if( !outBuff -> isEmpty() )
{
outBuff -> get( &ch );
usart -> DR = ch;
}
else
{
usart -> CR1 &= ~USART_CR1_TXEIE;
}
}

if( status & USART_SR_RXNE )
{
// Что-то пришло.
ch = USART2 -> DR;

if( !inBuff -> isFull() )
{
inBuff -> put( ch );
}
}
}

////////////////////////////////////////////////////////////////////////////////
//
// end of ConIO.cpp
//
////////////////////////////////////////////////////////////////////////////////
Professor Chaos
Открыл глаза
Сообщения: 41
Зарегистрирован: Вс мар 21, 2021 11:06:04

Re: stm32f4 cmsis usart +terminal1,9 b

Сообщение Professor Chaos »

tonyk писал(а):Читай комментарии и держи перед глазами описание SFR.
Что по-вашему должен сделать код вида:
Reg |= (0<<Pos1)|(0<<Pos2);
Для чего вы это пишите? Проговорите словами, что вы хотите сделать такой строкой.

Извиняюсь, ошибся. У вас так:
Reg = (0<<Pos1)|(0<<Pos2);
Надо лишь помнить, что такой записью вы портите содержимое всех прочих битовых полей регистра Reg, что тоже нежелательно.
Последний раз редактировалось Professor Chaos Вт июл 27, 2021 22:59:34, всего редактировалось 1 раз.
Ответить

Вернуться в «ARM»