ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
26 апреля
639966
=L.A.= (20.12.2015 20:27 - 23.12.2015 09:54, просмотров: 36836) General
Настройки GPIOx семейства STM32F0xx Прочитал в сети ругательства на тему кривизны стандартных библиотек STM32F0xx, предназначенных для инициализации портов ввода-вывода. При ближайшем рассмотрении я понял,что функции действительно неудобные. Они пригодны для того, чтобы настроить пару тройку ножек на выход, а остальные на вход (как это показано в примерах программ для STM32) А если надо настроить ноги порта на разные режимы (входы/выходы, подвешенные,неподвешенные плюс аналоговые входы/выходы), то текст получается громоздким и неудобочитаемым. К тому же, при последовательной настройке следующего пина есть вероятность нарушить натройки предыдущих. Варианты, предложенные по ссылке: http://we.easyelec …royka-gpio-portov.html тоже не отличаются компактностью. Сделал следующее. 1) Для замены длинных и непонятных дефайнов типа: GPIO_MODER_MODER1_0 или GPIO_PUPDR_PUPDR2_1 написал хидер, где применены более короткие и информативные обозначения: PIN1_ANLG ((uint32_t)0x0000000C) PIN2_PU ((uint32_t)0x00000010) 2) Самое основное: сделал запись в регистры настроек не побитно, как в стандартных библиотеках, а сразу всё слово из 16/32 бит. Перед началом такой записи надо выставлять указатель на начальный адрес структуры с данными настроек, что делается функцией assert_param(). В итоге инициализация портов ВВ выглядит примерно так (см.ниже). Размер кода, который генерит ИАР практически одинаков как при использовании стандартных бибилиотек, так и в моём варианте. Экономится скорей количество букв в тексте программы, меньше напрягается зрение и мозг.
//**************************************************************************//
//  GPIOA  
//--------------------------------------------------------------------------//
   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
//
   assert_param(IS_GPIO_ALL_PERIPH(GPIOA)); 
//   
   GPIOA-> MODER = 0x00000000;     // Set all input
   GPIOA-> MODER |= (PIN2_OUT| PIN6_OUT | PIN7_OUT );
   GPIOA-> OTYPER = 0x0000;        // All out push-pull
   GPIOA-> OSPEEDR = 0xFFFFFFFF;   // Speed = 50 MHz
   GPIOA-> PUPDR = 0x24000000;     //  PU and PD  PIN13 , PIN14

//**************************************************************************//
//  GPIOB
//--------------------------------------------------------------------------//  
   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
//
    assert_param(IS_GPIO_ALL_PERIPH(GPIOB)); 
//  
   GPIOB-> MODER = 0x00000000;     // Set all input
   GPIOB-> MODER |=(PIN0_OUT|PIN1_OUT|PIN2_OUT|PIN3_OUT|PIN13_OUT|PIN14_OUT|PIN15_OUT);
   GPIOB-> OTYPER = 0x0000;        // All out push-pull
   GPIOB-> OSPEEDR = 0xFFFFFFFF;   // Speed = 50 MHz
   GPIOB-> PUPDR = 0x00000000;     //   PU and PD off  
   GPIOB-> PUPDR |= (PIN6_PU | PIN7_PU | PIN8_PU ); // PU pin6,7,8
//**************************************************************************//
// GPIOC
//--------------------------------------------------------------------------//
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
//
    assert_param(IS_GPIO_ALL_PERIPH(GPIOC)); 
//  
    GPIOC-> MODER = 0x00000000;     // Set all input
    GPIOC-> MODER |= (PIN6_OUT|PIN8_OUT|PIN9_OUT|PIN10_OUT|PIN11_OUT);
    GPIOC-> OTYPER = 0x0000;        // All out push-pull
    GPIOC-> OSPEEDR = 0xFFFFFFFF;   // Speed = 50 MHz
    GPIOC-> PUPDR = 0x00000000;     //