Перейти к содержанию
    

adnega

Свой
  • Постов

    3 603
  • Зарегистрирован

  • Посещение

  • Победитель дней

    3

Сообщения, опубликованные adnega


  1. Появилась доска STM32F4DISCOVERY.

     

    Собрал из исходников демку для -mcpu=cortex-m4: без оптимизации работает, с оптимизацией - пока нет)

    Демка сурьезная: играет WAV-файл с флешки.

     

    P.S.: Не работает только с -Os, на -O1 и -O2 работает)

    P.S.2: Работает на всех уровнях оптимизации!

  2. зачем извращатся лишней инструкцийе, попробуйте потестить оновленую сборку (-2 поста вверх), все соберется из стндартных исходников

     

    Собирается.

    Но про равенство регистров нужно помнить...

  3. А так пойдет?

     

    uint32_t __STREXB(uint8_t value, uint8_t *addr)
    {
       uint32_t result=0;
      
      // __ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
       __ASM volatile ("strexb r2, %2, [%1] \n" \
           "    mov %0, r2" : "=r" (result) : "r" (addr), "r" (value) : "r2" );
       return(result);
    }

     

    Из плюсов: не ругается и компилиться

    Из минусов: правка стандартного файла и не гарантируется несовпадение регистров.

     

  4. Эхх...

     

    test.s:493: Error: registers may not be the same -- `strexb r0,r0,[r1]'

    test.s:517: Error: registers may not be the same -- `strexh r0,r0,[r1]'

     

    test.s

     

        .align    1
        .global    __STREXB
        .thumb
        .thumb_func
        .type    __STREXB, %function
    __STREXB:
    .LFB19:
        .loc 1 733 0
        .cfi_startproc
        @ args = 0, pretend = 0, frame = 0
        @ frame_needed = 0, uses_anonymous_args = 0
        @ link register save eliminated.
    .LVL34:
        .loc 1 736 0
    @ 736 "c:/gcc/lib/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport/core_cm3.c" 1
        strexb r0, r0, [r1]  <-- 493 line
    @ 0 "" 2
    .LVL35:
        .loc 1 738 0
        .thumb
        bx    lr
        .cfi_endproc
    .LFE19:
        .size    __STREXB, .-__STREXB
        .align    1
        .global    __STREXH
        .thumb
        .thumb_func
        .type    __STREXH, %function
    __STREXH:
    .LFB20:
        .loc 1 750 0
        .cfi_startproc
        @ args = 0, pretend = 0, frame = 0
        @ frame_needed = 0, uses_anonymous_args = 0
        @ link register save eliminated.
    .LVL36:
        .loc 1 753 0
    @ 753 "c:/gcc/lib/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport/core_cm3.c" 1
        strexh r0, r0, [r1]  <-- 517 line

     

    А это исходный текст

    /**
    * @brief  STR Exclusive (8 bit)
    *
    * @param  value  value to store
    * @param  *addr  address pointer
    * @return        successful / failed
    *
    * Exclusive STR command for 8 bit values
    */
    uint32_t __STREXB(uint8_t value, uint8_t *addr)
    {
       uint32_t result=0;
      
       __ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
       return(result);
    }
    
    /**
    * @brief  STR Exclusive (16 bit)
    *
    * @param  value  value to store
    * @param  *addr  address pointer
    * @return        successful / failed
    *
    * Exclusive STR command for 16 bit values
    */
    uint32_t __STREXH(uint16_t value, uint16_t *addr)
    {
       uint32_t result=0;
      
       __ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
       return(result);
    }

     

    A.3.8 LDREX and STREX

    Load and Store Register Exclusive.

    Syntax

    LDREX{cond} Rt, [Rn {, #offset}]

    STREX{cond} Rd, Rt, [Rn {, #offset}]

    LDREXB{cond} Rt, [Rn]

    STREXB{cond} Rd, Rt, [Rn]

    LDREXH{cond} Rt, [Rn]

    STREXH{cond} Rd, Rt, [Rn]

    where

    cond is an optional condition code; see “Conditional Execution” section on page 358.

    Rd is the destination register for the returned status.

    Rt is the register to load or store.

    Rn is the register on which the memory address is based.

    offset is an optional offset applied to the value in Rn. If offset is omitted, the address is the value in Rn.

    Restrictions

    In these instructions:

    - Do not use PC.

    - Do not use SP for Rd and Rt.

    - For STREX, Rd must be different from both Rt and Rn.

    - The value of offset must be a multiple of 4 in the range 0–1020.

  5. Мне посчастливилось быть у них на экскурсии... Даже те цеха, в которые нас допустили, оставили незабываемые впечатления. Особенно линия автоматического монтажа и испытательный, не побоюсь этого слова, полигон.

  6. На предыдущей версии собиралось без проблем.

     

    C:\gcc\arm-kgp-eabi-x86_32_20111120\bin>arm-kgp-eabi-gcc.exe -mcpu=cortex-m3 -mthumb -g -O0 -c test.s -o test.o

    test.s: Assembler messages:

    test.s:103: Error: SVC is not permitted on this architecture

     

    test.s:

     

    @ 153 "c:/gcc/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c" 1

    ldr r0, =0xE000ED08

    ldr r0, [r0]

    ldr r0, [r0]

    msr msp, r0

    cpsie i

    svc 0 <- 103 line

    nop

     

     

  7. Есть еще вариант "я не знаю механизм зарплатообразования".

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

    Повлиять на зарплату практически не возможно) Ну, разве что сходить в оплачиваемый отпуск на недельку или на больничный залететь...

  8. Понятно. Интересно, как он там оказался. Видимо, ошиблись при создании компонента именно в маске. А если бы рисовали так, как я говорю, то проблем бы не было.

    В конце концов, есть промежуточный вариант: маску корректировать программами подготовки к производству, а компоненты все-таки рисовать без учета этих требований.

     

    Для создания этой платы пользовался KiCADом. В библиотеке компонентов зазоры можно не указывать, тогда значение берется из глобальной переменной. Тем не менее зазоры можно указывать индивидуально хоть для целого компонента, хоть для выбраного PADа.

     

    В спешке был задан очень маленький отступ при заливке земляным полигоном - 0.25мм (обычно ставлю 0.4мм).

    В глобальной переменной, отвечающей за зазор маски - тоже 0.25мм.

    Срочно нужно было изготовить прототип, и большого значения отступам придавать не стали...

     

    Ошибка грубая и между тем легко (я бы даже сказал тривиально) исправимая, просто нужна была обратноя связь...

     

    PS. За день до получения плат я поднимал вопрос тех норм на форуме Резонита. Полученная информация целиком соответствовала моим представлениям о тех требованиях. Как сказать KiCADу о нормах мне тоже прекрасно известно.

     

    Если позволите немного уместного оффтопа:

     

    Летом делал ремонт в туалете. Обратился в фирму, заключил договор, внес предоплату и т.п. чтобы мне заменили сантехнику, и положили на пол плитку. Прайс меня устроил, сумму тоже в голове представлял. Сам я там не живу...

    После того как работа была выполнена (точнее та часть, на которую хватило предоплаты), оказалось, что половина стоимости ремонта это... вывоз мусора! Моя фраза, снять старую краску с пола, залить стяжку и положить плитку чудесным образом сподвигла мастеров расфигачить пол на 10см в глубину, не согласовав работы со мной (хотя это существенный объем работ, денеги и доп материалы)! Вот откуда 20 мешков мусора)

    С дирехтуром обсудили это недоразуменее, сумму я ему мог заплатить, но о дальнейшем сотрудничестве речи идти не могло.

     

    Знаете, работать со специалистами, которых нанимаешь для профессиональной кладки плитки, а им выгоднее выносить мусор (по их расценкам), не хочется)

     

    PS. Да, директор вскоре мне перезвонил, извинился, сделал "беспрецидентную" скидку на вынос мусора, и мы аккуратно продолжили осваивать мои деньги... Каждый имеет право на ошибку, но главное не бояться это признать, простить и жить плодотворно дальше, делая мир лучше)

  9. Да, но сделать компоненты под всех производителей невозможно. Повторюсь, проблем с этим никогда не было.

    adnega

    А в чем на фото проблема? Вроде, обычная плата...

     

    Видно, что вокруг контактных площадок серебристый ободок на земляном полигоне - это припой. Любое неосторожное движение и контактная площадка коротит на землю.

     

    vitan

    Так или иначе отступ должен быть. Надеяться на технологов компании, где вы размещаете свой заказ - это прекрасно в том случае, если вы уверены на все 100%, что они сделают подготовку вашего проекта к производству, проверят его на соответствие своим технологическим нормам и согласуют с вами все детали. Этот параметр (отступ маски от площадок) в любом случае полезно хотя бы учитывать при разработке библиотечных компонентов, если уж не задавать, т.к. он вместе с зазором между площадками компонента определяет еще и зазор в маске.

     

    Полностью с Вами согласен. Чудес не бывает, и гарантированный запас по точности нужен!

    Вопрос-то в другом: компания, которая позиционирует себя специалистом в области с опытом 10 лет либо не должна браться за выполнение невыполнимых задач, либо взявшись - сделать качественно.

     

    В разделе "обсуждение Резонит" я думаю уместнее обсуждать не технологию производства, а модель работы с Заказчиком. Характерная черта именно этой компании (на мой взгляд) это не желание понять нужды Заказчика, а освоить полученные средства, прикрыв нужное место тех. нормами, галочками в форме и т.п.

     

    Еще пример (было давно, подробностей точно не помню): заказал печатную плату (повторный заказ) со сроком изготовления 3-4 недели. Выставили счет с суммой "несколько большей", чем я ожидал. Переписка с менеджерами ни к чему не привела, и сумму мне обосновать не смогли. Потом, когда уже выяснилось, что мои платы запущены в производство и сумму счета изменить нет возможности, что ранее это платы были изготовлены на срочном производстве, поэтому и в этот раз их изготовят срочно, я же не предупредил в комментариях, что мне надо с обычным сроком)

  10. Действительно, складывается впечатление, что технологи Резонита/Микролита при малейшей возможности стараются выпускать брак, не предупредив Заказчика. Любые нестыковки в проекте трактуются не в пользу Заказчика.

     

    История из недавних: в проекте была грубейшая ошибка - маска сделана ровно по меди. Итого, приходит срочный заказ, который после напрасных потугов запаять отправляется в корзину. Отдел качества убеждает, мол, сам дурак... но я на обратном и не настаиваю)

     

    Руководство требует отказаться от Резонита, но к качеству как таковому претензий нет. Работа с клиентом неудовлетворительная.

     

    Было несколько способов решить проблему:

    0. Известить о невозможности выполнения заказа из-за нарушения тех. норм!

    1. Позвонить, написать, потребовать Разработчика переделать проект;

    2. Самостоятельно откорректировать слой маски или меди, под требования тех. норм;

    3. Переделать заказ по первому требованию Заказчика;

    4. Разделить ответственность и сделать новый заказ со скидкой;

    5. Другой вариант, полученный в результате диалога Заказчика и Исполнителя.

     

    Нет, блин, убили почти две недели и за деньги Заказчика наделали ему брака, еще и дураком обозвали)

    Клиент остался не доволен...

     

    Мои выводы:

    1. Друзья, внимательнее проверяйте свои проекты перед отправкой в эту компанию, иначе ахтунг.

    2. При возможности выбора делайте заказ в компании более клиент-ориентированной.

     

    PS. "При Путине такого не было..."

    Сори, за эмоции)

  11. Друзья, пока не дописал в main()

     

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4)

     

    долго мучился с очередями и прерываниями.

     

    Насколько это "не красиво"?

     

    PS.:

    FreeRTOSConfig.h:
    
    #define configKERNEL_INTERRUPT_PRIORITY  (0xF0)
    #define configMAX_SYSCALL_INTERRUPT_PRIORITY  (0xC0)
    
    init-usart:
    
    NVIC_InitStructure.NVIC_IRQChannel  = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority  = (uint8_t)(configKERNEL_INTERRUPT_PRIORITY >> 4);
    NVIC_InitStructure.NVIC_IRQChannelSubPriority  = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd  = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    
    

  12. Ну так ведь можно напрямую к памяти обращаться не через bit-band remap.

    Или Вы хотели побитный атомарный доступ организовать? Интересно для чего?

     

    Анализирую исправность CAN-шины.

    Выключаем CAN-контроллер и управляем ногами TX и RX через GPIO.

    Непрерывно выдаю в линию TX поток из 32 битовых кадров, соответствующих уникальному идентификатору устройства:

    0111 - если соответствующий бит идентификатора равен 0;

    0011 - если соответствующий бит идентификатора равен 1;

    После выдачи бита на ногу TX через половину битового интервала читаю ногу RX.

    Если число переданных нулей равно числу принятых, то на шине нет других устройств или обрыв.

    Если все биты 1, то на шине КЗ.

    Если все биты 0, то включен передатчик с доминантным битом (ошибка).

    Если нулей передали меньше, чем приняли, то шина исправна и есть другие устройства - включаем CAN-контроллер.

    Далее, штатная работа CAN-контроллера, до следующей потери линка (отсутствие синхронизирующих пакетов в течение определенного времени).

     

    Так вот, дрыгать ногами нужно быстро (прерывание каждые 62 мкс) - примененная PHY-CAN ограничивает длительность доминантного бита при передаче.

     

    Хотел сформировать битовый массив (размером 128 бит), настроить DMA на запись слова из памяти bit-band для этого массива с инкрементом по кольцу в bit-band для GPIO TX_bit по DMA-запросу от канала сравнения таймера. Аналогичная процедура для приема битов.

    Без DMA все работает, но копирование произвожу в прерывании таймера.

    Сейчас сделал не через битовый массив - пришлось выделить не 4 слова под биты на передачу, а 128.

     

    Для справки:

    - старый вариант каждые 62 мкс вызывал прерывание на порядка 300 - 400 тактов;

    - вариант через bit-band и прерывание таймера - в 10 раз меньше;

    - через DMA - прерывание один раз на все 128 переданных-принятых бит.

     

    Где-то так.

  13. Очень огорчило:

    In the STM32F10xxx both peripheral registers and SRAM are mapped in a bit-band region.

    This allows single bit-band write and read operations to be performed. The operations are

    only available for Cortex-M3 accesses, not from other bus masters (e.g. DMA).

     

    Т.е. "натравить" DMA на bit-band SRAM не получится(

    А счастье было так близко...

     

  14. Из документации:

    "The ADC input clock is generated from the PCLK2 clock divided by a prescaler and it must

    not exceed 14 MHz, refer to Figure 8: Clock tree for low-, medium-, high- and XL-density

    devices, and to Figure 11: Clock tree for connectivity line devices."

    - т.е. не более 14МГц.

     

    Необходимо помнить, что преобразование занимает 12,5 тактов + настройки SMPn (в Вашем случае 1,5 такта).

    Т.е. на одно преобразование тратится минимум 14 тактов частоты АЦП, которая не может быть больше 14МГц.

    Если таймер пытается АЦеПировать с частотой большей 1МГц, то затея не работоспособная.

     

    С какой частотой Вы хотите получать выборки АЦП?

  15. 1. Нужно взять даташит на LM317 и на пожарный датчик. Из этих документов берем характерные числа:

    - питание датчика от 8 до 30В, ток в дежурнм режиме 130мкА;

    - питание схемы 12В;

    - типовое значения тока КЗ датчика - 20мА (максимум 50мА). Выберем 25мА;

    - опорное напряжение стабилизатора 1.25В. Ток Iadj <100мкА можно не учитывать. Разность напряжений между входом и выходом от 1 до 2В для тока 25мА.

     

    2. Схема:

    12В на вывод VI стабилизатора. Между землей и VI керамический конденсатор 0.1мкФ. Резистор для задания тока (считается ниже) между выводами VO и Vadj. Между землей и VO керамический конденсатор 1мкФ. Датчик между выводом Vadj и землей. Напряжение контролируется в точке Vadj.

     

    3. Считаем значение резистора для 25мА по закону Ома.

    R=U/I=1.25/0.025=50 Ом.

     

    4. При напряжении питания датчика 8В разность между входом и выходом >2В.

     

    5. В рабочем режиме контролируем напряжение на датчике. Если напряжение выше 8В, то "норма", если ниже - то "пожар".

     

    6. Результат моделирования.

    При токе датчика 130мкА (дежурный режим "норма"): Rдатчика = 100кОм, Vadj = 11.3В, Wобщее = 1.4мВт.

     

    При токе датчика 25мА ("пожар", питание датчика 8В): Если Vadj = 8В, то Rдатчика = 320 Ом, Wобщее = 300мВт, причем Wlm317 = 69мВт, Wрезистора = 31мВт, Wдатчика = 200мВт.

     

    При токе датчика 25мА ("пожар", питание датчика не фиксируется, сопротивление датчика минимально): Rдатчика = 1мОм, Vadj = 0В, Wобщее = 300мВт, причем Wlm317 = 300мВт, Wрезистора = 31мВт, Wдатчика = 0мВт.

     

  16. А у кого- нибудь получилось записать в эти регистры- хоть что- нибудь?

    Я попробовал- нифига не выходит.

    В лоб, по крайней мере:

     

     

    BKP->DR2=2222;

     

    a=BKP->DR2;

     

    В отладчике сморю а=0... и BKP_DR2=0.... и переправить его руками из отладчика не получается??

     

    Управляющие регистры BKP_CR и BKP_CSR обнулены..

     

    Нифига не понимаю.. Может, что-то не так делаю?

     

    Компилятор Keil 4.12

     

    Необходимые питание и клоки включены?

×
×
  • Создать...