Racemaniac
Солнце 17 января 2016 г., 19:23
Я провел в эти выходные, читая на оборудовании i2c & DMA STM32F103, но прогресс медленный >_< (и немного разочаровывает XD).
Я дам вам некоторые из многих вопросов, которые у меня есть до сих пор, если вы можете ответить на любой, это очень поможет xD.
Высокий уровень:
1) Чего я хочу достичь: отправка данных через круговой DMA в порт I2C. Такого примера не будет такого примера? XD
2) Что касается DMA, есть ли библиотеки доступны для этого? Кажется, еще нет библиотеки для этого? Есть ли что -нибудь доступное, о чем я должен знать?
Нижний уровень:
3) Есть ли где -нибудь, где я могу найти хорошую разбивку, в каких значениях, в которых я должен установить регистры, если бы я полностью вручную захотел настроить порт I2C и отправить данные над ним? Я читал руководство & Глядя на примеры & Библиотеки, и я медленно собираю все это вместе, но, черт возьми, *****, найти только шаги, чтобы сделать это, не должно быть так сложно, если это? И собирать его вместе из Hardwire & Libmaple также немного утомите, он распространяется на немало файлов >_<.
4) Я читал на CCR & Регистр TRISE, который я понимаю в основном контролировать скорость шины I2C. Я изменил значения в i2c.C Файл Libmaple, чтобы сделать его на уровне 600 кГц (в то время как он предназначен только на 400 кГц), все еще, казалось, работал нормально, кто -нибудь уже экспериментировал с тем, что делает & не работает?
5) Если я инициализацию шины I2C через библиотеку Hardwire, это готово, чтобы контроллер DMA использовал ее? (Мне немного интересно о части запроса DMA, но в настоящее время я в основном сосредоточен на понимании автобуса I2C).
6) Одним из экспериментов, которые я прошел, был очень простой код: настроить шину I2C в Hardwire, и пока (1) отправили несколько данных на нее. Это кажется полностью разбившим все? При тестировании, просто выполняя конечное количество записей, все выше 30 или 31, кажется, повторяет это. Просто интересно, что вызывает это. (И также задаюсь вопросом, есть ли у меня DMA в основном делать то же самое, если это приведет к той же проблеме).
И я нашел темы о людях, жалующихся на плохую документацию STM, и я могу согласиться с XD. Определенно есть место для улучшения xD.
Я дам вам некоторые из многих вопросов, которые у меня есть до сих пор, если вы можете ответить на любой, это очень поможет xD.
Высокий уровень:
1) Чего я хочу достичь: отправка данных через круговой DMA в порт I2C. Такого примера не будет такого примера? XD
2) Что касается DMA, есть ли библиотеки доступны для этого? Кажется, еще нет библиотеки для этого? Есть ли что -нибудь доступное, о чем я должен знать?
Нижний уровень:
3) Есть ли где -нибудь, где я могу найти хорошую разбивку, в каких значениях, в которых я должен установить регистры, если бы я полностью вручную захотел настроить порт I2C и отправить данные над ним? Я читал руководство & Глядя на примеры & Библиотеки, и я медленно собираю все это вместе, но, черт возьми, *****, найти только шаги, чтобы сделать это, не должно быть так сложно, если это? И собирать его вместе из Hardwire & Libmaple также немного утомите, он распространяется на немало файлов >_<.
4) Я читал на CCR & Регистр TRISE, который я понимаю в основном контролировать скорость шины I2C. Я изменил значения в i2c.C Файл Libmaple, чтобы сделать его на уровне 600 кГц (в то время как он предназначен только на 400 кГц), все еще, казалось, работал нормально, кто -нибудь уже экспериментировал с тем, что делает & не работает?
5) Если я инициализацию шины I2C через библиотеку Hardwire, это готово, чтобы контроллер DMA использовал ее? (Мне немного интересно о части запроса DMA, но в настоящее время я в основном сосредоточен на понимании автобуса I2C).
6) Одним из экспериментов, которые я прошел, был очень простой код: настроить шину I2C в Hardwire, и пока (1) отправили несколько данных на нее. Это кажется полностью разбившим все? При тестировании, просто выполняя конечное количество записей, все выше 30 или 31, кажется, повторяет это. Просто интересно, что вызывает это. (И также задаюсь вопросом, есть ли у меня DMA в основном делать то же самое, если это приведет к той же проблеме).
И я нашел темы о людях, жалующихся на плохую документацию STM, и я могу согласиться с XD. Определенно есть место для улучшения xD.
Rogerclark
Солнце 17 января 2016 г. 8:59 вечера
Реданьяк написал:
Высокий уровень:
1) Чего я хочу достичь: отправка данных через круговой DMA в порт I2C. Такого примера не будет такого примера? XD
1) Чего я хочу достичь: отправка данных через круговой DMA в порт I2C. Такого примера не будет такого примера? XD
Mrburnette
Пн 18 января 2016 г. 2:05
Rogerclark написал:
Реданьяк написал:
2) Что касается DMA, есть ли библиотеки доступны для этого? Кажется, еще нет библиотеки для этого? Есть ли что -нибудь доступное, о чем я должен знать?
Racemaniac
Пн 18 января 2016 г., 9:32
Rogerclark написал:Реданьяк написал:
Высокий уровень:
1) Чего я хочу достичь: отправка данных через круговой DMA в порт I2C. Такого примера не будет такого примера? XD
1) Чего я хочу достичь: отправка данных через круговой DMA в порт I2C. Такого примера не будет такого примера? XD
Rogerclark
Пн 18 января 2016 г. 10:13
Код F2 DMA может отличаться от того, что, я думаю, мы используем для SPI
По сути, кодовая база, с которой мы начали, была написана мои Leaflabs, но они отказались от поддержки ее около года назад, и даже до того, как они остановились, выполнили какую -либо крупную работу по разработке.
В любом случае, они начали делать DMA в одном смысле, а затем, когда они смотрели на версии F2 (и F4), оборудование DMA отличается от F1.
Поэтому я думаю, что они повторно кодировали функции DMA в ядре, чтобы использовать то, что они называли трубками DMA.
Но из того, что я помню, когда люди, как @victorpv, начали смотреть на DMA для SPI, они обнаружили, что было проще использовать старый код DMA (не более новый код Pipes DMA)
Я думаю, что и более старая версия, и новый код Pipes DMA находятся в ядре F1.
Я знаю, что это не слишком много помогает, но это может объяснить, почему любой пример кода DMA выглядит совсем другим для F2.
Re: RM0008
Трудно читать, поэтому с DMA вам может быть лучше взглянуть на материал в SPI и перекрестную ссылку против руководства, чтобы увидеть, работает ли DMA для i2c аналогичным образом.
Ой...И ... Другим человеком, который сделал какой-то DMA Stuff, является @ahull, который сделал DMA из АЦП для своего проекта Pig-O-Scope.
Возможно, стоит посмотреть на его код DMA, чтобы увидеть, поможет ли он
Я не могу быть гораздо больше помощи, так как я только кратко посмотрел на DMA сам.
По сути, кодовая база, с которой мы начали, была написана мои Leaflabs, но они отказались от поддержки ее около года назад, и даже до того, как они остановились, выполнили какую -либо крупную работу по разработке.
В любом случае, они начали делать DMA в одном смысле, а затем, когда они смотрели на версии F2 (и F4), оборудование DMA отличается от F1.
Поэтому я думаю, что они повторно кодировали функции DMA в ядре, чтобы использовать то, что они называли трубками DMA.
Но из того, что я помню, когда люди, как @victorpv, начали смотреть на DMA для SPI, они обнаружили, что было проще использовать старый код DMA (не более новый код Pipes DMA)
Я думаю, что и более старая версия, и новый код Pipes DMA находятся в ядре F1.
Я знаю, что это не слишком много помогает, но это может объяснить, почему любой пример кода DMA выглядит совсем другим для F2.
Re: RM0008
Трудно читать, поэтому с DMA вам может быть лучше взглянуть на материал в SPI и перекрестную ссылку против руководства, чтобы увидеть, работает ли DMA для i2c аналогичным образом.
Ой...И ... Другим человеком, который сделал какой-то DMA Stuff, является @ahull, который сделал DMA из АЦП для своего проекта Pig-O-Scope.
Возможно, стоит посмотреть на его код DMA, чтобы увидеть, поможет ли он
Я не могу быть гораздо больше помощи, так как я только кратко посмотрел на DMA сам.
Racemaniac
Пн 18 января 2016 г. 12:13
Спасибо за предложения
Я думаю, что мой следующий шаг для понимания порта I2C - просто посмотреть на то, что делает библиотека Hardwire, чтобы инициализировать порт & Отправить данные, чтобы я мог настроить минимальную программу для себя, которая делает то же самое .
И для DMA мне действительно придется посмотреть на эти проекты, они приведут несколько хороших примеров о том, как это работает, я надеюсь .
Как примечание, я должен сказать, что мне нравится, сколько знаний на этом форуме . Всякий раз, когда я посещаю форум Arduino, вы тонели в десятках и десятках постов людей, которые вряд ли имеют представление о том, что они делают xD, и продолжают задавать те же вопросы, которые отвечали на миллион раз, или нашел новый творческий стрелять в ногу xD. И здесь вы видите, что большинство дискуссий довольно технические, и почти все здесь знают, что они делают xD.
Будем надеяться, что это никогда не станет слишком популярным, так что это остается таким: P
Я думаю, что мой следующий шаг для понимания порта I2C - просто посмотреть на то, что делает библиотека Hardwire, чтобы инициализировать порт & Отправить данные, чтобы я мог настроить минимальную программу для себя, которая делает то же самое .
И для DMA мне действительно придется посмотреть на эти проекты, они приведут несколько хороших примеров о том, как это работает, я надеюсь .
Как примечание, я должен сказать, что мне нравится, сколько знаний на этом форуме . Всякий раз, когда я посещаю форум Arduino, вы тонели в десятках и десятках постов людей, которые вряд ли имеют представление о том, что они делают xD, и продолжают задавать те же вопросы, которые отвечали на миллион раз, или нашел новый творческий стрелять в ногу xD. И здесь вы видите, что большинство дискуссий довольно технические, и почти все здесь знают, что они делают xD.
Будем надеяться, что это никогда не станет слишком популярным, так что это остается таким: P
Mrburnette
Пн 18 января 2016 г. 13:56
Реданьяк написал:
<...> Всякий раз, когда я посещаю форум Arduino, вы тонели в десятках и десятках постов людей, которые вряд ли имеют представление о том, что они делают xD, и продолжают задавать те же вопросы, которые отвечали на миллион раз, или нашел новый творческий стрелять в ногу xD. И здесь вы видите, что большинство дискуссий довольно технические, и почти все здесь знают, что они делают xD.
Будем надеяться, что это никогда не станет слишком популярным, так что это остается таким: P
Будем надеяться, что это никогда не станет слишком популярным, так что это остается таким: P
Racemaniac
Пн 18 января 2016 г. 14:31
Я предпочитаю то же самое . Я уже нашел много информации, которую вы упоминали, ребята, выполнив поиск на этом форуме (и я очень часто использую этот трюк Google по той же причине ^^). И я могу только сказать, что ответы, которые у меня были до сих пор на этом форуме, были очень полезными и не агрессивными . Я надеялся, что у некоторых из вас будет больше опыта/узнать о некоторых лучших ресурсах, где я смогу найти больше информации, но я просто продолжу выяснить это сам, посмотрев на эти примеры (а потом, надеюсь, найду способ документировать это здесь Для будущих предпринимателей того же пути ).
Не всегда нахождение готовых блоков для того, что вы хотите сделать, это часть изготовления вещей xD. Это, вероятно, будет раздражать меня еще несколько выходных, когда я борюсь с этим, но если я заберусь, чтобы работать так, как я хочу, это будет потрясающе: P.
Не всегда нахождение готовых блоков для того, что вы хотите сделать, это часть изготовления вещей xD. Это, вероятно, будет раздражать меня еще несколько выходных, когда я борюсь с этим, но если я заберусь, чтобы работать так, как я хочу, это будет потрясающе: P.
Racemaniac
Чт 24 марта 2016 г., 21:30
У меня есть мой первый работа в I2C DMA
Для тех, кто также хочет попробовать, см. Код ниже.
Пока я обошел библиотеку Hardwire, чтобы я полностью контролировал происходящее (Но использовал классы I2C в Libmaple, которые хорошо определяют все регистры & флаги ).
Во время экспериментов иногда моя шина i2c застряла, я сделал некоторые улучшения в этом коде, прежде чем публиковать его (установление условия остановки и т. Д..), но это все еще может произойти. Просто питайте клен, и он снова сработает: P.
Чтобы улучшить: настройка I2C может использовать прерывания, чтобы увидеть, когда флаги установлены, а не занято.
Это также должно следить за прерыванием ошибки порта I2C, чтобы он мог реагировать на возникающие ошибки
Но это начало, и я могу начать экспериментировать с этим .
Приветствует
Раса
Для тех, кто также хочет попробовать, см. Код ниже.
Пока я обошел библиотеку Hardwire, чтобы я полностью контролировал происходящее (Но использовал классы I2C в Libmaple, которые хорошо определяют все регистры & флаги ).
Во время экспериментов иногда моя шина i2c застряла, я сделал некоторые улучшения в этом коде, прежде чем публиковать его (установление условия остановки и т. Д..), но это все еще может произойти. Просто питайте клен, и он снова сработает: P.
Чтобы улучшить: настройка I2C может использовать прерывания, чтобы увидеть, когда флаги установлены, а не занято.
Это также должно следить за прерыванием ошибки порта I2C, чтобы он мог реагировать на возникающие ошибки
Но это начало, и я могу начать экспериментировать с этим .
Приветствует
Раса
#include
#include
uint8_t data[] = {13,37};
void setup() {
Serial.begin(115200);
pinMode(32, INPUT);
pinMode(33, OUTPUT);
testDMA();
}
void loop() {
delay(500);
digitalWrite(33, !digitalRead(33));
}
void testDMA()
{
delay(10);
setupDMA();//set up the dma before doing anything with the peripheral
setupI2C();//set up the peripheral
i2c_peripheral_enable(I2C1);//enable the port
i2c_start_condition(I2C1);//set the start condition
uint32_t sr1 = I2C1->regs->SR1;
uint32_t sr2 = I2C1->regs->SR2;
while(!(sr1&I2C_SR1_SB))//wait for the start bit to be set
{
sr1 = I2C1->regs->SR1;
sr2 = I2C1->regs->SR2;
}
i2c_write(I2C1, 96<<1);//write the address of the device you want to contact (shifted 1 to the left)
sr1 = I2C1->regs->SR1;
sr2 = I2C1->regs->SR2;
while(!(sr1&I2C_SR1_ADDR))//wait for the ACK of the device. If no ACK is received, the I2C_SR1_AF bit will be set instead, this code doesn't check for that
{
sr1 = I2C1->regs->SR1;
sr2 = I2C1->regs->SR2;
}
//after the ack a dma request will be sent, and the dma controller will take over
}
void setupI2C()
{
i2c_stop_condition(I2C1);//always good to start with, if the I2C bus ended in an invalid state, setting the stop condition usually resets it
i2c_peripheral_disable(I2C1);//and also disable it to be sure
i2c_init(I2C1);//initialize it
i2c_config_gpios(I2C1);//configure the gpios
I2C1->regs->CR2 = I2C_CR2_DMAEN | 36; //dma enabled, peripheral frequency is 36Mhz
I2C1->regs->CCR = I2C_CCR_FS | 30;
I2C1->regs->TRISE = 11;
}
void setupDMA()
{
dma_tube_config i2cConfig =
{
data //the memory we want to do DMA from
,DMA_SIZE_8BITS //the memory access will be 8 bits
,&(I2C1->regs->DR) //the dma will go towards the data register of the i2c port
,DMA_SIZE_8BITS //the i2c port is 8 bits
,2 // we need to transfer 2 times, so 2 bytes in this case
,DMA_MINC_MODE|DMA_CFG_CIRC //we enable memory increment & circular dma. So after the first transfer it goes to the second byte, after the second transfer it starts over again
,0
,DMA_REQ_SRC_I2C1_TX//the source of the interrupts is the transmit buffer empty interrupt if i2c1
};
dma_init(DMA1);//init DMA controller 1
if(dma_tube_cfg(DMA1, DMA_CH6, &i2cConfig) > 0) //for transmission over I2C1 we need channel 6 (see docs)
dma_set_priority(DMA1, DMA_CH6, DMA_PRIORITY_VERY_HIGH);
dma_enable(DMA1, DMA_CH6);
}
//prints the status of the I2C peripheral
void printStatus(char* position)
{
Serial.println(position);
Serial.println("CR1");
Serial.println(I2C1->regs->CR1);
Serial.println("CR2");
Serial.println(I2C1->regs->CR2);
Serial.println("OAR1");
Serial.println(I2C1->regs->OAR1);
Serial.println("OAR2");
Serial.println(I2C1->regs->OAR2);
Serial.println("DR");
Serial.println(I2C1->regs->DR);
Serial.println("SR1");
Serial.println(I2C1->regs->SR1);
Serial.println("SR2");
Serial.println(I2C1->regs->SR2);
Serial.println("CCR");
Serial.println(I2C1->regs->CCR);
Serial.println("TRISE");
Serial.println(I2C1->regs->TRISE);
}
//prints the status of dma channel 6
void printDmaStatus(char* position)
{
Serial.println(position);
Serial.println("CCR6");
Serial.println(DMA1->regs->CCR6);
Serial.println("CPAR6");
Serial.println(DMA1->regs->CPAR6);
Serial.println("CMAR6");
Serial.println(DMA1->regs->CMAR6);
Serial.println("CNDTR6");
Serial.println(DMA1->regs->CNDTR6);
Serial.println("IFCR");
Serial.println(DMA1->regs->IFCR);
Serial.println("ISR");
Serial.println(DMA1->regs->ISR);;
}
Rogerclark
Пт 25 марта 2016 г. 3:26 утра
@racemaniac
Спасибо за публикацию.
Я уверен, что это будет очень удобно .
В STM32 в STM32 много отличных функциональности, которые обычно царапаем поверхность использования
Спасибо за публикацию.
Я уверен, что это будет очень удобно .
В STM32 в STM32 много отличных функциональности, которые обычно царапаем поверхность использования
Racemaniac
Пн 28 марта 2016 г., 9:01
Я наконец чувствую, как водить этот порт .
Я чувствую, что немного иду против того, в каком направлении Ардуино пытается предложить вам XD. Вместо того, чтобы использовать библиотеку и простую программу, я копаю глубоко и иду прямо для оборудования: P. Мне пришлось изменить ядро, чтобы я мог перехватывать обработчики IRQ и обменять их своими собственными . Но этот порт имеет так много хороших способов его использования, к которым нельзя получить доступ через Hardwire .
Банкомат, я думаю о том, чтобы сделать DMA на одном порту i2c для передачи больших кусков, а на другом порту я хочу иметь очень точный контроль, когда отправляю данные, чтобы я мог пойти на i2c с часовой стяжкой . У порта так много хороших режимов, которые вы можете использовать .
Я собираюсь посмотреть, смогу ли я как -то обернуть эти функции в библиотеку . Было бы неплохо для других, это будет предлагать гораздо больше силы, чем просто иметь Hardwire .
Я чувствую, что немного иду против того, в каком направлении Ардуино пытается предложить вам XD. Вместо того, чтобы использовать библиотеку и простую программу, я копаю глубоко и иду прямо для оборудования: P. Мне пришлось изменить ядро, чтобы я мог перехватывать обработчики IRQ и обменять их своими собственными . Но этот порт имеет так много хороших способов его использования, к которым нельзя получить доступ через Hardwire .
Банкомат, я думаю о том, чтобы сделать DMA на одном порту i2c для передачи больших кусков, а на другом порту я хочу иметь очень точный контроль, когда отправляю данные, чтобы я мог пойти на i2c с часовой стяжкой . У порта так много хороших режимов, которые вы можете использовать .
Я собираюсь посмотреть, смогу ли я как -то обернуть эти функции в библиотеку . Было бы неплохо для других, это будет предлагать гораздо больше силы, чем просто иметь Hardwire .
Rogerclark
Пн 28 марта 2016 г. 9:20 утра
Если в коде должны быть изменения, которые не влияют на существующую функциональность, я рад подумать о том, чтобы добавить их в ядро.
Racemaniac
Пн 28 марта 2016 г., 11:10 утра
Rogerclark написал:Если в коде должны быть изменения, которые не влияют на существующую функциональность, я рад подумать о том, чтобы добавить их в ядро.
Rogerclark
Пн 28 марта 2016 г., 8:29 вечера
Я не совсем уверен, что вы имеете в виду в задержке вещей
Но ISR всегда должны храниться как можно более коротким и не включать в себя преднамеренные петли задержки.
Если что -то требует задержки во времени, лучше всего запустить таймер за этот период задержки и сделать код оставшейся в таймере ISR.
Но ISR всегда должны храниться как можно более коротким и не включать в себя преднамеренные петли задержки.
Если что -то требует задержки во времени, лучше всего запустить таймер за этот период задержки и сделать код оставшейся в таймере ISR.
Racemaniac
Вт 29 марта 2016 г., 7:34 утра
Rogerclark написал:Я не совсем уверен, что вы имеете в виду в задержке вещей
Но ISR всегда должны храниться как можно более коротким и не включать в себя преднамеренные петли задержки.
Если что -то требует задержки во времени, лучше всего запустить таймер за этот период задержки и сделать код оставшейся в таймере ISR.
Но ISR всегда должны храниться как можно более коротким и не включать в себя преднамеренные петли задержки.
Если что -то требует задержки во времени, лучше всего запустить таймер за этот период задержки и сделать код оставшейся в таймере ISR.
Rogerclark
Вт 29 марта 2016 г., 9:40 утра
Я сомневаюсь, что это проблема, которую у вас возникает, но я заметил, что, как только я настраиваю таймер, кажется, что вызывает прерывание.
Я, наверное, делаю что -то не так Но у меня не было времени, чтобы точно изучить, почему это происходит.
Я, наверное, делаю что -то не так Но у меня не было времени, чтобы точно изучить, почему это происходит.
ZMEMW16
Вт 29 марта 2016 г., 9:57 утра
С таким поведением я подозреваю, что установлен флаг, на Avr Istr необходимо полностью отключить прерывания, установить регистры таймера, а затем повторно прерывания.
Разве STM32 не имеет набора «домена», включившись в регистрации? Домены SPI/I2C/ADC/UARTS и т. Д
Я собирался спросить, не вставит ли он «рети» в качестве обработчика, в то время как он изменил регистры и потом изменит реального обработчика.
Опять же, где-то я видел фрагменты, которым нужен бит регистрации, который должен быть установлен или очищен, чтобы явно повторно выполнять определенную операцию или прерывание.
Приносим извинения, но место для поиска руководства может быть примером SPL Code, поскольку он гораздо более заметен на своих шагах, касающихся аппаратного обеспечения? на самом деле это, вероятно, я не использую это
Стивен
Разве STM32 не имеет набора «домена», включившись в регистрации? Домены SPI/I2C/ADC/UARTS и т. Д
Я собирался спросить, не вставит ли он «рети» в качестве обработчика, в то время как он изменил регистры и потом изменит реального обработчика.
Опять же, где-то я видел фрагменты, которым нужен бит регистрации, который должен быть установлен или очищен, чтобы явно повторно выполнять определенную операцию или прерывание.
Приносим извинения, но место для поиска руководства может быть примером SPL Code, поскольку он гораздо более заметен на своих шагах, касающихся аппаратного обеспечения? на самом деле это, вероятно, я не использую это
Стивен
Racemaniac
Вторник 29 марта 2016 г. 12:42
И для тех, кто задается вопросом, почему я пытался его замедлить: он управляет ЦАП, который обеспечивает звук, поэтому я не хочу, чтобы он пошел на полную скорость, а скорее при скорости отбора проб звука XD. (Я * мог бы * попытаться точно соответствовать частоте I2C с скоростью отбора проб, но просто использование тактовой растяжения намного проще: P)
Кстати, для тех, кто заинтересован, я также проверил, как быстро я мог заставить порт I2C работать с ЦАП, и хотя он заставлен на 400 кГц, он, казалось, продолжал работать до 1.2 МГц . (Не тестировал его в течение более длительных периодов, но если ему удается продолжать бегать без перерыва в течение нескольких минут, это довольно обнадеживает). Как только я попытался идти еще быстрее, это сразу не удалось .
И для тех, кто задается вопросом, как получить его так быстро: если вы установите скорость 400 кГц, часть CCR I2C_CCR будет содержать значение 30, установив его на 10 в три мах . Все, что ниже 10, просто не удалось ^^
Кстати, для тех, кто заинтересован, я также проверил, как быстро я мог заставить порт I2C работать с ЦАП, и хотя он заставлен на 400 кГц, он, казалось, продолжал работать до 1.2 МГц . (Не тестировал его в течение более длительных периодов, но если ему удается продолжать бегать без перерыва в течение нескольких минут, это довольно обнадеживает). Как только я попытался идти еще быстрее, это сразу не удалось .
И для тех, кто задается вопросом, как получить его так быстро: если вы установите скорость 400 кГц, часть CCR I2C_CCR будет содержать значение 30, установив его на 10 в три мах . Все, что ниже 10, просто не удалось ^^
Rogerclark
Вторник 29 марта 2016 г., 21:23
Отличный.
Я думаю, что нам всем нравится толкать конверт
Я думаю, что нам всем нравится толкать конверт
Racemaniac
Пт. 01 апреля 2016 г., 18:22
Хорошо, я добиваюсь хорошего прогресса, но я просто столкнулся с чем -то странным, и, возможно, вы, ребята, сможете пролить свет на это.
В настоящее время я использую I2C в DMA, и пусть прерывания контроллеров установили глобальную переменную, чтобы указать, что связь DMA завершена.
Я еще не делаю работу во время DMA (он все еще настраивает устройство), поэтому, пока у меня работает DMA, я получил петлю ожидания, как это:
В настоящее время я использую I2C в DMA, и пусть прерывания контроллеров установили глобальную переменную, чтобы указать, что связь DMA завершена.
Я еще не делаю работу во время DMA (он все еще настраивает устройство), поэтому, пока у меня работает DMA, я получил петлю ожидания, как это:
while(dmaBusy);
Mrburnette
Пт 01 апреля 2016 г., 21:41
Реданьяк написал:Хорошо, я добиваюсь хорошего прогресса, но я просто столкнулся с чем -то странным, и, возможно, вы, ребята, сможете пролить свет на это.
<...>
<...>
Racemaniac
Пт 01 апреля 2016 г., 21:57
Mrburnette написал:Реданьяк написал:Хорошо, я добиваюсь хорошего прогресса, но я просто столкнулся с чем -то странным, и, возможно, вы, ребята, сможете пролить свет на это.
<...>
<...>
Rogerclark
Пт 01 апреля 2016 г., 22:06
нестабильный отличается от статического
Любая переменная может быть объявлена как летучая
Он в основном говорит компилятору, что переменная может измениться без какого -либо кода, который будет изменен.
В этом случае это код в ISR, который его меняет, и компилятор не знает, что ISR вызывается аппаратным обеспечением.
Я думаю, что летучие также можно использовать при работе с периферийными устройствами с отображенной памятью
Любая переменная может быть объявлена как летучая
Он в основном говорит компилятору, что переменная может измениться без какого -либо кода, который будет изменен.
В этом случае это код в ISR, который его меняет, и компилятор не знает, что ISR вызывается аппаратным обеспечением.
Я думаю, что летучие также можно использовать при работе с периферийными устройствами с отображенной памятью
Racemaniac
Пт 01 апреля 2016 г., 22:29
Rogerclark написал:нестабильный отличается от статического
Любая переменная может быть объявлена как летучая
Он в основном говорит компилятору, что переменная может измениться без какого -либо кода, который будет изменен.
В этом случае это код в ISR, который его меняет, и компилятор не знает, что ISR вызывается аппаратным обеспечением.
Я думаю, что летучие также можно использовать при работе с периферийными устройствами с отображенной памятью
Любая переменная может быть объявлена как летучая
Он в основном говорит компилятору, что переменная может измениться без какого -либо кода, который будет изменен.
В этом случае это код в ISR, который его меняет, и компилятор не знает, что ISR вызывается аппаратным обеспечением.
Я думаю, что летучие также можно использовать при работе с периферийными устройствами с отображенной памятью
Ddrown
SAT 02 апреля 2016 г., 2:41
Реданьяк написал:
Когда вы должны объявить что -то нестабильное? Сейчас я говорю глобальную переменную, но я думаю, что в этом контексте правильный термин - просто статическая переменная (я все еще ускоряюсь с C/C++ ).
Racemaniac
SAT 02 апреля 2016 г., 6:27
Я привык развиваться на языках более высокого уровня ^^
Я знаю обо всех этих концепциях, но это все еще привыкает к ним, когда их встречают . Спасибо за сложную демонстрацию . Рад, что мое предположение об оптимизации компилятора было правильным . Я должен помнить об этом при программировании этих вещей с низким уровнем >_<.
Я знаю обо всех этих концепциях, но это все еще привыкает к ним, когда их встречают . Спасибо за сложную демонстрацию . Рад, что мое предположение об оптимизации компилятора было правильным . Я должен помнить об этом при программировании этих вещей с низким уровнем >_<.
Racemaniac
SAT 02 апреля 2016 г. 13:10
Реданьяк написал:Я привык развиваться на языках более высокого уровня ^^
Я знаю обо всех этих концепциях, но это все еще привыкает к ним, когда их встречают . Спасибо за сложную демонстрацию . Рад, что мое предположение об оптимизации компилятора было правильным . Я должен помнить об этом при программировании этих вещей с низким уровнем >_<.
Я знаю обо всех этих концепциях, но это все еще привыкает к ним, когда их встречают . Спасибо за сложную демонстрацию . Рад, что мое предположение об оптимизации компилятора было правильным . Я должен помнить об этом при программировании этих вещей с низким уровнем >_<.
Mrburnette
Сб 02 апреля 2016 г., 19:13
Реданьяк написал:
<...>
На этот раз я столкнулся с этим вопросом: http: // www.STM32duino.com/viewtopic.PHP?f = 3&t = 407
Не знал, что использование «новой» - не лучшая идея xD. (Я прекрасно разделяю все свои функциональные возможности на небольшие библиотеки, поэтому у меня есть несколько классов ).
На этот раз я столкнулся с этим вопросом: http: // www.STM32duino.com/viewtopic.PHP?f = 3&t = 407
Не знал, что использование «новой» - не лучшая идея xD. (Я прекрасно разделяю все свои функциональные возможности на небольшие библиотеки, поэтому у меня есть несколько классов ).
Racemaniac
Сб 02 апреля 2016 г., 8:04 вечера
Mrburnette написал:Реданьяк написал:
<...>
На этот раз я столкнулся с этим вопросом: http: // www.STM32duino.com/viewtopic.PHP?f = 3&t = 407
Не знал, что использование «новой» - не лучшая идея xD. (Я прекрасно разделяю все свои функциональные возможности на небольшие библиотеки, поэтому у меня есть несколько классов ).
На этот раз я столкнулся с этим вопросом: http: // www.STM32duino.com/viewtopic.PHP?f = 3&t = 407
Не знал, что использование «новой» - не лучшая идея xD. (Я прекрасно разделяю все свои функциональные возможности на небольшие библиотеки, поэтому у меня есть несколько классов ).
Mrburnette
Солнце 03 апреля 2016 г. 14:10
Реданьяк написал:
<...>
Надеюсь, я смогу разоблачить то, что я пишу как библиотеку
Я сделал небольшую библиотеку I2C, которая работает через DMA & Прерывания, позволяя легко отправлять данные I2C в фоновом режиме и многозадачности .
<...>
Надеюсь, я смогу разоблачить то, что я пишу как библиотеку
Я сделал небольшую библиотеку I2C, которая работает через DMA & Прерывания, позволяя легко отправлять данные I2C в фоновом режиме и многозадачности .
<...>
Racemaniac
Солнце 03 апреля 2016 г. 14:59
Mrburnette написал:Реданьяк написал:
<...>
Надеюсь, я смогу разоблачить то, что я пишу как библиотеку
Я сделал небольшую библиотеку I2C, которая работает через DMA & Прерывания, позволяя легко отправлять данные I2C в фоновом режиме и многозадачности .
<...>
Надеюсь, я смогу разоблачить то, что я пишу как библиотеку
Я сделал небольшую библиотеку I2C, которая работает через DMA & Прерывания, позволяя легко отправлять данные I2C в фоновом режиме и многозадачности .
<...>
Mrburnette
Солнце 03 апреля 2016 г. 18:10
Реданьяк написал:
<...>
Я знаю, это уже существует, я также сильно полагаюсь на все, что уже в рамках, но я не совсем уверен, смогу ли я сменить Hardwire легко работать с DMA, есть некоторые раздражающие различия между обоими режимами
Когда я заставляю все, что работает так, как я хочу, я смогу посмотреть, если я могу приблизить его к существующим библиотекам, или если я держу его больше отдельной либера <...>
Я знаю, это уже существует, я также сильно полагаюсь на все, что уже в рамках, но я не совсем уверен, смогу ли я сменить Hardwire легко работать с DMA, есть некоторые раздражающие различия между обоими режимами
Когда я заставляю все, что работает так, как я хочу, я смогу посмотреть, если я могу приблизить его к существующим библиотекам, или если я держу его больше отдельной либера <...>
Racemaniac
Солнце 03 апреля 2016 г. 18:40
Mrburnette написал:Реданьяк написал:
<...>
Я знаю, это уже существует, я также сильно полагаюсь на все, что уже в рамках, но я не совсем уверен, смогу ли я сменить Hardwire легко работать с DMA, есть некоторые раздражающие различия между обоими режимами
Когда я заставляю все, что работает так, как я хочу, я смогу посмотреть, если я могу приблизить его к существующим библиотекам, или если я держу его больше отдельной либера <...>
Я знаю, это уже существует, я также сильно полагаюсь на все, что уже в рамках, но я не совсем уверен, смогу ли я сменить Hardwire легко работать с DMA, есть некоторые раздражающие различия между обоими режимами
Когда я заставляю все, что работает так, как я хочу, я смогу посмотреть, если я могу приблизить его к существующим библиотекам, или если я держу его больше отдельной либера <...>
Mrburnette
Солнце 03 апреля 2016 г., 8:25 вечера
Реданьяк написал:
<...>
Спасибо за дополнительную информацию
<...>
Я профессиональный программист, но это первый раз, когда углубляется в этот низкий уровень . Это освежает работать на другом уровне и узнать, как оборудование работает глубоко . И думать о том, как решить проблемы программирования таким образом, чтобы подходить к такому устройству .
Спасибо за дополнительную информацию
<...>
Я профессиональный программист, но это первый раз, когда углубляется в этот низкий уровень . Это освежает работать на другом уровне и узнать, как оборудование работает глубоко . И думать о том, как решить проблемы программирования таким образом, чтобы подходить к такому устройству .
Racemaniac
Солнце 03 апреля 2016 г., 8:52 вечера
Mrburnette написал:
<Большой пост>
Луча
Луча
Racemaniac
Ср. 06, 2016 18:13
Хорошо, у меня есть несколько первых хороших результатов
Я покажу вывод логического анализатора того, что я достиг до сих пор. Это код, который читает MPU6050, который выводит 100 образцов DMP 42 байта в секунду.
Вот первоначальный результат программы, которую вы можете найти на этом форуме, используя I2C по скорости 100 кГц
http: // пользователи.Теленет.Be/racemaniac/Original.пнн (Также добавил URL в изображение, так как он, похоже, не загружается с помощью IMG в моем браузере?)
В основном микроконтроллер завален и вообще не может быть в курсе. Он читает немного больше состояний, чем моя возможная программа, но не так много, это также довольно медленная реализация I2C, которая даже не достигает 100 кГц полностью. (Просто вкладывает в это Hardwire, уже улучшит это ).
http: // пользователи.Теленет.be/racemaniac/sync%20dma.пнн
Это результат с моим кодом DMA, но он все еще ждет при отправке/получении данных. На 2 -м канале вы видите, что линия нанижена, когда процессор занят, и высокая, когда она бесплатна, она занята примерно в 50% случаев, так как это все время ожидает общения
http: // пользователи.Теленет.be/racemaniac/async%20dma.пнн
И это последний результат, который я хотел. Канал 2 снова показывает, когда процессор занят, но когда DMA активен, ЦП больше не нужно ждать. Поэтому вместо того, чтобы быть занятым 50% случаев, теперь он занят только около 5% случаев (который делает некоторую сложную математику для обработки результатов. Передача данных является небрежной). За импульс на канале 5 (импульс прерывания MPU, когда доступны данные), вы увидите 4 импульса на канале 2 (4 запроса DMA), а затем больший блок, который является расчетом. Так что только обработка данных теперь требует времени .
Это то, чего я хотел достичь с DMA . и при 100 кГц это кажется очень стабильным .
Я покажу вывод логического анализатора того, что я достиг до сих пор. Это код, который читает MPU6050, который выводит 100 образцов DMP 42 байта в секунду.
Вот первоначальный результат программы, которую вы можете найти на этом форуме, используя I2C по скорости 100 кГц
http: // пользователи.Теленет.Be/racemaniac/Original.пнн (Также добавил URL в изображение, так как он, похоже, не загружается с помощью IMG в моем браузере?)
В основном микроконтроллер завален и вообще не может быть в курсе. Он читает немного больше состояний, чем моя возможная программа, но не так много, это также довольно медленная реализация I2C, которая даже не достигает 100 кГц полностью. (Просто вкладывает в это Hardwire, уже улучшит это ).
http: // пользователи.Теленет.be/racemaniac/sync%20dma.пнн
Это результат с моим кодом DMA, но он все еще ждет при отправке/получении данных. На 2 -м канале вы видите, что линия нанижена, когда процессор занят, и высокая, когда она бесплатна, она занята примерно в 50% случаев, так как это все время ожидает общения
http: // пользователи.Теленет.be/racemaniac/async%20dma.пнн
И это последний результат, который я хотел. Канал 2 снова показывает, когда процессор занят, но когда DMA активен, ЦП больше не нужно ждать. Поэтому вместо того, чтобы быть занятым 50% случаев, теперь он занят только около 5% случаев (который делает некоторую сложную математику для обработки результатов. Передача данных является небрежной). За импульс на канале 5 (импульс прерывания MPU, когда доступны данные), вы увидите 4 импульса на канале 2 (4 запроса DMA), а затем больший блок, который является расчетом. Так что только обработка данных теперь требует времени .
Это то, чего я хотел достичь с DMA . и при 100 кГц это кажется очень стабильным .
Rogerclark
Ср. 06, 2016, 8:36 вечера
Вы строите какую -то систему расчета абсолютного положения?
Я отказался от проекта IMU с использованием MPU9150, поскольку дрейф, вызванный смещениями в данных. (Он также сделал много математики, что заняло много времени на процессоров, но основная проблема заключалась в том, что датчик потребительского уровня не достаточно точен)
Я отказался от проекта IMU с использованием MPU9150, поскольку дрейф, вызванный смещениями в данных. (Он также сделал много математики, что заняло много времени на процессоров, но основная проблема заключалась в том, что датчик потребительского уровня не достаточно точен)
Racemaniac
Чт, 07 апреля 2016 г., 6:06
Rogerclark написал:Вы строите какую -то систему расчета абсолютного положения?
Я отказался от проекта IMU с использованием MPU9150, поскольку дрейф, вызванный смещениями в данных. (Он также сделал много математики, что заняло много времени на процессоров, но основная проблема заключалась в том, что датчик потребительского уровня не достаточно точен)
Я отказался от проекта IMU с использованием MPU9150, поскольку дрейф, вызванный смещениями в данных. (Он также сделал много математики, что заняло много времени на процессоров, но основная проблема заключалась в том, что датчик потребительского уровня не достаточно точен)
Racemaniac
Сб 09 апреля 2016 г., 5:46 утра
И пока я думаю, что я закончил с этой частью проекта
Прошлой ночью исправил последние ошибки, которые у меня были с i2c & Асинхровый DMA. Также сделала крошечную структуру для отправки образцов звука через I2C и часовой стресс (как вы, ребята, сообщили, это не класс, лишь несколько статических переменных & Некоторые глобальные методы, которые делают то, что мне нужно, i2c с растяжением часов довольно просты ), объединили оба эскиза (и убедились, что приоритет прерывания был так, как мне нужно было , Я делаю образцы звука с прерыванием таймера, но мне препятствовал одна часть системы DMA). И он запускается в течение всей ночи, получая данные датчика и отправляя синусоидальную волну над ЦАП в 16 кГц .
на следующие части этого проекта
Прошлой ночью исправил последние ошибки, которые у меня были с i2c & Асинхровый DMA. Также сделала крошечную структуру для отправки образцов звука через I2C и часовой стресс (как вы, ребята, сообщили, это не класс, лишь несколько статических переменных & Некоторые глобальные методы, которые делают то, что мне нужно, i2c с растяжением часов довольно просты ), объединили оба эскиза (и убедились, что приоритет прерывания был так, как мне нужно было , Я делаю образцы звука с прерыванием таймера, но мне препятствовал одна часть системы DMA). И он запускается в течение всей ночи, получая данные датчика и отправляя синусоидальную волну над ЦАП в 16 кГц .
на следующие части этого проекта
Mrburnette
Сб 09 апреля 2016 г. 14:54
на следующие части этого проекта
Поздравляю.
Точно так же, как любопытство, вы можете попробовать I2C DMA вместе со SPI DMA одновременно ... SPI DMA был реализован в прошлом году для использования с дисплеями TFT и т. Д. Повышение производительности было поразительным...
У меня есть один простой проект DMAЭто можно легко использовать, но вы можете придумать свой собственный.
Луча
Точно так же, как любопытство, вы можете попробовать I2C DMA вместе со SPI DMA одновременно ... SPI DMA был реализован в прошлом году для использования с дисплеями TFT и т. Д. Повышение производительности было поразительным...
У меня есть один простой проект DMAЭто можно легко использовать, но вы можете придумать свой собственный.
Луча
OLD STM Port non-DMA STM Port STM DMA Port
ILI9341 Test!
Benchmark Time (microseconds) Time (microseconds) Time (microseconds)
Screen fill 1,026,635 716,291 174,901
Text 74,910 46,087 65,358
Lines 702,724 400,688 692,868
Horiz/Vert Lines 84,359 57,074 23,342
Rectangles (outline) 54,489 36,604 16,625
Rectangles (filled) 2,132,392 1,487,410 371,832
Circles (filled) 344,984 220,662 181,100
Circles (outline) 306,326 174,199 302,904
Triangles (outline) 222,948 127,154 219,106
Triangles (filled) 715,597 472,077 243,512
Rounded rects (outline) 130,131 78,591 91,564
Rounded rects (filled) 2,331,405 1,615,938 488,708
Done!
Racemaniac
Сб 09 апреля 2016 г., 16:31
Mrburnette написал:на следующие части этого проекта
Поздравляю.
Точно так же, как любопытство, вы можете попробовать I2C DMA вместе со SPI DMA одновременно ... SPI DMA был реализован в прошлом году для использования с дисплеями TFT и т. Д. Повышение производительности было поразительным...
У меня есть один простой проект DMAЭто можно легко использовать, но вы можете придумать свой собственный.
Луча
Точно так же, как любопытство, вы можете попробовать I2C DMA вместе со SPI DMA одновременно ... SPI DMA был реализован в прошлом году для использования с дисплеями TFT и т. Д. Повышение производительности было поразительным...
У меня есть один простой проект DMAЭто можно легко использовать, но вы можете придумать свой собственный.
Луча
OLD STM Port non-DMA STM Port STM DMA Port
ILI9341 Test!
Benchmark Time (microseconds) Time (microseconds) Time (microseconds)
Screen fill 1,026,635 716,291 174,901
Text 74,910 46,087 65,358
Lines 702,724 400,688 692,868
Horiz/Vert Lines 84,359 57,074 23,342
Rectangles (outline) 54,489 36,604 16,625
Rectangles (filled) 2,132,392 1,487,410 371,832
Circles (filled) 344,984 220,662 181,100
Circles (outline) 306,326 174,199 302,904
Triangles (outline) 222,948 127,154 219,106
Triangles (filled) 715,597 472,077 243,512
Rounded rects (outline) 130,131 78,591 91,564
Rounded rects (filled) 2,331,405 1,615,938 488,708
Done!
Racemaniac
Солнце 17 апреля 2016 г. 18:33
Я тоже добиваюсь хорошего прогресса в SPI .
Сделал аналогичную структуру с моей структурой I2C DMA, работая под прерываниями . Однако я никогда не получал прерывания порта SPI, чтобы работать должным образом для меня. Как только я включил, все пошло не так >_< (Те же самые проблемы, которые я заметил, когда с разработкой I2C я бы побудил состояние, в котором, как я думаю, прерывания постоянно стреляют, не давая процессору в любое время для выполнения реальной работы (просто предположение, но, вероятно, то, что происходит))). Я просто использую прерывания DMA сейчас и могу управлять только с этими (Единственным недостатком является то, что я всегда использую оба TX & RX DMA, чтобы заставить это работать).
Теперь у меня есть неопиксельная строка из 144 светодиодов, обновляющих +180 кадров в секунду с помощью сигнала, сгенерированного с помощью аппаратного SPI & отправлено через DMA . А для чтения данных я собираюсь использовать небольшой флеш -чип 32 Мбит памяти, который имеет очень простой протокол SPI (и тогда я могу заполнить его из данных с SD -карты, которая медленнее & намного сложнее получить доступ & в буферу из).
Теперь я начинаю задаваться вопросом, что делать со всем этим кодом . У меня есть хорошие легкие каркасы DMA для i2c & SPI, не уверен, что кто -то заинтересован в них . и у них будет несколько фреймворков, чтобы обратиться к неопикселям, MPU6050 и MX25L3206 (чип памяти флэш -памяти).
Сделал аналогичную структуру с моей структурой I2C DMA, работая под прерываниями . Однако я никогда не получал прерывания порта SPI, чтобы работать должным образом для меня. Как только я включил, все пошло не так >_< (Те же самые проблемы, которые я заметил, когда с разработкой I2C я бы побудил состояние, в котором, как я думаю, прерывания постоянно стреляют, не давая процессору в любое время для выполнения реальной работы (просто предположение, но, вероятно, то, что происходит))). Я просто использую прерывания DMA сейчас и могу управлять только с этими (Единственным недостатком является то, что я всегда использую оба TX & RX DMA, чтобы заставить это работать).
Теперь у меня есть неопиксельная строка из 144 светодиодов, обновляющих +180 кадров в секунду с помощью сигнала, сгенерированного с помощью аппаратного SPI & отправлено через DMA . А для чтения данных я собираюсь использовать небольшой флеш -чип 32 Мбит памяти, который имеет очень простой протокол SPI (и тогда я могу заполнить его из данных с SD -карты, которая медленнее & намного сложнее получить доступ & в буферу из).
Теперь я начинаю задаваться вопросом, что делать со всем этим кодом . У меня есть хорошие легкие каркасы DMA для i2c & SPI, не уверен, что кто -то заинтересован в них . и у них будет несколько фреймворков, чтобы обратиться к неопикселям, MPU6050 и MX25L3206 (чип памяти флэш -памяти).
Mrburnette
Солнце 17 апреля 2016 г., 22:08
Реданьяк написал:
<...>
Теперь я начинаю задаваться вопросом, что делать со всем этим кодом . У меня есть хорошие легкие каркасы DMA для i2c & DMA, не уверен, что кто -то заинтересован в них . и у них будет несколько фреймворков, чтобы обратиться к неопикселям, MPU6050 и MX25L3206 (чип памяти флэш -памяти).
Теперь я начинаю задаваться вопросом, что делать со всем этим кодом . У меня есть хорошие легкие каркасы DMA для i2c & DMA, не уверен, что кто -то заинтересован в них . и у них будет несколько фреймворков, чтобы обратиться к неопикселям, MPU6050 и MX25L3206 (чип памяти флэш -памяти).
Racemaniac
Пн 18 апреля 2016 г. 8:10 утра
Mrburnette написал:Реданьяк написал:
<...>
Теперь я начинаю задаваться вопросом, что делать со всем этим кодом . У меня есть хорошие легкие DMA Frameworks для i2c & DMA, не уверен, что кто -то заинтересован в них . и у них будет несколько фреймворков, чтобы обратиться к неопикселям, MPU6050 и MX25L3206 (чип памяти флэш -памяти).
Теперь я начинаю задаваться вопросом, что делать со всем этим кодом . У меня есть хорошие легкие DMA Frameworks для i2c & DMA, не уверен, что кто -то заинтересован в них . и у них будет несколько фреймворков, чтобы обратиться к неопикселям, MPU6050 и MX25L3206 (чип памяти флэш -памяти).