29.09.2011, 23:42
|
#811
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от qwerky
|
откуда оно узнает частоту кварца ? телепатирует ?
|
не, она там дефайнится. Применяется при рассчете PLL. Только в этом случае нам ее только в одном месте указывать приходится.
А я вообще такую функцию использовал:
Цитата:
|
void delay_us(unsigned long nTime)
{
nTime=((CPU_CLOCK/1000)/K_Const)*nTime;
while(nTime != 0)
{nTime--;}
}
|
Где K_Const подбирал по анализатору под каждый проц. Для STM32 она равна 4000. Для LPC2xxx 2000. Ну а частота просто дефайнилась в хеадере.
Цитата:
|
#define CPU_CLOCK 24000000
|
Надо сказать, работает с великолепной точностью. При 500мс отклонение не более 1мс.
|
|
|
|
29.09.2011, 23:48
|
#812
|
Вид на жительство
Регистрация: 21.11.2009
Сообщений: 342
Сказал спасибо: 4
Сказали Спасибо 149 раз(а) в 66 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от Easyrider83
|
не, она там дефайнится. Применяется при рассчете PLL.
|
ну вот, а вы пишете что усё автоматом. Замените в моем куске F_CPU на CPU_CLOCK - тоже будет автоматически
Сообщение от Easyrider83
|
А я вообще такую функцию использовал
|
во 1-х при каждом вызове вычисляется nTime, во 2-х содержимое цикла зависит от флагов компиляции и оптимизации, плюс нужно учитывать задержку работы с памятью
|
|
|
|
29.09.2011, 23:50
|
#813
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
qwerky, это все верно. Я искал альтернативу, написанную на асме. Вы ее и подкинули.
Пока только не компилируется никак. Но это я потом решу. Сейчас спать хочется.
|
|
|
|
30.09.2011, 00:40
|
#814
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от qwerky
|
откуда оно узнает частоту кварца ? телепатирует ?
|
Ващето... если Кейл... частота кварца указывается в свойствах проекта... ![Рот до ушей](images/smilies/icon_doushei.gif)
Далее, если использовать SysTick, уже ничего делать не надо... И не волнует... STM32F100 в проекте, STM32F103 или STMF205...
|
|
|
|
30.09.2011, 00:50
|
#815
|
Вид на жительство
Регистрация: 21.11.2009
Сообщений: 342
Сказал спасибо: 4
Сказали Спасибо 149 раз(а) в 66 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Цитата:
|
Ващето... если Кейл... частота кварца указывается в свойствах проекта...
|
понятно, мой пример для avr-gcc/eclipse/cmsis. Оказывается в CMSIS за тактирование отвечают символы HSI_VALUE и HSE_VALUE, по умолчанию настроены на 8МГц
Сообщение от st_1
|
Далее, если использовать SysTick, уже ничего делать не надо... И не волнует...
|
SysTick-ом удобнее генерировать системный тик, иначе придется выделять под это целый таймер
Последний раз редактировалось qwerky; 30.09.2011 в 00:54.
|
|
|
|
30.09.2011, 12:04
|
#816
|
Временная регистрация
Регистрация: 28.03.2010
Сообщений: 56
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Изучаем STM32 Cortex M3
Зная вашу любовь к библиотекам все же рискну спросить.
Пользуюсь CooCox IDE, собираю проект из драйверов, хочу помигать светодиодом. Т.е. просто инвертировать значение на ноге.
Есть варианты.
1. GPIO_SetBits/GPIO_ResetBits. Проблема в том, что для того, чтобы инвертировать значение на ноге, надо его сначала прочитать, потом сделать условие по значению и т.д. - долго, дорого. При этом в функции используется идеологически правильное манипулирование битами через спец-регистры:
"Atomic bit manipulation is supported ... through two dedicated bit manipulation registers."
2. Использовать функцию GPIO_WriteBit (GPIOx, Pinx, value). Опять же - value надо прочитать функцией GPIO_ReadInput - долго, дорого. Но в итоге в сухом остатке - те же регистры манипулирования.
3. Было бы лучше всего для задачи использовать бит-бендинг:
#define PortBbit8 (*((volatile unsigned long *) 0x422181A0 ))
Но я нигде ни CMSIS, ни в драйверах ST/COX не нахожу дефайнов адресов бит-бэнд регионов.
Внимание, вопрос - есть ли где-то хидеры с этими дефайнами для STM32F100RB ???
|
|
|
|
30.09.2011, 17:31
|
#817
|
Временная регистрация
Регистрация: 19.05.2010
Сообщений: 78
Сказал спасибо: 10
Сказали Спасибо 8 раз(а) в 8 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Подскажите пожалуйста, кто работал с ШИМ в stm32. К ноге 7 порта С подключен светодиод, частотой мигания которой необходимо управлять. допустим просто настроим стабильную частоту работы сдлительностью импульса в 50% от период шим код такой:
Код:
GPIOC-›CRH|=GPIO_CRH_CNF8_1; //альтернативная функция
GPIOC-›CRH|=GPIO_CRH_MODE8; //альтернативная функция на выходе
void InitTmr13 (void)
{
// Подаем такты на таймер
RCC-›APB1ENR|=0x00000080;
// устанавливаем предделитель
TIM13-›PSC = 23999; //24МГц/24Кгц=1000 Гц
// задаем период ШИМ //пусть частота ШИМ будет 50 Гц
TIM13-›ARR = 20;
// начальную длительность импульса
TIM13-›CCR1 = 1;
//Режимы работы ШИМ: PWM mode 1 - Channel 1 is active as long as //TIMx_CNT‹TIMx_CCR1 else inactive.
TIM13-›CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1PE;
// разрешаем выходной сигнал
TIM13-›CCER = TIM_CCER_CC1E;
TIM13-›BDTR = TIM_BDTR_MOE;
// разрешаем работу и автоперезагрузку
TIM13-›CR1 = TIM_CR1_CEN | TIM_CR1_ARPE;
}
По идее запустив функцию InitTmr13 светодиод уже должен мигать с частотой, равной 1/20 от частоты ШИМ? То есть 2,5 Гц????
Или я неправильно настроила или я чего-то не понимаю?
|
|
|
|
30.09.2011, 18:06
|
#818
|
Прописка
Регистрация: 20.08.2008
Сообщений: 260
Сказал спасибо: 305
Сказали Спасибо 76 раз(а) в 42 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Как вариант, могу предложить вот такую реализацию задержки для STM32F100:
//-----------------------------------------------------------------
#define bool char
#define true 0x7F
#define false 0x00
//-----------------------------------------------------------------
bool flag_delay; // Флаг используется для организации задержек.
//-----------------------------------------------------------------
void SysTick_Handler(void) // Обслуживание задержек ЖКИ.
{
SysTick-›CTRL=0; // Остановить SysTick, сбросить флаг прерывания.
flag_delay=false; // Задержка закончилась.
}
//-----------------------------------------------------------------
void My_delay_mks(int t) // Задержка (до 5 сек). t=tзад*3 мксек.
{
flag_delay=true;
SysTick-›LOAD=t; // Длительность задержки.
SysTick-›CTRL=0x00000002; // f HCLK /8;
SysTick-›CTRL |= 1; // Запуск.
while(flag_delay); // Ожидание окончания задержки.
}
|
|
|
|
30.09.2011, 18:20
|
#819
|
Прописка
Регистрация: 20.08.2008
Сообщений: 260
Сказал спасибо: 305
Сказали Спасибо 76 раз(а) в 42 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
[QUOTE=dccharacter;426718]Зная вашу любовь к библиотекам все же рискну спросить.
Для опроса и установки ножек лучше не использовать библиотеки, а напрямую обращаться к GPIOx-›IDR (ODR, DSRR или BRR).
Во-первых, получается более быстрый код (нет перехода к подпраграммам), во-вторых, программа меньше "кушает" памяти, в-третьих, (чисто субъективное мнение) меньше путаницы.
Библиотеки лучше использовать (опять-таки субъективное мнение), где иначе сложно справиться с решаемой задачей, например для создания USB-Hosta, организации Eternet-протокола и т.п.
|
|
|
|
30.09.2011, 18:35
|
#820
|
Временная регистрация
Регистрация: 28.03.2010
Сообщений: 56
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Изучаем STM32 Cortex M3
Сообщение от shyub
|
Для опроса и установки ножек лучше не использовать библиотеки
|
Так я и не собираюсь ![Весело](images/smilies/icon_laugh.gif) Я спрашиваю есть ли где-то алиасы на бит-банд адреса?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:06.
|
|