22.03.2017, 10:31
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Да, инжекционные (инжекторные, инжектированные - блин, че за название? если по переводу, то ближе к "введенные". странное название. куда "введенные"? кароч, "regular" - тут понятнее, можно перевести как "обычные", а "injected" - тут как бы засада с названием, больше подходит "раздельные", "separated")... вобщем, эти самые "введенные-разделённые", да, результат так же можно получать по ДМА, для этого у него есть инкремент адресов периферии, бит PINC.
|
|
|
|
22.03.2017, 14:45
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
stm32f103c8t6 и Keil 5
Чего то я запутался немного. Хочу запустить ADC1 один канал от таймера1 по второму каналу.
Таймер срабатывает и попадает у меня по прерыванию второго канала,а вот толи нет сигнала TRGO или неправильно настроил АЦП1 на прием сигнала.
Как можно увидеть сигнал TRGO от таймера в отладчике ?
Вручную запускал АЦП1 все нормально,измерение было.
инициализация таймера 1
Код:
|
//-------------------------------------------------------------------------
//Инициализация структур
//-------------------------------------------------------------------------
TIM_TimeBaseInitTypeDef TIM1_init;
TIM_OCInitTypeDef TIM1_OCPWM;
TIM_OCInitTypeDef TIM1_OC2_adc;
GPIO_InitTypeDef GPIO_Init_Led;
GPIO_InitTypeDef GPIO_Init_him;
//-------------------------------------------------------------------------
//Тактирование
//-------------------------------------------------------------------------
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE) ;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE );
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE );
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE) ;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE) ;
//-------------------------------------------------------------------------
//Инициализация таймера 1 канал шим,2 сравнение для ацп
//-------------------------------------------------------------------------
TIM1_init.TIM_CounterMode=TIM_CounterMode_Up;
TIM1_init.TIM_ClockDivision=TIM_CKD_DIV1;
TIM1_init.TIM_RepetitionCounter=0;
TIM1_init.TIM_Period=2264; //0x8B8; // 2264
TIM1_init.TIM_Prescaler=0x0000; // 32 kHz= 31,250 us
TIM_TimeBaseInit(TIM1,&TIM1_init);
TIM1_OCPWM.TIM_OCMode=TIM_OCMode_PWM1;
TIM1_OCPWM.TIM_OCPolarity=TIM_OCPolarity_High;
TIM1_OCPWM.TIM_Pulse=0x00; // 50%
TIM1_OCPWM.TIM_OutputState=TIM_OutputState_Enable;
TIM_OC1Init(TIM1,&TIM1_OCPWM);
TIM_CtrlPWMOutputs(TIM1,ENABLE);
TIM_OC1PreloadConfig(TIM1,ENABLE);
//-------------------------------------------------------------------------
// Инициализация для 2 канала сигнал для ацп TRGO
//------------------------------------------------------------------------
TIM1_OC2_adc.TIM_OCMode=TIM_OCMode_Active;
TIM1_OC2_adc.TIM_OCPolarity=TIM_OCPolarity_High;
TIM1_OC2_adc.TIM_Pulse=2260;
TIM1_OC2_adc.TIM_OutputState=TIM_OutputState_Disab le;
TIM_OC2Init(TIM1,&TIM1_OC2_adc);
TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_OC2Ref );
//TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);
TIM_ITConfig(TIM1,TIM_IT_CC2,ENABLE);
TIM_ITConfig(TIM1,TIM_IT_COM,ENABLE);
TIM_ITConfig(TIM1,TIM_IT_Trigger,ENABLE);
TIM_Cmd(TIM1,ENABLE);
TIM1-›SR &= ~TIM_SR_CC2IF;
TIM1-›SR &= ~TIM_SR_UIF;
TIM1-›SR &= ~TIM_SR_COMIF;
//NVIC_EnableIRQ(TIM1_UP_IRQn);
NVIC_EnableIRQ(TIM1_TRG_COM_IRQn);
NVIC_EnableIRQ(TIM1_CC_IRQn); |
Инициализация АЦП1
Код:
|
GPIO_InitTypeDef GPIO_Init_ADC;
ADC_InitTypeDef ADC_Init_A5;
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE );
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE) ;
GPIO_Init_ADC.GPIO_Pin=GPIO_Pin_5;
GPIO_Init_ADC.GPIO_Mode=GPIO_Mode_AIN;
GPIO_Init_ADC.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_Init_ADC);
ADC_Init_A5.ADC_Mode=ADC_Mode_Independent;
ADC_Init_A5.ADC_DataAlign=ADC_DataAlign_Right;
ADC_Init_A5.ADC_ContinuousConvMode=DISABLE;
ADC_Init_A5.ADC_ExternalTrigConv=ADC_ExternalTrigC onv_T1_CC2;
ADC_Init_A5.ADC_ScanConvMode=DISABLE;
ADC_Init_A5.ADC_NbrOfChannel=1;
ADC_Init(ADC1,&ADC_Init_A5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_5,1,ADC_ SampleTime_13Cycles5);
NVIC_EnableIRQ(ADC1_2_IRQn);
ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);
ADC_ExternalTrigConvCmd(ADC1,ENABLE);
ADC_Cmd(ADC1,ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1)==SET);
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1)==SET); |
Прерывания в main.c
Срабатывает только прерывание TIM1_CC_IRQHandler
Код:
|
//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
void TIM1_UP_IRQHandler(void)
{
if(TIM_GetITStatus(TIM1,TIM_IT_Update)==!RESET)
{
//TIM_ClearITPendingBit(TIM1,TIM_IT_Update);
TIM1-›SR &= ~TIM_SR_UIF;
}
}
void TIM1_TRG_COM_IRQHandler(void)
{
if(TIM_GetITStatus(TIM1,TIM_IT_COM)==!RESET)
{
//TIM_ClearITPendingBit(TIM1,TIM_IT_Update);
TIM1-›SR &= ~TIM_SR_COMIF;
}
}
void TIM1_CC_IRQHandler(void)
{
if(TIM_GetITStatus(TIM1,TIM_IT_CC2)==!RESET)
{
//TIM_ClearITPendingBit(TIM1,TIM_IT_Update);
TIM1-›SR &= ~TIM_SR_CC2IF;
}
}
//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
void ADC1_2_IRQHandler(void)
{
if(ADC_GetITStatus(ADC1,ADC_IT_EOC)== SET)
{
adc=ADC_GetConversionValue(ADC1);
ADC_ClearITPendingBit(ADC1,ADC_IT_EOC);
}
}
//------------------------------------------------------------------------- |
__________________
Глаза боятся,а руки делают.
Последний раз редактировалось CERGEI1982; 22.03.2017 в 14:49.
|
|
|
|
23.03.2017, 08:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
А вот по TIM3_TRGO event получилось запустить ADC1
Код:
|
//-------------------------------------------------------------------------
// Инициализация структур
//-------------------------------------------------------------------------
TIM_TimeBaseInitTypeDef TIM3_init;
// TIM_OCInitTypeDef TIM1_OC1_adc;
GPIO_InitTypeDef GPIO_Init_Led;
//-------------------------------------------------------------------------
// Тактирование
//-------------------------------------------------------------------------
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE) ;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE );
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE );
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE) ;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE) ;
//-------------------------------------------------------------------------
// Настройка TIM3 для ацп1
//-------------------------------------------------------------------------
TIM3_init.TIM_CounterMode=TIM_CounterMode_Up;
TIM3_init.TIM_ClockDivision=TIM_CKD_DIV1;
TIM3_init.TIM_RepetitionCounter=0;
TIM3_init.TIM_Period=2264; //0x8B8; // 2264
TIM3_init.TIM_Prescaler=0x0000; // 32 kHz= 31,250 us
TIM_TimeBaseInit(TIM3,&TIM3_init);
//-------------------------------------------------------------------------
// Захват по сравнению
//------------------------------------------------------------------------
// TIM1_OC1_adc.TIM_OCMode=TIM_OCMode_Active;
// TIM1_OC1_adc.TIM_OCPolarity=TIM_OCPolarity_High;
// TIM1_OC1_adc.TIM_Pulse=2260;
// TIM1_OC1_adc.TIM_OutputState=TIM_OutputState_Disab le;
//
// TIM_OC2Init(TIM1,&TIM1_OC1_adc);
TIM_SelectOutputTrigger(TIM3,TIM_TRGOSource_Update );
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
//TIM_ITConfig(TIM1,TIM_IT_CC1,ENABLE);
//TIM_ITConfig(TIM1,TIM_IT_COM,ENABLE);
//TIM_ITConfig(TIM1,TIM_IT_Trigger,ENABLE);
TIM_Cmd(TIM3,ENABLE);
TIM3-›SR &= ~TIM_SR_CC1IF;
TIM3-›SR &= ~TIM_SR_CC2IF;
TIM3-›SR &= ~TIM_SR_CC3IF;
TIM3-›SR &= ~TIM_SR_CC4IF;
TIM3-›SR &= ~TIM_SR_UIF;
TIM3-›SR &= ~TIM_SR_COMIF;
NVIC_EnableIRQ(TIM3_IRQn); |
Код:
|
GPIO_InitTypeDef GPIO_Init_ADC;
ADC_InitTypeDef ADC_Init_A5;
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE );
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE) ;
GPIO_Init_ADC.GPIO_Pin=GPIO_Pin_5;
GPIO_Init_ADC.GPIO_Mode=GPIO_Mode_AIN;
GPIO_Init_ADC.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_Init_ADC);
ADC_Init_A5.ADC_Mode=ADC_Mode_AlterTrig;
ADC_Init_A5.ADC_DataAlign=ADC_DataAlign_Right;
ADC_Init_A5.ADC_ContinuousConvMode=DISABLE;
ADC_Init_A5.ADC_ExternalTrigConv=ADC_ExternalTrigC onv_T3_TRGO;
ADC_Init_A5.ADC_ScanConvMode=ENABLE;
ADC_Init_A5.ADC_NbrOfChannel=1;
ADC_Init(ADC1,&ADC_Init_A5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_5,1,ADC_ SampleTime_13Cycles5);
NVIC_EnableIRQ(ADC1_2_IRQn);
ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);
ADC_ExternalTrigConvCmd(ADC1,ENABLE);
ADC_Cmd(ADC1,ENABLE); |
__________________
Глаза боятся,а руки делают.
Последний раз редактировалось CERGEI1982; 23.03.2017 в 08:40.
|
|
|
|
23.03.2017, 08:41
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
У кого нибудь получалось запустить ADC1 от TIM1_CC1 event ? В чем ошибся при настройке ?
__________________
Глаза боятся,а руки делают.
|
|
|
|
09.04.2017, 19:39
|
|
Прописка
Регистрация: 23.02.2005
Сообщений: 166
Сказал спасибо: 203
Сказали Спасибо 46 раз(а) в 27 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Всем доброго!
Не хочу ради малого вопроса тему создавать, спрошу здесь.
Сам не сильно программист, потому туплю и никак не соображу:
Как максимально быстро вывести число в порт по маске?
Конкретно.
Есть МК F103, нужно быстро выводить 8-разрядное целое число (например, OutPort) в порт B, на пины PB3...PB10 (8 выводов), не затрагивая при этом другие пины.
Понятно, что если забить на другие выводы, можно использовать классический вариант:
GPIOB-›ODR = (OutPort ‹‹ 3);
В данном случае большинство других пинов этого порта настроены на вход либо альтернативные функции, но есть PB12, настроенный на выход для другой задачи.
Тогда придётся его считывать и модифицировать выводимое число.
Как это сделать быстро, без лишних команд?
Как вариант ещё использовать битовый вывод (BSRR, BRR), но тогда перевод пинов в 1 и в 0 будет сдвинут по времени, что нежелательно, т.к. к упомянутым выводам подключена через драйверы и мосфеты резистивная матрица, своего рода мощный АЦП на десятки ампер, и могут возникнуть нежелательные иглы и провалы.
Желательно выводить число единовременно на все 8 выводов.
Кто что посоветует?
|
|
|
|
09.04.2017, 19:49
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
GPIOB-›BSRR = 0xFF‹‹(16+3) | OutPort‹‹3
За разъяснениями обращаемся к описанию регистра BSRR.
При одновременном присутствии 1 в битах BS и BR приоритет будет иметь именнно установка бита.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо NewWriter за это сообщение:
|
|
|
09.04.2017, 22:41
|
|
Прописка
Регистрация: 23.02.2005
Сообщений: 166
Сказал спасибо: 203
Сказали Спасибо 46 раз(а) в 27 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от NewWriter
|
GPIOB-›BSRR = 0xFF‹‹(16+3) | OutPort‹‹3
За разъяснениями обращаемся к описанию регистра BSRR.
При одновременном присутствии 1 в битах BS и BR приоритет будет иметь именнно установка бита.
|
Благодарю, завтра опробую!
То, что можно использовать одновременно обе части регистра BSRR, BS и BR, я догадывался, но как это сделать просто и быстро, и как получается столь лаконичная запись, пока пытаюсь понять..
|
|
|
|
10.04.2017, 00:16
|
|
Частый гость
Регистрация: 08.05.2011
Сообщений: 25
Сказал спасибо: 12
Сказали Спасибо 7 раз(а) в 4 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от NewWriter
|
GPIOB-›BSRR = 0xFF‹‹(16+3) | OutPort‹‹3
За разъяснениями обращаемся к описанию регистра BSRR.
При одновременном присутствии 1 в битах BS и BR приоритет будет иметь именнно установка бита.
|
А так не достаточно?
GPIOB-›BSRR = OutPort‹‹3;
|
|
|
|
10.04.2017, 00:28
|
|
Вид на жительство
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от Sl_
|
А так не достаточно?
GPIOB-›BSRR = OutPort‹‹3;
|
Если все эти 8 линий сброшены, то достаточно. Но если нужно записать так, чтобы не влияло предыдущее состояние портов, то надо именно так:
GPIOB-›BSRR = 0xFF‹‹(16+3) | OutPort‹‹3
Здесь все восемь сбрасываются, кроме тех, что устанавливаются в BS части, у неё приоритет. Удобно. Из RM:
Цитата:
|
Note: If both BSx and BRx are set, BSx has priority.
|
Последний раз редактировалось H4LF; 10.04.2017 в 02:55.
|
|
|
|
10.04.2017, 08:54
|
|
Прописка
Регистрация: 23.02.2005
Сообщений: 166
Сказал спасибо: 203
Сказали Спасибо 46 раз(а) в 27 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от Unknown
|
пока пытаюсь понять..
|
А, так что ж тут понимать-то??
Наверное, я вчера спал уже...
Смещаем 8 единиц на 16+3 разрядов и они попадают в BR3...BR10, а само число, смещенное на 3 разряда - в регистры BS!
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:37.
|
|