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

Arlleex

Участник
  • Публикаций

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

  • Посещение

Репутация

0 Обычный

Информация о Arlleex

Контакты

  • Сайт
    http://
  • ICQ
    0

Посетители профиля

2 266 просмотров профиля
  1. Знатокам SGPIO LPC4337

    А разве в этом МК нет настройки приоритета доступа CPU и DMA?
  2. Использование #define значения в ASM KEIL

    1. В ключах Assembler Keil можно прописать --cpreproc. Теперь можно прям в file.s писать #include "Settings.h" и делать DCD MY_DEFINE. 2. Не прописывая ключей в file.s пишем GBLA MY_DEFINE, и можно теперь использовать это имя ниже. MY_DEFINE, например, это #define MY_DEFINE 100.
  3. CAN FD

    Спасибо за ответ! Скорость там все-таки будет не более 125кбит/с, но драйверы были выбраны жестко и не мной. Поэтому и интересовала совместимость.
  4. STM32F107+WiFi по Ethernet

    Можно. Но не понятно, что Вам нужно. Возьмите домашний Wi-Fi роутер. Возможно такое подключение? Возможно. Возьмите модуль WF121, например. Возможно подключить по Ethernet? Возможно.
  5. Почему? Именно по сравнению: как только заданный период прошёл (счётчик таймера сравнялся с указанным значением сравнения), формируется прерывание, в котором регистр сравнения перенастраивается на следующий интервал, а лапка дергается в соответствующую сторону :laughing: А захват - это защёлкивание текущего значения таймера по какому-либо событию, как я понимаю эту всю кухню. Хотя, кстати, да, можно (скорее нужно) делать по захвату. Дёрнулась лапка - захватили значение таймера и проконтролировали рамки прихода ожидаемого фронта...
  6. Не знаю, зачем выделять на это целый UART... Я сделал на таймере в режиме сравнения. Благодаря этому можно использовать любую ножку свободную на МК. Обработчик таймера: #define T1 4 #define T2 7 #define T3 51 #define T4 59 #define T5 89 #define T6 409 #define T7 499 // TypeOperation - тип запрашиваемой операции: // ONE_WIRE_INIT - формирование импульса сброса; // ONE_WIRE_GET_TIME_SLOT - формирование тайм-слота чтения; // ONE_WIRE_SET_TIME_SLOT_0 - формирование тайм-слота записи лог. 0; // ONE_WIRE_SET_TIME_SLOT_0 - формирование тайм-слота записи лог. 1. // // ResultOperation - результат чтения тайм-слота (только при чтении). // // StatusOperation - флаг завершенности работы автомата. // // Перед использованием автомата необходимо указать тип операции и включить // таймер TIMER_START(). Затем дождаться завершения работы автомата. void TIM2_IRQHandler(void) { if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET) { static unsigned char FSMState = 0; switch(TypeOperation) { // автомат формирования импульса сброса case ONE_WIRE_INIT: { switch(FSMState) { case 0: TIM2->ARR = T7; RESET_LINE(WIRE); break; case 1: TIM2->ARR = T5; SET_LINE(WIRE); break; case 2: TIM2->ARR = T6; ResultOperation = GET_LINE(WIRE); break; case 3: TIMER_STOP(); TIM2->ARR = T1; StatusOperation = 1; break; } FSMState = (FSMState + 1) & 0x3; break; } // автомат формирования тайм-слота чтения case ONE_WIRE_GET_TIME_SLOT: { switch(FSMState) { case 0: TIM2->ARR = T1; RESET_LINE(WIRE); break; case 1: TIM2->ARR = T2; SET_LINE(WIRE); break; case 2: TIM2->ARR = T3; ResultOperation = GET_LINE(WIRE); break; case 3: TIMER_STOP(); TIM2->ARR = T1; StatusOperation = 1; break; } FSMState = (FSMState + 1) & 0x3; break; } // автомат формирования тайм-слота записи case ONE_WIRE_SET_TIME_SLOT_0: case ONE_WIRE_SET_TIME_SLOT_1: { switch(FSMState) { case 0: TIM2->ARR = (TypeOperation == HW_ONE_WIRE_SET_TIME_SLOT_0) ? T4 : T1; RESET_LINE(GPIO_ONE_WIRE); break; case 1: TIM2->ARR = (TypeOperation == HW_ONE_WIRE_SET_TIME_SLOT_0) ? T1 : T4; SET_LINE(GPIO_ONE_WIRE); break; case 2: TIMER_STOP(); TIM2->ARR = T1; ++FSMState; StatusOperation = 1; break; } FSMState = (FSMState + 1) & 0x3; break; } } TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } } } Кстати, попутно тут хочу узнать, как красиво организовать счётчик, который считает до, например, 5 и сбрасывается в 0 без условия if(). Ну то есть вычитая, сдвигая... Интересно можно ли так сделать. Для ровных битовых чисел, как в коде выше, как видно, я битовой маской обнуляю. А вот интересно, как быть с числами, не являющихся степенями 2.
  7. В догонку хочу поинтересоваться. Обычно если мне нужна локальная сеть, я беру МК с Ethernet MAC и работаю с ним. Но эта тема натолкнула на давно интересующий меня вопрос: можно ли как-то перенаправлять данные из COM-порта ПК в сетевые сообщения... Не знаю как правильно выразиться. Ну, допустим, хочу веб-морду из браузера для девайса, а Ethernet-а нет. UART только торчит. Нужно же как-то сказать ОС, что вот такой-то COM-порт это полноценная сетевая карточка. Пусть звучит наивно, конечно, но вопрос чисто спортивного интереса (из разряда "поиграться на выходных"). Вернее, я знаю, что это сделать можно. Но как? Windows 7, XP, браузер Chrome, Mozilla, Opera, да разные.
  8. STM32F429 Discovery / uGFX

    Ну покажите артефакты тогда. У меня артефакты были при некачественом питании SDRAM.
  9. STM32F429 Discovery / uGFX

    Как было уже озвучено - все упирается в пропускную способность шины. И никакая двойная буферизация не поможет - даже статичная картинка все равно вычитывается из памяти и отрисовывается с отображением прямо на пиксели. Я поднимал частоту и делал другой формат: не RGB888, а ARGB565. Никаких мерцаний на дисплее 800x480.
  10. LwIP: работа в нескольких подсетях

    Есть девайс. Он находится в одной подсети с ПК 192.168.172.X/24. Но также этот девайс должен уметь работать с другими девайсами, находящимися в других подсетях. Когда было только две подсети, я использовал gateway как адрес второй подсети. Сейчас добавилась ещё одна подсеть, и нужно делать либо статический роут, либо добавлять gateway. А вот есть ли штатные средства LwIP для этого? Или ручками править стек?
  11. stm32f4 + Chan's FatFS

    Мне все-таки нужна консультация, чем отличается SD от SDIO, т.к. даже в даташитах иногда пишут SD/SDIO Card interface, что подразумевает, что это все-таки разные шины. Если не трудно, объясните, пожалуйста, разницу.
  12. Прием по USART

    Чему равен? Есть уверенность, что отправляющий UART не напихивает в регистр без продыху?
  13. Прием по USART

    А, не туда посмотрел. Работать будет, но все равно не ясен смысл еще одного аргумента (количества передаваемых символов). Почему не USART_SendBuf(USART2, "MBE\r"); Вам об этом еще выше писали. А Вы все "да у меня только одно прерывание срабатывает"... Я Вас не зря попросил регистр статуса целиком в переменную загнать и под отладчиком глянуть. Процессор на какой частоте работает и на какой скорости UART обмен ведет?
  14. Прием по USART

    Я что-то не понимаю: зачем просматривать отладчиком периферийные регистры, чувствительные к чтению? Естественно, нормально ничего работать не будет, потому что на точке останова в начале прерывания отладчик считывает регистры USART-модуля, в том числе RDR. При этом очищается RXNE и поэтому дальше по коду RXNE никогда не будет взведен. 1. В обработчике вставьте такой код unsigned int USART_ISRValue; void USART1_IRQHandler(void) { USART_ISRValue = USART1->ISR; if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET) { unsigned char CurrentSymbol = USART_ReceiveData(USART1); USART_SendData(USART1, CurrentSymbol); USART_ClearITPendingBit(USART1, USART_IT_RXNE); } return; } 2. Зайдите в режим отладки. 3. Сбросьте все точки останова. 4. Закройте окно регистров USART в отладчике. 5. Поставьте точку останова на "return" в обработчике прерывания. 6. Откройте любой терминал, и отправьте 1 символ на плату - у Вас сработает точка останова. 7. Зафиксируйте значение USART_ISRValue - какое оно? 8. Теперь откройте окошки регистров USART. 9. Не убирая точки останова, убедитесь, что все работает также. 10. А вот теперь переместите точку останова на строчку USART_ISRValue = USART1->ISR; 11. Отправьте символ на МК, дождитесь срабатывания точки останова. 12. Сделайте 1 шаг (считайте значение USART_ISRValue). Как видно, оно отличается от значения в прошлых пунктах. Выводы: Нельзя пользоваться бездумно отладчиком при работе с чувствительной к чтению регистровой моделью периферии. USART2->ICR = (uint16_t)~USART_FLAG_RXNE; - полная параша, убрать это нужно. 4 - это количество символов? Ну если это так - то, во-первых, понятно, почему принимается всегда по-разному, а во-вторых, такой код никуда не годится - Вам, как пользователю этой функции нафиг знать не нужно, сколько символов в ней. Она должна отправить строку. А строка в Си уже имеет искусственный ограничитель в конце. Устали Вы меня...