STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Опытный кот
Аватара пользователя
Сообщения: 725
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

Сообщение amv2000 »

es131245 писал(а):Может ли таймер быть и master И slavом?
Вы наверное хотели сказать I2C.
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 369
Зарегистрирован: Пт фев 01, 2013 21:05:30

Сообщение es131245 »

Код: Выделить всё

TIM_HandleTypeDef initTimM;
TIM_HandleTypeDef initTimS;
TIM_MasterConfigTypeDef mTim;
TIM_SlaveConfigTypeDef sTim;
TIM_SlaveConfigTypeDef slConf;
TIM_IC_InitTypeDef icConf;

void Error_Handler(void)
{HAL_GPIO_WritePin(GPIOG,GPIO_PIN_14,GPIO_PIN_SET);
 while(1){}}

void EXTI0_IRQHandler(void)
{if(HAL_GPIO_ReadPin(GPIOG,GPIO_PIN_14)==GPIO_PIN_RESET)
 {if(HAL_TIM_IC_Stop_IT(&initTimM,TIM_CHANNEL_1)!=HAL_OK)Error_Handler();
  if(HAL_TIM_IC_Start_IT(&initTimM,TIM_CHANNEL_2)!=HAL_OK)Error_Handler();}
 else
 {if(HAL_TIM_IC_Stop_IT(&initTimM,TIM_CHANNEL_2)!=HAL_OK)Error_Handler();
  if(HAL_TIM_IC_Start_IT(&initTimM,TIM_CHANNEL_1)!=HAL_OK)Error_Handler();}
 HAL_GPIO_TogglePin(GPIOG,GPIO_PIN_14);
 HAL_NVIC_ClearPendingIRQ(EXTI0_IRQn);
 HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);}

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{extern USBD_HandleTypeDef hUsbDeviceHS;
 extern TIM_HandleTypeDef initTimS;
 uint8_t buff_TX[128];
 buff_TX[0]='0';
 if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)
 {buff_TX[1]=1;
  buff_TX[2]=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1)>>8;
  buff_TX[3]=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);}
 else
 {buff_TX[1]=2;
  buff_TX[2]=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2)>>8;
  buff_TX[3]=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2);}
  buff_TX[4]=TIM3->CNT>>8;
  buff_TX[5]=TIM3->CNT;
 USBD_CDC_SetTxBuffer(&hUsbDeviceHS,&buff_TX[0],16);
 USBD_CDC_TransmitPacket(&hUsbDeviceHS);
 HAL_GPIO_TogglePin(GPIOG,GPIO_PIN_13);}

int main(void)
{HAL_Init();
 Systick();
 __GPIOH_CLK_ENABLE();

 __GPIOG_CLK_ENABLE();
 ButtonInit();
 ButtonCaptureInit();

 __GPIOB_CLK_ENABLE();
 MX_USB_DEVICE_Init();
 HAL_GPIO_WritePin(GPIOG,GPIO_PIN_13|GPIO_PIN_14,GPIO_PIN_RESET);

 __GPIOE_CLK_ENABLE();
 GPIO_InitTypeDef GPIO_InitStruct;
 GPIO_InitStruct.Pin=GPIO_PIN_5|GPIO_PIN_6;
 GPIO_InitStruct.Mode=GPIO_MODE_AF_PP;
 GPIO_InitStruct.Pull=GPIO_PULLUP;
 GPIO_InitStruct.Speed=GPIO_SPEED_HIGH;
 GPIO_InitStruct.Alternate=GPIO_AF3_TIM9;
 HAL_GPIO_Init(GPIOE,&GPIO_InitStruct);
 HAL_NVIC_SetPriority(TIM1_BRK_TIM9_IRQn,5,5);
 HAL_NVIC_EnableIRQ(TIM1_BRK_TIM9_IRQn);

 __TIM9_CLK_ENABLE();
 initTimM.Instance=TIM9;
 initTimM.Init.Period=0xffff;
 initTimM.Init.Prescaler=0;
 initTimM.Init.ClockDivision=0;
 initTimM.Init.CounterMode=TIM_COUNTERMODE_UP;
 if(HAL_TIM_IC_Init(&initTimM)!=HAL_OK)Error_Handler();

 __TIM3_CLK_ENABLE();
 initTimS.Instance=TIM3;
 initTimS.Init.Period=0xffff;
 initTimS.Init.Prescaler=0;
 initTimS.Init.ClockDivision=0;
 initTimS.Init.CounterMode=TIM_COUNTERMODE_UP;
 if(HAL_TIM_IC_Init(&initTimS)!=HAL_OK)Error_Handler();

 sTim.SlaveMode=TIM_SLAVEMODE_GATED; //GATED
 sTim.InputTrigger=TIM_TS_ITR0;
 if(HAL_TIM_SlaveConfigSynchronization(&initTimM,&sTim)!=HAL_OK)Error_Handler();


 icConf.ICPrescaler=TIM_ICPSC_DIV1;
 icConf.ICFilter=0;
 icConf.ICPolarity=TIM_ICPOLARITY_RISING;
 icConf.ICSelection=TIM_ICSELECTION_INDIRECTTI;
 if(HAL_TIM_IC_ConfigChannel(&initTimM,&icConf,TIM_CHANNEL_1)!=HAL_OK)Error_Handler();
 icConf.ICPolarity=TIM_ICPOLARITY_FALLING;
 icConf.ICSelection=TIM_ICSELECTION_DIRECTTI;
 if(HAL_TIM_IC_ConfigChannel(&initTimM,&icConf,TIM_CHANNEL_2)!=HAL_OK)Error_Handler();
 slConf.InputTrigger=TIM_TS_TI2FP2;
 slConf.SlaveMode=TIM_SLAVEMODE_RESET;
 if(HAL_TIM_SlaveConfigSynchronization(&initTimM,&slConf)!=HAL_OK)
 if(HAL_TIM_IC_Start_IT(&initTimM,TIM_CHANNEL_2)!=HAL_OK)Error_Handler();
 if(HAL_TIM_IC_Start_IT(&initTimM,TIM_CHANNEL_1)!=HAL_OK)Error_Handler();
	 mTim.MasterOutputTrigger=TIM_TRGO_UPDATE; mTim.MasterSlaveMode=TIM_MASTERSLAVEMODE_ENABLE; if(HAL_TIMEx_MasterConfigSynchronization(&initTimS,&mTim)!=HAL_OK)Error_Handler();

 while(1){}}

Реклама
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

Один таймер главный, другой подчинённый. Примерно так:
AN2592
Application note
How to achieve 32-bit timer resolution using the link system
in STM32F10x microcontrollers
Но для IC в этом случае могут быть сюрпризы вроде задержки N тактов на синхронизацию подчинённых таймеров.
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Есть необходимость по выводу фрейма через SPI запускать таймер. Как это сделать руками в обработчике прерывания SPI, вопросов не вызывает. Однако, это как-то совсем не изящно. По идее, можно попробовать завести ногу NSS на вход ETR таймера и это вроде бы будет полностью аппаратным решением, но тоже как-то выглядит не очень. Может быть есть какое-то решение, чтобы окончание передачи по SPI аппаратно запускало таймер ?
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

a5021 писал(а):чтобы окончание передачи по SPI аппаратно запускало таймер ?
21.3.9 SPI communication using DMA (direct memory addressing)
Figure 232. Reception using DMA
По окончанию приёма кадра пусть DMA установит CEN в регистре CR1 таймера.
Реклама
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Мне ничего не известно о том, что DMA умеет устанавливать биты где-либо, кроме своих собственных регистров. Если речь идет об установлении бита программно из обработчика прерывания DMA, то такая возможность известна, но интересует, нет ли чисто аппаратного решения, чтобы получалась более жесткая синхронизация между окончанием передачи и запуском таймера.
Реклама
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

Установка бита CEN по факту есть копирование числа из одной ячейки памяти(DMA_CMAR) в другую ячейку(DMA_CPAR). Запуском DMA является событие окончания приёма(или передачи). Длина пересылки = 1 слово(регистр CR1 таймера). Получается всё аппаратно без каких-либо прерываний.
Встал на лапы
Аватара пользователя
Сообщения: 140
Зарегистрирован: Вс ноя 11, 2012 14:13:02

Сообщение Aid1992 »

Устанавливаю GNU для CooCox v.2 beta (система Windows XP Professional SP3), выскакивает вот такая ошибка, и установка не может завершится. У кого какие предположения есть по этому поводу?
2015-05-09_085906.jpg
(83.07 КБ) 637 скачиваний
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

в архиве скачать и распаковать куда ни будь - например у меня D:\GCCARM (имхо лучше в корне папка).
Качал архив тут: https://launchpad.net/gcc-arm-embedded файл gcc-arm-none-eabi-4_9-2015q1-20150306-win32.zip
Кокос работает, вин 8.1. В переменные среды, на всякий, прописал путь D:\GCCARM\bin
Встал на лапы
Аватара пользователя
Сообщения: 140
Зарегистрирован: Вс ноя 11, 2012 14:13:02

Сообщение Aid1992 »

Спасибо! Помогло.
Открыл глаза
Сообщения: 56
Зарегистрирован: Сб июн 14, 2014 09:05:06

Сообщение kapitan0v »

Попробовал подключить батарейку к STM32F0Disco. Убрал SB1 и установил C17. Все работает, часы идут при отключении питания. Решил измерить ток - при работающем от источника питания потребление с батарейки - 33 мкА :shock:, если отключить питание - 1 мкА. Это нормально? Мне кажется при наличии питания не должно брать от батареи.
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

kapitan0v писал(а):Попробовал подключить батарейку к STM32F0Disco...
в документации есть такое:
Battery backup domain
To retain the content of the Backup registers and supply the whole RTC domain when VDD is
turned off, VBAT pin can be connected to an optional standby voltage supplied by a battery
or by another source.
The VBAT pin powers the RTC unit, the LSE oscillator and the PC13 to PC15 IOs, allowing
the RTC to operate even when the main power supply is turned off. The switch to the VBAT
supply is controlled by the Power Down Reset embedded in the Reset block or (on
STM32F0x8 devices) by the external NPOR signal.
Warning: During tRSTTEMPO (temporization at VDD startup) or after a PDR is
detected, the power switch between VBAT and VDD remains connected
to VBAT.
During the startup phase, if VDD is established in less than tRSTTEMPO
(Refer to the datasheet for the value of tRSTTEMPO) and VDD > VBAT +
0.6 V, a current may be injected into VBAT through an internal diode
connected between VDD and the power switch (VBAT).
If the power supply/battery connected to the VBAT pin cannot support
this current injection, it is strongly recommended to connect an
external low-drop diode between this power supply and the VBAT pin.
попробуйте батарейку подключить через диод шотки
Открыл глаза
Сообщения: 56
Зарегистрирован: Сб июн 14, 2014 09:05:06

Сообщение kapitan0v »

oleg110592 писал(а):попробуйте батарейку подключить через диод шотки
Я так понял это решение что бы то не шел В БАТАРЕЙКУ. У меня же проблема в том что идет ИЗ нее при включенном устройстве.
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Сб фев 09, 2013 23:00:23

Сообщение alexf58 »

kapitan0v писал(а):
oleg110592 писал(а):попробуйте батарейку подключить через диод шотки
Я так понял это решение что бы то не шел В БАТАРЕЙКУ. У меня же проблема в том что идет ИЗ нее при включенном устройстве.
Понял правильно, но попробовать все равно можно: диод чуть уменшит напряжение с батарейки до уровня меньше VDD.
Родился
Аватара пользователя
Сообщения: 10
Зарегистрирован: Ср май 06, 2015 14:25:29

Сообщение vanika »

Подскажите про АЦП.

Читаю даташит, а именно:
Снимок.JPG
(26.72 КБ) 598 скачиваний
Из прочтенного делаю вывод что для кристалла STM32F407 максимальное время дискретизации равно 3+12=15 и делим на частоту PCLK2 (42 MHZ) и получаем в итоге 0,357 мкс. Таким образом умножив 0.357 на 12 бит получим время одного сканирования 5 мкс?Верно?

Где то читал что максимальная частота PCLK2 = 32 MHZ- но в datasheet-е про это ничего не нашел.

Вроде еще есть дуальный режим - объединение АЦП кристала, которое якобы позволяет уменьшить это время...
STM32F407 Discovery + KEIL 5
Грызет канифоль
Сообщения: 256
Зарегистрирован: Вт окт 08, 2013 07:38:59
Откуда: СПб

Сообщение Smen »

Распиновка такая
Изображение
Правильно ли я понимаю, что с контактов 1 и 2 (Target Vcc) напряжение должно подаваться с программатора на чип (режим SWD)?
Имею ST-Link V1, и, при попытке обращения к чипу (утилитой STM32 ST-Link), на в/у контактах ничего не появляется.
Если подать питание напрямую с 19 пина, то и чтение и программирование проходит без проблем.
Это так и должно быть, или где-то косяк (программатор достался б/у)?
Опытный кот
Аватара пользователя
Сообщения: 830
Зарегистрирован: Пт ноя 16, 2007 11:21:37

Сообщение Pavel_1978 »

эти контакты подключаются к шине питания программируемого МК.
и программирование происходит при поданном на таргет (плату) напряжении питания.
По ним програматор определяет величину напряжения питания, и от него же работает транслятор уровней (если ст-линк честный и он там есть :dont_know: ) так как камень может работать и на 2V.
Грызет канифоль
Сообщения: 256
Зарегистрирован: Вт окт 08, 2013 07:38:59
Откуда: СПб

Сообщение Smen »

Pavel_1978 писал(а):если ст-линк честный и он там есть
Да вроде "честный", но работал без подачи этого напряжения.
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

Собственно, у меня вопрос на миллион.
Известно, что с помощью отладчика, в МК STM32 можно править регистры, переменные в ОЗУ и вообще все,
что имеет атрибуты rw. Соответственно, есть возможность порулить периферией прямо из отладчика.
Меня интересует вопрос: А есть ли готовые утилиты, позволяющие шить отладчиком (ST-LINK или аналогичный)
внешние FLASH и EEPROM, подключенные к SPI или I2C камня, прямо через отладочные интерфейсы?
Ну, приблуда к OpenOCD или что-нибудь в таком роде?
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 830
Зарегистрирован: Пт ноя 16, 2007 11:21:37

Сообщение Pavel_1978 »

Smen писал(а):Да вроде "честный", но работал без подачи этого напряжения.
С ст-линком особо не разбирался - работает и работает, а вот J-Link при таких извратствах ( нет напряжения тагерта, или оно не в диапазоне для прошивки) посылает далеко и сразу.
Ну и главное - делай как написал производитель и будет щастье)))
Ответить

Вернуться в «ARM»