STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

[uquote="Reflector",url="/forum/viewtopic.php?p=3386859#p3386859"]

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

using lcd = LcdSoft<ST7735, 128, 160, 8, LcdOrient::PortraitRev, PinA<6>, GpioB<0xFF>, PinA<2>, PinA<9>, PinA<14>, PinA<3>, 50, 14, 1>;
[/uquote]Это за гранью добра и зла. Вы все эти параметры в голове держите или по 10 раз в описание класса лазите, чтобы его инициализировать не ошибившись? Как тут можно не перепутать куда какой пин пихать? А уж 50,14,1 это вообще магия.

[uquote="a5021",url="/forum/viewtopic.php?p=3386864#p3386864"]Это нечитабельно. Как наглядно инициализировать AFR я уже показывал. Теперь MODER:[/uquote]
У меня полная конфигурация GPIO чипа F427ZI, а это 7 портов (7*16 = 112 ног) занимает около 60 строк. На одном экране я могу задать/проверить полную конфигурацию любой ноги не рыская по коду.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3386934#p3386934"]Это за гранью добра и зла. Вы все эти параметры в голове держите или по 10 раз в описание класса лазите, чтобы его инициализировать не ошибившись? Как тут можно не перепутать куда какой пин пихать? А уж 50,14,1 это вообще магия.[/uquote]
Последние 3 цифры - это тайминги, при их подборе можно и не знать какой именно за что отвечает, т.к. требуемые значения для различных экранов тоже могут составлять великую тайну, потому подбор часто выполняется на глаз, с запасом. А 50 - это я что-то тестил, число должно быть намного меньше :) В описание класса лазить не нужно, по мере набора этой строки IDE выдает подсказки, я лишь ввожу нужные пины, а потом мне без надобности знать какой пин за что отвечает, т.к. класс изначально был отлажен и работает, а внутрь класса все пины попадает с осмысленными именами. Какую-то полезную информация представляет разве что знание о том, какие в целом пины там задействованы и это я прекрасно вижу. Сам же говорил, берется схема и по ней инициализируются порты, только я когда вижу в схеме, что LCD_CS - это PA2, то передаю в шаблон PinA<2>, а у тебя придется устанавливать биты в регистрах и во время инициализации, и во время дальнейшего использования. Опять же, если сильно хочется, то можно поназначать псевдонимы всем пинам, но мне, как автору, это не видится как нечто обязательное.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

Вам что-нибудь известно о хорошем тоне в программировании ? Или, как автору, вам это не видится обязательным?
Одному 60 строк голых цифр удобно и информативно, другому волшебные числа заменили все. ЧуднЫе события здесь происходят.

Не важно сколько экранов будет занимать инициализация GPIO. Важно, чтобы оно одинаково легко (понятно) читалось и через день и через год, а форма записи максимально препятствовала использованию ошибочных значений.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

Если вам для инициализации одного регистра надо целый экран кода, а для порта в 7 регистров - 7 экранов, то вы их неизбежно будете копипастить. Глаз замылится на таком количестве текста и вы будете неизбежно допускать вот такие дурацкие ошибки, как несколько часов назад на другом форуме встретил

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

RCC_AHB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
Много осмысленного текста, а ошибку не вчитываясь хрен заметишь, особенно если это многостраничные портянки. Делаешь один раз заготовку под используемый проц и расставляй себе единички/нолики.

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

  RCC->APB1ENR = (0?RCC_APB1ENR_UART8EN:0)  | (0?RCC_APB1ENR_UART7EN:0)  | (0?RCC_APB1ENR_DACEN:0)    | (0?RCC_APB1ENR_PWREN:0) |
                 (0?RCC_APB1ENR_CAN2EN:0)   | (0?RCC_APB1ENR_CAN1EN:0)   | (0?RCC_APB1ENR_I2C3EN:0)   | (0?RCC_APB1ENR_I2C2EN:0) |
                 (1?RCC_APB1ENR_I2C1EN:0)   | (0?RCC_APB1ENR_UART5EN:0)  | (0?RCC_APB1ENR_UART4EN:0)  | (0?RCC_APB1ENR_USART3EN:0) |
                 (0?RCC_APB1ENR_USART2EN:0) | (0?RCC_APB1ENR_USART3EN:0) | (0?RCC_APB1ENR_USART2EN:0) | (0?RCC_APB1ENR_SPI3EN:0) |
                 (0?RCC_APB1ENR_SPI2EN:0)   | (0?RCC_APB1ENR_WWDGEN:0)   | (0?RCC_APB1ENR_TIM14EN:0)  | (0?RCC_APB1ENR_TIM13EN:0) |
                 (0?RCC_APB1ENR_TIM12EN:0)  | (0?RCC_APB1ENR_TIM7EN:0)   | (1?RCC_APB1ENR_TIM6EN:0)   | (0?RCC_APB1ENR_TIM5EN:0) |
                 (0?RCC_APB1ENR_TIM4EN:0)   | (0?RCC_APB1ENR_TIM3EN:0)   | (0?RCC_APB1ENR_TIM2EN:0);
Главное чтобы в пределах экрана была подсказка что это значит. При таком подходе я не копипащу тонны "осмысленного текста", а расставляю нужные значения на свои места.

Можно, конечно, всё строго типизировать, но это большая и муторная работа, которую делать за производителя чипов не хочется.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

[uquote="a5021",url="/forum/viewtopic.php?p=3386977#p3386977"]Одному 60 строк голых цифр удобно и информативно, другому волшебные числа заменили все. ЧуднЫе события здесь происходят.[/uquote]
Честное слово, ведешь себя как какой-то гуманитарий :) Магические числа, а не никакие ни волшебные, даже гугл по "волшебным" числам ставит на первые два места какой-то женский сайт, где желающим похудеть рекомендуют представить себя стройной и повторять: "десять минус один" :)

Можно, конечно, всё строго типизировать, но это большая и муторная работа, которую делать за производителя чипов не хочется.

Строго типизировать можно и нужно, но в С это нормально не сделаешь. И еще интересно, у тебя такой шаблон где единички можно расставлять под каждый мк есть? У F407, например, периферию можно включать для AHB1/AHB2/AHB3/APB1/APB2 и еще столько же для их LP версий, которые полностью не совпадают. А F429 добавляет еще дополнительную периферию, означает ли это, что нужно где-то хранить по 10 наборов на каждый из этих двух мк?
Последний раз редактировалось Reflector Вс май 27, 2018 20:56:21, всего редактировалось 1 раз.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

[uquote="Reflector",url="/forum/viewtopic.php?p=3387033#p3387033"]И еще интересно, у тебя такой шаблон где единички можно расставлять под каждый мк есть?[/uquote] Под те процы, с которыми я работаю - да. F427ZI
Спойлер

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

  RCC->AHB1ENR = (0?RCC_AHB1ENR_OTGHSULPIEN:0) | (0?RCC_AHB1ENR_OTGHSEN:0)      | (0?RCC_AHB1ENR_ETHMACPTPEN:0) | (0?RCC_AHB1ENR_ETHMACRXEN:0) |
                 (0?RCC_AHB1ENR_ETHMACTXEN:0)  | (0?RCC_AHB1ENR_ETHMACEN:0)     | (0?RCC_AHB1ENR_DMA2DEN:0)     | (1?RCC_AHB1ENR_DMA2EN:0) |
                 (0?RCC_AHB1ENR_DMA1EN:0)      | (1?RCC_AHB1ENR_CCMDATARAMEN:0) | (0?RCC_AHB1ENR_BKPSRAMEN:0)   | (0?RCC_AHB1ENR_CRCEN:0) |
                 (0?RCC_AHB1ENR_GPIOKEN:0)     | (0?RCC_AHB1ENR_GPIOJEN:0)      | (0?RCC_AHB1ENR_GPIOIEN:0)     | (0?RCC_AHB1ENR_GPIOHEN:0) |
                 (1?RCC_AHB1ENR_GPIOGEN:0)     | (1?RCC_AHB1ENR_GPIOFEN:0)      | (1?RCC_AHB1ENR_GPIOEEN:0)     | (1?RCC_AHB1ENR_GPIODEN:0) |
                 (1?RCC_AHB1ENR_GPIOCEN:0)     | (1?RCC_AHB1ENR_GPIOBEN:0)      | (1?RCC_AHB1ENR_GPIOAEN:0);
  RCC->AHB2ENR = (0?RCC_AHB2ENR_OTGFSEN:0) | (0?RCC_AHB2ENR_RNGEN:0) | (0?RCC_AHB2ENR_HASHEN:0) | (0?RCC_AHB2ENR_CRYPEN:0) | (0?RCC_AHB2ENR_DCMIEN:0);
  RCC->AHB3ENR = (1?RCC_AHB3ENR_FMCEN:0);
  RCC->APB1ENR = (0?RCC_APB1ENR_UART8EN:0)  | (0?RCC_APB1ENR_UART7EN:0)  | (0?RCC_APB1ENR_DACEN:0)    | (0?RCC_APB1ENR_PWREN:0) |
                 (0?RCC_APB1ENR_CAN2EN:0)   | (0?RCC_APB1ENR_CAN1EN:0)   | (0?RCC_APB1ENR_I2C3EN:0)   | (0?RCC_APB1ENR_I2C2EN:0) |
                 (1?RCC_APB1ENR_I2C1EN:0)   | (0?RCC_APB1ENR_UART5EN:0)  | (0?RCC_APB1ENR_UART4EN:0)  | (0?RCC_APB1ENR_USART3EN:0) |
                 (0?RCC_APB1ENR_USART2EN:0) | (0?RCC_APB1ENR_USART3EN:0) | (0?RCC_APB1ENR_USART2EN:0) | (0?RCC_APB1ENR_SPI3EN:0) |
                 (0?RCC_APB1ENR_SPI2EN:0)   | (0?RCC_APB1ENR_WWDGEN:0)   | (0?RCC_APB1ENR_TIM14EN:0)  | (0?RCC_APB1ENR_TIM13EN:0) |
                 (0?RCC_APB1ENR_TIM12EN:0)  | (0?RCC_APB1ENR_TIM7EN:0)   | (1?RCC_APB1ENR_TIM6EN:0)   | (0?RCC_APB1ENR_TIM5EN:0) |
                 (0?RCC_APB1ENR_TIM4EN:0)   | (0?RCC_APB1ENR_TIM3EN:0)   | (0?RCC_APB1ENR_TIM2EN:0);
  RCC->APB2ENR = (0?RCC_APB2ENR_SAI1EN:0)  | (0?RCC_APB2ENR_SPI6EN:0)   | (0?RCC_APB2ENR_SPI5EN:0)   | (0?RCC_APB2ENR_TIM11EN:0) |
                 (0?RCC_APB2ENR_TIM10EN:0) | (0?RCC_APB2ENR_TIM9EN:0)   | (1?RCC_APB2ENR_SYSCFGEN:0) | (0?RCC_APB2ENR_SPI4EN:0) |
                 (0?RCC_APB2ENR_SPI1EN:0)  | (0?RCC_APB2ENR_SDIOEN:0)   | (0?RCC_APB2ENR_ADC3EN:0)   | (0?RCC_APB2ENR_ADC2EN:0) |
                 (0?RCC_APB2ENR_ADC1EN:0)  | (1?RCC_APB2ENR_USART6EN:0) | (0?RCC_APB2ENR_USART1EN:0) | (0?RCC_APB2ENR_TIM8EN:0) |
                 (0?RCC_APB2ENR_TIM1EN:0)  | (0?RCC_APB2ENR_LTDCEN:0);


Я и на AVR-ках когда сидел так делал. Мне так проще.
Спойлер

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

    DDRA  = (1 << PA7) | (1 << PA6) | (1 << PA5) | (1 << PA4) | (1 << PA3) | (1 << PA2) | (1 << PA1) | (1 << PA0);
    PORTA = (0 << PA7) | (0 << PA6) | (0 << PA5) | (0 << PA4) | (0 << PA3) | (0 << PA2) | (0 << PA1) | (0 << PA0);

    TCCR1A = (0 << COM1A1) | (0 << COM1A0) | (0 << COM1B1) | (0 << COM1B0) | (0 << COM1C1) | (0 << COM1C0) | (0 << WGM11) | (0 << WGM10);
    TCCR1B = (0 << ICNC1) | (0 << ICES1) | (0 << WGM13) | (1 << WGM12) | (0 << CS12) | (1 << CS11) | (0 << CS10);


Мне кажется это от психотипа зависит. Кто-то портянки беллетристики лучше воспринимает, а меня стройные ряды чисел радуют :)
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3387043#p3387043"]Под те процы, с которыми я работаю - да. F427ZI[/uquote]
У меня было бы так:

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

enablePeriphClock(Ahb1Periph::GpioA | Ahb1Periph::GpioB | Ahb1Periph::GpioC | Ahb1Periph::GpioD | Ahb1Periph::GpioE |
   Ahb1Periph::GpioF | Ahb1Periph::GpioG | Ahb1Periph::CcmRam | Ahb1Periph::Dma2);
enablePeriphClock(Apb1Periph::I2c1 | Apb1Periph::Tim6);
enablePeriphClock(Apb2Periph::Usart6 | Apb2Periph::SysCfg);

Если все порты включены, то можно и так:

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

enablePeriphClock(Ahb1Periph::Gpios | Ahb1Periph::CcmRam | Ahb1Periph::Dma2);

IDE выдает список, выбираешь что нужно. При смешении разной периферии естественно будет ошибка компиляции. Понять какая именно периферия включена значительно легче когда видишь только ее, но все перечисления пришлось объявлять самому.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

[uquote="Reflector",url="/forum/viewtopic.php?p=3387059#p3387059"]но все перечисления пришлось объявлять самому.[/uquote]Алаверды. Под все процы? Это же нужно где-то хранить! :)

А ещё я стараюсь не переобзывать регистры/биты. Потому что когда работаешь с даташитом, хидером, форумом в конце концов, то поиском проще пользоваться когда везде одинаковое название. Бывает, правда, когда в хидере встречаются несоответствия с даташитом, то правлю хидер. И тоже где-то его храню...
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3387071#p3387071"]Алаверды. Под все процы? Это же нужно где-то хранить! :)[/uquote]
А Hse::enable() где, по-твоему, хранится? Там же находятся и все перечисления имеющие отношение к модулю RCC.

А ещё я стараюсь не переобзывать регистры/биты. Потому что когда работаешь с даташитом, хидером, форумом в конце концов, то поиском проще пользоваться когда везде одинаковое название. Бывает, правда, когда в хидере встречаются несоответствия с даташитом, то правлю хидер. И тоже где-то его храню...

Я иногда переобзываю по одной просто причине, по имени не всегда понятно что данный бит означает.

ps. Хидер уж очень режет слух, транскрипция для head - [hed], нет там никакого "и" :)
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3387009#p3387009"]Если вам для инициализации одного регистра надо целый экран кода, а для порта в 7 регистров - 7 экранов, то вы их неизбежно будете копипастить.[/uquote]
Зачем же такую примитвную чепуху из пальца высасывать? Копипастить там особо не получится, т.к. пины разные и назначения у них разное. Придется либо со схемы, либо с какой-то таблички переносить информацию практически попиново. Кроме того, каждая строка это один пин, где сначала идет его номер, а потом режим:

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

    PIN_CONF(PIN(7),  PINV_OUTPUT)    |       // PB7: 
    PIN_CONF(PIN(6),  PINV_OUTPUT)    |       // PB6:
       
    PIN_CONF(PIN(5),  PINV_OUTPUT)    |       // PB5:
    PIN_CONF(PIN(4),  PINV_OUTPUT)    |       // PB4:


Теперь тест на сообразительность: удобнее конфигурацию пину прописывать в строке, где его номер значится или каждый раз считать, какая это цифра с края или по порядку?
Frogfot
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

Re: STM32 новичку в ARM что к чему

Сообщение Frogfot »

Народ, подскажите, где почитать характеристики работы портов STM32 в зависимости от режима скорости - Low speed/Medium speed/High speed?
Хорошему коту и в декабре - март :)
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

В даташите на конкретную микросхему. Есть reference manual на серию, а есть даташит на процессор, где вся конкретика.
jmp_eax
Родился
Сообщения: 17
Зарегистрирован: Вс янв 15, 2017 10:21:13

Re: STM32 новичку в ARM что к чему

Сообщение jmp_eax »

Здравствуйте. Набыдлокодил небольшой примерчик уарт на stm32f103c8t6. Вобщем работает уарт, эхо отстукивает, единственная проблема непонятная кодировка в консоле. Какие могут быть решения. Пните в нужном направлении.

Спойлер

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

#include "stm32f10x.h"

#define LED_BLUE   7   /* PB7 is the blue LED */
#define LED_GREEN    6   /* PB6 is the green LED */
#define MODE_ON    0   /* Offset to add to pin for ON */
#define MODE_OFF   16   /* Offset to add to pin for OFF */

void board_init(void)
{   
   // Most of the peripherals are connected to APB2.  Turn on the
   // clocks for the interesting peripherals
   RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_AFIOEN | RCC_APB2ENR_IOPBEN;
   
   // USART2 Settings
   // SET TX2
   GPIOA->CRL &= ~GPIO_CRL_CNF2;
   GPIOA->CRL |= GPIO_CRL_CNF2_1;
   GPIOA->CRL |= GPIO_CRL_MODE2_0;
   
   // SET RX2   
   GPIOA->CRL &= ~GPIO_CRL_CNF3;
   GPIOA->CRL |= GPIO_CRL_CNF3_0;
   GPIOA->CRL &= ~GPIO_CRL_MODE3;
   
   RCC->APB1ENR |= RCC_APB1ENR_USART2EN;
   
   // Configure BRR by deviding the bus clock with the baud rate for 19200 on 36Mhz
   USART2->BRR    = 0x753;
   
   // Enable the USART, TX, and RX circuit
   USART2->CR1 = USART_CR1_UE | USART_CR1_TE | USART_CR1_RE | USART_CR1_RXNEIE;;
   
   // Put PB7 and PB6 into output mode (the build  blue and green LEDs)
   GPIOB->CRL &= ~(GPIO_CRL_MODE6 | GPIO_CRL_CNF6);
   GPIOB->CRL |= GPIO_CRL_MODE6;
   
   GPIOB->CRL &= ~(GPIO_CRL_MODE7 | GPIO_CRL_CNF7);
   GPIOB->CRL |= GPIO_CRL_MODE7;
   
//   NVIC_EnableIRQ (USART2_IRQn);
//   
//   __enable_irq ();
}

void delay(int cnt)
{
    while (cnt-- > 0)
    {
        __asm("nop");
    }
}

int usart_rec(void)
{
    /* Wait until the data is ready to be received. */
    while ((USART2->SR & USART_SR_RXNE) == 0);

    // read RX data, combine with DR mask (we only accept a max of 9 Bits)
    return USART2->DR & 0x1FF;
}

void usart_snd(int data)
{
    USART2->DR = data;

    // wait for TX
    while ((USART2->SR & USART_SR_TXE) == 0);
}

void usart_snd_str(char *str)
{
    int   i = 0;
    while(str[i] != 0)
    {
      usart_snd(str[i++]);
    }
}

void set_led(int led, int mode)
{
    GPIOB->BSRR = 1<<(led + mode);
}

void flash_led(int led)
{
    set_led(led, MODE_ON);
    delay(15000);
    set_led(led, MODE_OFF);
}

int main(void)
{
    board_init();

    usart_snd_str("\n\rHello, please type something\n\r");

    for(;;) {
        // read blocking form usart
        int rec = usart_rec();

        // flash green led to indicate we received data
        flash_led(LED_GREEN);

        if(rec == '\r') {
            usart_snd_str("\n\r");
        } else {
            // send data blocking to usart
            usart_snd('[');
            usart_snd(rec);
            usart_snd(']');
        }

        // flash blue led to indicate we send data
        flash_led(LED_BLUE);
    }
}

СпойлерИзображение
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

Такое обычно бывает когда формат передачи или скорости не совпадают. Гляньте осциллографом или логическим анализатором в линию.
jmp_eax
Родился
Сообщения: 17
Зарегистрирован: Вс янв 15, 2017 10:21:13

Re: STM32 новичку в ARM что к чему

Сообщение jmp_eax »

Спасибо за направление. Гляну :)
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Re: STM32 новичку в ARM что к чему

Сообщение arkhnchul »

[uquote="jmp_eax",url="/forum/viewtopic.php?p=3389180#p3389180"]

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

   // Configure BRR by deviding the bus clock with the baud rate for 19200 on 36Mhz
   USART2->BRR    = 0x753;
[/uquote]
а на самом деле какая частота?
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

Если считать из учёта PCLK1=36 МГц, то магическое число 0x753 посчитано правильно. А вот как 36 МГц получены от нас спрятали или вообще забыли? И ещё, BRR менять можно только при выключенном порту. Проц при старте точно сброщен?

Так то код корявенький, но принципиальных ошибок, влияющих на передачу, не видно.

Так, по мелочам.
В DR и так будут 0 в незадействованных разрядах.

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

return USART2->DR & 0x1FF;

Зачем тут int? Если обмен 8-битный, то uint8_t.

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

int usart_rec(void)
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3389412#p3389412"]Зачем тут int? Если обмен 8-битный, то uint8_t.

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

int usart_rec(void)
[/uquote]
В данном случае не принципиально, т.к. передача и возврат параметров производятся через регистры, а они 32-битные. Что для восьмибитного возвращаемого значения будет использован один РОН целиком, что для 32-битного.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

Дальше по коду компилятор будет приводить эти знаковые 32 бита к 8, а это не всегда "бесплатно". Применение типов не соответствующих данным - источник потенциальных ошибок. Лучше приучиться применять правильные типы всегда.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3389564#p3389564"]Дальше по коду компилятор будет приводить эти знаковые 32 бита к 8, а это не всегда "бесплатно".[/uquote]
Ничего он приводить в данном случае не будет. Не нужно нагонять жути. Смотрите код -- функция возвращает значение типа int, которое присваивается переменной с тем же самым типом. Приличия, таким образом, соблюдены.

Вообще же, в классическом Си большая часть встроенных функций возвращает тип int и никто не убивается по поводу, что "применяется тип не соответствующий данным".
Ответить

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