Вы наверное хотели сказать I2C.es131245 писал(а):Может ли таймер быть и master И slavом?
STM32 новичку в ARM что к чему
- Реклама
- Сообщения: 369
- Зарегистрирован: Пт фев 01, 2013 21:05:30
Код: Выделить всё
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){}}
Один таймер главный, другой подчинённый. Примерно так:
Но для IC в этом случае могут быть сюрпризы вроде задержки N тактов на синхронизацию подчинённых таймеров.AN2592
Application note
How to achieve 32-bit timer resolution using the link system
in STM32F10x microcontrollers
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
Есть необходимость по выводу фрейма через SPI запускать таймер. Как это сделать руками в обработчике прерывания SPI, вопросов не вызывает. Однако, это как-то совсем не изящно. По идее, можно попробовать завести ногу NSS на вход ETR таймера и это вроде бы будет полностью аппаратным решением, но тоже как-то выглядит не очень. Может быть есть какое-то решение, чтобы окончание передачи по SPI аппаратно запускало таймер ?
a5021 писал(а):чтобы окончание передачи по SPI аппаратно запускало таймер ?
По окончанию приёма кадра пусть DMA установит CEN в регистре CR1 таймера.21.3.9 SPI communication using DMA (direct memory addressing)
Figure 232. Reception using DMA
- Реклама
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
Мне ничего не известно о том, что DMA умеет устанавливать биты где-либо, кроме своих собственных регистров. Если речь идет об установлении бита программно из обработчика прерывания DMA, то такая возможность известна, но интересует, нет ли чисто аппаратного решения, чтобы получалась более жесткая синхронизация между окончанием передачи и запуском таймера.
Установка бита CEN по факту есть копирование числа из одной ячейки памяти(DMA_CMAR) в другую ячейку(DMA_CPAR). Запуском DMA является событие окончания приёма(или передачи). Длина пересылки = 1 слово(регистр CR1 таймера). Получается всё аппаратно без каких-либо прерываний.
- Сообщения: 140
- Зарегистрирован: Вс ноя 11, 2012 14:13:02
Устанавливаю GNU для CooCox v.2 beta (система Windows XP Professional SP3), выскакивает вот такая ошибка, и установка не может завершится. У кого какие предположения есть по этому поводу?
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
в архиве скачать и распаковать куда ни будь - например у меня D:\GCCARM (имхо лучше в корне папка).
Качал архив тут: https://launchpad.net/gcc-arm-embedded файл gcc-arm-none-eabi-4_9-2015q1-20150306-win32.zip
Кокос работает, вин 8.1. В переменные среды, на всякий, прописал путь D:\GCCARM\bin
Качал архив тут: 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
- Сообщения: 56
- Зарегистрирован: Сб июн 14, 2014 09:05:06
Попробовал подключить батарейку к STM32F0Disco. Убрал SB1 и установил C17. Все работает, часы идут при отключении питания. Решил измерить ток - при работающем от источника питания потребление с батарейки - 33 мкА
, если отключить питание - 1 мкА. Это нормально? Мне кажется при наличии питания не должно брать от батареи.
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
в документации есть такое: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
Я так понял это решение что бы то не шел В БАТАРЕЙКУ. У меня же проблема в том что идет ИЗ нее при включенном устройстве.oleg110592 писал(а):попробуйте батарейку подключить через диод шотки
- Сообщения: 183
- Зарегистрирован: Сб фев 09, 2013 23:00:23
Понял правильно, но попробовать все равно можно: диод чуть уменшит напряжение с батарейки до уровня меньше VDD.kapitan0v писал(а):Я так понял это решение что бы то не шел В БАТАРЕЙКУ. У меня же проблема в том что идет ИЗ нее при включенном устройстве.oleg110592 писал(а):попробуйте батарейку подключить через диод шотки
- Сообщения: 10
- Зарегистрирован: Ср май 06, 2015 14:25:29
Подскажите про АЦП.
Читаю даташит, а именно: Из прочтенного делаю вывод что для кристалла STM32F407 максимальное время дискретизации равно 3+12=15 и делим на частоту PCLK2 (42 MHZ) и получаем в итоге 0,357 мкс. Таким образом умножив 0.357 на 12 бит получим время одного сканирования 5 мкс?Верно?
Где то читал что максимальная частота PCLK2 = 32 MHZ- но в datasheet-е про это ничего не нашел.
Вроде еще есть дуальный режим - объединение АЦП кристала, которое якобы позволяет уменьшить это время...
Читаю даташит, а именно: Из прочтенного делаю вывод что для кристалла STM32F407 максимальное время дискретизации равно 3+12=15 и делим на частоту PCLK2 (42 MHZ) и получаем в итоге 0,357 мкс. Таким образом умножив 0.357 на 12 бит получим время одного сканирования 5 мкс?Верно?
Где то читал что максимальная частота PCLK2 = 32 MHZ- но в datasheet-е про это ничего не нашел.
Вроде еще есть дуальный режим - объединение АЦП кристала, которое якобы позволяет уменьшить это время...
STM32F407 Discovery + KEIL 5
Правильно ли я понимаю, что с контактов 1 и 2 (Target Vcc) напряжение должно подаваться с программатора на чип (режим SWD)?
Имею ST-Link V1, и, при попытке обращения к чипу (утилитой STM32 ST-Link), на в/у контактах ничего не появляется.
Если подать питание напрямую с 19 пина, то и чтение и программирование проходит без проблем.
Это так и должно быть, или где-то косяк (программатор достался б/у)?
- Сообщения: 830
- Зарегистрирован: Пт ноя 16, 2007 11:21:37
эти контакты подключаются к шине питания программируемого МК.
и программирование происходит при поданном на таргет (плату) напряжении питания.
По ним програматор определяет величину напряжения питания, и от него же работает транслятор уровней (если ст-линк честный и он там есть
) так как камень может работать и на 2V.
и программирование происходит при поданном на таргет (плату) напряжении питания.
По ним програматор определяет величину напряжения питания, и от него же работает транслятор уровней (если ст-линк честный и он там есть
Да вроде "честный", но работал без подачи этого напряжения.Pavel_1978 писал(а):если ст-линк честный и он там есть
Собственно, у меня вопрос на миллион.
Известно, что с помощью отладчика, в МК STM32 можно править регистры, переменные в ОЗУ и вообще все,
что имеет атрибуты rw. Соответственно, есть возможность порулить периферией прямо из отладчика.
Меня интересует вопрос: А есть ли готовые утилиты, позволяющие шить отладчиком (ST-LINK или аналогичный)
внешние FLASH и EEPROM, подключенные к SPI или I2C камня, прямо через отладочные интерфейсы?
Ну, приблуда к OpenOCD или что-нибудь в таком роде?
Известно, что с помощью отладчика, в МК 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
С ст-линком особо не разбирался - работает и работает, а вот J-Link при таких извратствах ( нет напряжения тагерта, или оно не в диапазоне для прошивки) посылает далеко и сразу.Smen писал(а):Да вроде "честный", но работал без подачи этого напряжения.
Ну и главное - делай как написал производитель и будет щастье)))


