Заголовок сообщения: Re: Stm32 с чего начать изучение...
Добавлено: Вт фев 14, 2012 14:43:35
Друг Кота
Карма: 26
Рейтинг сообщений: 108
Зарегистрирован: Чт ноя 04, 2010 01:56:36 Сообщений: 7439 Откуда: г. Москва
Рейтинг сообщения:0
IfoR писал(а):
:facepalm: Да что же вы сразу меня в эту надпись не тыкнули? Я то думал оно АЦП питает. Не заметил я этого. Теперь всё заработало. Спасибо!
Зачем додумать то, что явно написано ? Теперь ты осознаешь, что все эти твои страдания от того, что надо было реально 2-3 странички из выложенного мной документа прочитать ? Почитай хотя бы этот документ от и до. 28 страниц, включая содержание и ссылки, уже от кучи глупостей и непониманий избавит.
Ну вот начал изучать stm32 + MMC + FatFs. В принципе все заработало. В примерах подключения карты часто используется программный SPI. При работе на частоте 24 МГц получается скорость SPI около 1 Мбита. Захотелось перевести на аппаратный SPI2, но при этом карта инициализируется на скорости до 125 кбит. Быстрее-вылазит ошибка. Вот кусочек инициализации и чтения /записи.
Код:
RCC->APB1ENR |= RCC_APB1ENR_SPI2EN; //подать тактирование / SPI2->CR1 = 0x0000; //очистить первый управляющий регистр SPI2->CR2 = 0x0000; //очистить второй управляющий регистр SPI2->CR1 |= SPI_CR1_MSTR; //контроллер должен быть мастером SPI2->CR1 |= 0x30; //задаем скорость 30=8*4мкс SPI2->CR1 |= SPI_CR1_SPE; //разрешить работу модуля SPI
Код:
void xmit_spi(unsigned char data) {/* unsigned char i; for (i=0;i<8;i++) //Цикл перебора битов отправляемого байта { if ((data&0x80)==0x00)//Если все данные переданы { GPIOB->ODR &=~0x0001; //Выставить бит данных } else GPIOB->ODR|=0x0001; data=data<<1; GPIOB->ODR|=0x0004; //Импульс GPIOB->ODR&=~0x0004; } */ while (SPI2->SR & SPI_SR_BSY); while (!(SPI2->SR & SPI_SR_TXE)); SPI2->DR = data; // Передача данных }
Код:
static BYTE rcvr_spi (void) { /* //Декларация переменных unsigned char i, res=0; for(i=0;i<8;i++) { GPIOB->ODR|=0x0004; //Фронт импульса res=res<<1; if ((GPIOB->IDR&0x0002)!=0x00) res=res|0x01; //Считать бит данных GPIOB->ODR&=~0x0004; //Спад испульса } */ while (SPI2->SR & SPI_SR_BSY); SPI2->DR = 0xff; while (!(SPI2->SR & SPI_SR_RXNE)); res = SPI2->SR; res = SPI2->DR; return res ; }
закомментирован программный SPI. Подскажите где может быть ошибка?
Господа, а кто-нибудь использовал FreeRTOS в своих проектах? Если таковые люди имеются, я попросил бы, если не сложно, разъяснить мне один момент по поводу приоритетов задач. У Курница я вычитал следующую вещь:
Код:
Среди всех задач, находящихся в состоянии готовности, планировщик отдаст управление той задаче, которая имеет наивысший приоритет. Задача будет выполняться до rex пор, пока она не будет блокирована или приостановлена или пока не появится готовая к выполнению задача с более высоким приоритетом.
Таким образом, не значит ли это, что если я имею две задачи (скажем, светодиодные те же мигалки - пусть будут синяя и красная) с одинаковым приоритетом (пусть tskIDLE_PRIORITY=0), и вдруг установлю приоритет первой задачи равным (tskIDLE_PRIORITY+1), то выполняться будет только лишь эта самая первая задача - вплоть до принудительной приостановки или понижения приоритета? А вторая задача что - уйдет в суспенд? Непонятен мне этот нюанс. Если так, то с приоритетами вообще становится опасно баловаться..
_________________ pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего ) MrYuran: Самые ортодоксальные — это PICудеи ) Katz: Не, 51-ники. )
Заголовок сообщения: Re: Stm32 с чего начать изучение...
Добавлено: Ср фев 29, 2012 09:55:22
Друг Кота
Карма: 26
Рейтинг сообщений: 108
Зарегистрирован: Чт ноя 04, 2010 01:56:36 Сообщений: 7439 Откуда: г. Москва
Рейтинг сообщения:0
Это уж как ты задачу с высшим приоритетом организуешь "пока она не будет блокирована или приостановлена"
Приостанволена - это ж не значит, что снаружи. Если ты вызвал внутри Sleep(), ожидание события или разблокировки мутекса - это и есть блокировка, по которой шедулер начинает выполнять менее приоритетные задачи до наступления события, ведущего к разблокировке
Спасибо, с блокировкой понятно. А насчет организации задачи - имеется в виду, будет ли задача ожидать наступления какого-либо события (иное условие для блокировки), чтобы планировщик мог выделить процессорное время другим задачам? Скажем, если задача будет постоянно в состоянии готовности (те же шморгалки ведь не требуют наступления особых условий), и ее приоритет будет выше приоритетов других задач, то планировщик будет выделять время только ей? Я просто запутался с приоритетами - считал, что задача с высшим по отношению к другим приоритетом будет выполняться первой (какой-то квант времени), а потом планировщик переключится на другую задачу..
_________________ pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего ) MrYuran: Самые ортодоксальные — это PICудеи ) Katz: Не, 51-ники. )
Заголовок сообщения: Re: Stm32 с чего начать изучение...
Добавлено: Ср фев 29, 2012 10:32:00
Друг Кота
Карма: 26
Рейтинг сообщений: 108
Зарегистрирован: Чт ноя 04, 2010 01:56:36 Сообщений: 7439 Откуда: г. Москва
Рейтинг сообщения:0
SubDia писал(а):
Я просто запутался с приоритетами - считал, что задача с высшим по отношению к другим приоритетом будет выполняться первой (какой-то квант времени), а потом планировщик переключится на другую задачу..
Будет время - конечно переключится -)))
Если будешь вместо Sleep пользовать конструкции типа for(volatile int i=0; i < 1000000; ++i) ; то проблемы будут -)))
Да и в FreeRTOS, насколько помню, есть разные настройки и режимы. Вплоть до выбора вытесняющая/добровольная многозадачность.
Если будешь вместо Sleep пользовать конструкции типа for(volatile int i=0; i < 1000000; ++i) ; то проблемы будут -)))
Уже были. Благодарю за ответ. Я пока только начал изучать эту ОС.
_________________ pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего ) MrYuran: Самые ортодоксальные — это PICудеи ) Katz: Не, 51-ники. )
Да и в FreeRTOS, насколько помню, есть разные настройки и режимы. Вплоть до выбора вытесняющая/добровольная многозадачность.
Все верно, добрел наконец-то до этого. У меня в конфиге политика планирования - преимущественная (configUSE_PREEMPTION=1), то есть всегда (постоянно) выполняется задача с наивысшим приоритетом, задачи с одинаковым приоритетом делят процессорное время. На практике давно дошло, вот нашел и теоретическое подтверждение. =)
_________________ pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего ) MrYuran: Самые ортодоксальные — это PICудеи ) Katz: Не, 51-ники. )
А у меня такой вопрос немного не в тему: У STM32 есть регистры для атомарного управления битами в порту: BSRR и BRR. Первый может как устанавливать, так и сбрасывать биты, а второй только сбрасывать. Зачем тогда нужен BRR?
У STM32 есть регистры для атомарного управления битами в порту: BSRR и BRR. Первый может как устанавливать, так и сбрасывать биты, а второй только сбрасывать. Зачем тогда нужен BRR?
У них маска одного бита на одном и том же месте. То есть, сбросить бит номер N - BRR = 1<<N, установить - BSRR = 1<<N. Иногда это может быть удобно, не надо двигать маску туда-сюда.
что-то в той документации ни структур не черта нету
Если Вы о stm32, то документация состоит из datasheet - описание электрических параметров и reference manual - описание периферии в том числе ее регистров. reference manual обычно один на все семейство в datasheet перечислено какая конкретно периферия есть в конкретном контроллере и на какие ноги она выведена.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения