Рейтинг
27.02
голосов: 29

О блоге

Работа с ядром CortexM3 и периферией STM

Администраторы (1)

Модераторы (0)

Модераторов здесь не замечено

Читатели (259)

ploop _YS_ m3hc Krieger Tabke marvin_yorke Ultrin WildCat hexanaft Vga Alatar mzw Reverb grand1987 dievgen woogle PahanMenski anper citizen ZiB

Все читатели блога

Удобная настройка GPIO STM32F030. Мой велосипед.

Долгое время я настраивал порты различных микроконтроллеров STM32 при помощи Standart Peripheral Library.


Читать дальше

Атомарный доступ к битам регистров bit-band через макрос

Не буду расписывать, зачем нужен этот самый атомарный доступ. Будем считать, что если он Вам понадобился, значит надо.
Дело было так. Когда этот самый атомарный доступ понадобился мне, вспомнилось про наличие bit-band региона памяти в STM32. В даташите на Cortex M3 есть формула, по ней можно всё рассчитать, есть рисунки, в общем всё ясно и понятно. Однако хотелось некой автоматизации. Поискал. Нашел ARMовскую infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka4203.html рекомендацию по применению. Уже лучше. Но тут заглянул в хедеры CMSIS и понял, что ARMовские макросы можно «допилить»…


Читать дальше

Configuration Wizard в KEIL. Продолжение на примере настройки USART, ADC для STM32F4xx

Итак, продолжаем настраивать периферию с помощью Configuration Wizard. Возможно в будущем появятся еще экземпляры по разным устройствам, и в итоге объединим все в один мегапроект. Ну это так, помечталось мне.
Начнем:

Читать дальше

измеряем частоту аппаратно

Была задача измерять частоту а потом усреднять результат.
реализация на прерываниях не понравилась — сделал чисто аппаратно + дма
суть такая первый таймер отмеряет нужное время( по захвату), и дергает ДМА, ДМА забирает текущее значение и складывает в память, по переполнения счетчика ( следующий за захватом такт) происходит сброс счетчика импульсов (реализация stm32f100) но перенести на другие — не проблема, главное разобраться кто какой дма дергает)
вот рабочий код. делает 256 отсчетов и складывает в память, и так по кругу. процессор не задействовано
по завершению одного прохода ДМА, взводится флаг — данные готовы и уже можно что то считать. Прерывание ДМА дергается только один раз

//размер циклического буфера
#define FREQ_BUF_SIZE 256
//тут будут лежать частоты

unsigned short FREQ_BUF[FREQ_BUF_SIZE];

// данные уже готовы
void DMA1_Channel5_IRQHandler ( void)
{
	DMA1->IFCR |=DMA_IFCR_CGIF5;
        DMA1_Channel5->CCR &= ~DMA_CCR5_TCIE; //заблокируем повторное использование прерывания от  дма
	ValidData=1;
}

void Init()
{
//счетные таймера

TIM15->PSC=   8000-1;			//пред делитель
TIM15->ARR=   10001 ;		    //считаем до....
TIM15->CR2=   TIM_CR2_MMS_1;	//TRGO дергаем по перезагрузке таймера - для ресета счетчика 2
//TIM15->SMCR=   TIM_SMCR_MSM;
TIM15->DIER=  TIM_DIER_CC1DE;   // запрос ДМА по каналу сравнения 1
TIM15->DIER |=  TIM_DIER_CC2IE; //прерывание
TIM15->CCMR1= TIM_CCMR1_OC1M_0; //TIMx_CNT==TIMx_CCR) OCxREF =1
TIM15->CR1 =  TIM_CR1_ARPE;	
TIM15->CCR1=  1000; //кода формируем запрос ДМА
TIM15->DIER |= TIM_DIER_UIE;  //прерывание по переполнению

//таймер 2 - измеритель частоты
TIM2->ARR = 0xffff;              // макс. значение до которого считаем																 //потом прерывание по переполнению
TIM2->PSC =0 ;                // пред делитель 
TIM2->CR1 =  TIM_CR1_ARPE;
TIM2->SMCR |=TIM_SMCR_TS_0;    //в режиме ведомого от таймера 15 ITR1 (TS = 001)
TIM2->SMCR |=TIM_SMCR_SMS_2;  // режим 100:  “Reset”
TIM2->SMCR |= TIM_SMCR_ECE;   // Включить режим внешнего тактирования 
TIM2->SMCR |=TIM_SMCR_ETPS_1; //входную частоту делим на 4(это для моего проекта)

//настроим ДМА  для канала  5 таймера 15 
RCC->AHBENR |= RCC_AHBENR_DMA1EN;
DMA1_Channel5->CMAR = (uint32_t) FREQ;       //адрес буфера приемника
//Определяемся с устройствами, которые будут подключены к каналам 2 и 3:
DMA1_Channel5->CPAR = (uint32_t) &TIM2->CNT;      //адрес регистра данных передатчика 
//Задаем количество данных для обмена:
DMA1_Channel5->CNDTR = FREQ_BUF_SIZE;            //размер буфера
DMA1_Channel5->CCR = DMA_CCR5_MINC;                //запись в память, инкремент указателя в памяти
DMA1_Channel5->CCR |= DMA_CCR5_TCIE;               //канал 5
DMA1_Channel5->CCR|= DMA_CCR5_CIRC;//циклически
DMA1_Channel5->CCR|= DMA_CCR5_MSIZE_0;
DMA1_Channel5->CCR|= DMA_CCR5_PSIZE_0; //по 16 бит
DMA1_Channel5->CCR|= DMA_CCR5_TCIE; //прерывание по завершению
DMA1_Channel5->CCR |= DMA_CCR5_EN; //разрешим работу
TIM15->CR1 |= TIM_CR1_CEN ;
TIM2->CR1 |=TIM_CR1_CEN;
NVIC_EnableIRQ (DMA1_Channel5_IRQn);  
}

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

Если надо много битовых флагов

В одном проекте, понадобилось много битовых флагов
Выделять на каждый флаг по байту — это роскошь.
имея в STM32 bit-band, написал макрос, может кому то пригодится

//сама переменная, где будут наши флаги,можно заранее проинициализировать
unsigned int BitBandArray=0;
//SRAM_BASE начало памяти
//SRAM_BB_BASE  -  где начинается битбанд алиас памяти 
//объявлено тут stm32f10x.h 
//сам макрос  первый параметр - номер бита, второй  имя перемененной, где биты хранятся
#define BitBand(b,a)  (*((char *)SRAM_BB_BASE+(((int)&a)SRAM_BASE )*32+b*4))
//сами флаги
#define AxelFlag  BitBand(0,BitBandArray)
#define PowerGood BitBand(1,BitBandArray)
#define BatFlag   BitBand(2,BitBandArray)
// и так 32 раза

////////////////
///теперь можем к ним обращаться как к обычным переменным
//присвоение
AxelFlag =1;
//чтение
if(PowerGood ==1)
    {
    }

Описание драйверов HAL STM32F4xx, частичный перевод


Делюсь небольшой проделанной работой — это частичный перевод оригинального описания

Введение

STM32Cube является оригинальной разработкой STMicroelectronics, предназначенной для разработчиков программного обеспечения (ПО), встроенного в микроконтроллеры STM32. STM32Cube облегчает разработку ПО за счет снижения усилий, времени и затрат, и охватывает всё семейство микроконтроллеров STM32.


Читать дальше

Configuration Wizard в KEIL. Пример настройки GPIO портов для STM32F4xx

Всем любителям KEIL посвящается:
Благодаря Configuration Wizard, встроенном в KEIL весьма удобно производить настройки в файлах заголовков.
Один из таких файлов мной был написан.


Читать дальше

Конвертация в формат Eclipse STM32 проектов от ST и из CubeMX

Так получилось, что сейчас использую Eclipse. Да и с ARM и STM32 познакомился совсем недавно. В этот момент и выяснилось, что STMicroelectronics — бесплатный софт не любит. Поиск на сайте ST.com показал, что никаких примеров и проектов «от производителя» для бесплатных сред разработки, типа Eclipse, нет. Зато для Keil, IAR и TrueSTUDIO — примеров кода, проектов и всяких примочек — много. Самым близким к Eclipse является TrueSTUDIO, т.к. сделан на основе Eclipse. Решение напрашивалось само собой — использовать в Eclipse весь спектр проектов, разработанных STMicroelectronics под среду TrueSTUDIO. Но форматы проектов оказались разные, и конвертора TrueSTUDIO -> Eclipse тоже нет.

Долго копал интернет на предмет готового решения — его не было. Зато часто попадался вопрос — как это сделать. В процессе поиска нашел статью, на немецком, с решением проблемы. Всё работало. На радостях, аж перевод на русский сделал. Но при попытке портирования чуть более серьезного проекта — возникло такое количество ошибок и предупреждений, что их устранение граничило с непониманием происходящего.
При этом что-то внутри подсказывало, что решение должно быть. В итоге проблему — решил, и этим решением делюсь с Вами.


Читать дальше

STM32CubeMX и драйвера HAL для серии STM32F1xx

Тихо вот так, как мне кажется, без особой помпы вышло обновление STM32CubeMX под номером 4.6
Изначально обещали (на форуме ST) к концу декабря, файлы и правда датированы 16.12.2014, но обнаружил на сайте ST только вчера:
www.st.com/stm32cube
После установки самого Куба — в обновлениях программы стало доступно скачивание пакета для F1 серии версии 1.0.0
Отдельно от Куба пакет для STM32F1xx можно скачать по прямой ссылке (спасибо freeon):
http://www.st.com/st-web-ui/static/active/en/st_prod_software_internet/resource/technical/software/firmware/stm32cubef1.zip
Также доступна и сама страничка CubeF1 — www.st.com/web/en/catalog/tools/PF260820
Посмотрел, на то что скачалось, — обычный пакет, включающий HAL драйвера, CMSIS версии 4.2, драйвера для плат от ST и куча примеров.
Фактически ST закончила перевод на HAL всей линейки STM32, и теперь следует ожидать «допиливания» уже всего HAL для обеспечения лучшей переносимости кода между разными семействами линейки STM32.

STM32CubeMX start code -> Eclipse быстрый старт -> отладка в Eclipse через ST-Link Discovery

Наверное в инете есть сотни статей с подобной темой. Но, так как тема относится к опенсорсу, — никто не гарантирует результат. Результат-то как правило бывает, но обычно, вначале, лишь частичный. Что-то, как правило, не работает нормально. Глючит. Пугает кучей ошибок и варнингов. Основная тема, лейтмотив опенсорса, — поиск ответа на вопрос «почему не так работает?». В этот момент начинаешь понимать, почему за готовую к работе, из коробки, IDE — просят денюшку, и немаленькую.
Когда начинал знакомится с микроконтроллерами, ограничение кода в 32 кБ казались такими недосягаемыми, а в современное время одно подключение какой-либо библиотеки может съесть значительную часть лимита кода, а ещё хочется и ВЭБ интерфейс к соей домашней поделке приделать, а недавно решил «пощупать» библиотеку libMAD, так код вообще сразу выскочил за 120 кБ…

Основная задача — допилить Eclipse до такого состояния, когда внутри будет весь цикл, от написания кода до отладки. Для генерации начального кода очень хотелось использовать STM32CubeMX, так как кроме свежих библиотек HAL имеется поддержка современной версии CMSIS, уже интегрированная FreeRTOS (в составе куба идет порт FreeRTOS, сделанный по правилам нового CMSIS v3.20), и много других «вкусняшек», а используемая среда Eclipse, не накладывает ограничения на размер кода, да и просто имхо удобней.
У меня получилось. Конечно есть в отладчике Keil'a фишки, которые больше нигде не повторяются. Да и в используемом отладчике OpenOCD реализованы не все функции, которыми может похвастаться Eclipse, но это плата за простоту установки и настройки. Полученным результатом оказался доволен. Во время поиска приемлемого варианта установки, подбора плагинов и других компонентов возникла необходимость сохранить результаты проделанной работы. В основном — что бы не забыть.

Условно всю работу можно разбить на 3 части:
  • Установка и настройка Eclipse.
  • Генерация начального кода проекта в STM32CubeMX и адаптация проекта для использования в Eclipse.
  • Настройка отладки и отладка созданного проекта в Eclipse.

Если Вам интересно — читаем дальше.


Читать дальше