20.08.2016, 18:56
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: SOFTPWM stm32f030f4
Сообщение от zöner
|
такой говнокод...
|
Согласен, но с этим говнокодом мне быстрее входится в стм32. Разберусь чуток с периферией и буду напрямую писать в регистры. Ведь это всё есть в хидерах, откуда можно копипастить строчки регистров и всё.
Вот с стм32 в 103 АЦП освоил и регулярный канал и инжекционный. А вот с 030 немогу почемуто. Нужно сканить 3,4 каналы. Пишу инит. Запускаю отладку. В регистр пишет измеренное значение, но в прерывание IRQHandler не заходит.
Глянте плиз говнокод мой ))) Почему не попадает в прерывание?
PHP код:
|
void ADC_continious_ini(void)
{
GPIO_InitTypeDef Pin;
ADC_InitTypeDef ADC_Init_user;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
Pin.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4;
Pin.GPIO_Mode = GPIO_Mode_AN;
Pin.GPIO_Speed = GPIO_Speed_2MHz;
Pin.GPIO_OType = GPIO_OType_PP;
Pin.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &Pin);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
/* ADC1 DeInit */
ADC_DeInit(ADC1);
/* Initialize ADC structure */
ADC_StructInit(&ADC_Init_user);
ADC_Init_user.ADC_Resolution = ADC_Resolution_12b;
ADC_Init_user.ADC_ContinuousConvMode = ENABLE;
ADC_Init_user.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
//ADC_Init_user.ADC_ExternalTrigConv =
ADC_Init_user.ADC_DataAlign = ADC_DataAlign_Right;
ADC_Init_user.ADC_ScanDirection = ADC_ScanDirection_Upward;
ADC_Init( ADC1, &ADC_Init_user);
ADC_ChannelConfig(ADC1, ADC_Channel_3,ADC_SampleTime_7_5Cycles);
//ADC1-›CHSELR = ADC_CHSELR_CHSEL3 | ADC_CHSELR_CHSEL4;
ADC_ChannelConfig(ADC1, ADC_Channel_4,ADC_SampleTime_7_5Cycles);
//ADC_ContinuousModeCmd(ADC1, ENABLE);
NVIC_EnableIRQ(ADC1_IRQn);
ADC_ITConfig(ADC1,ADC_IT_EOC, ENABLE);
ADC_ITConfig(ADC1,ADC_IT_EOSEQ, ENABLE);
ADC_GetCalibrationFactor(ADC1);
ADC_Cmd(ADC1, ENABLE);
/* Wait the ADRDY flag */
//while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY));
/* ADC1 regular Software Start Conv */
ADC_StartOfConversion(ADC1);
}
oid ADC1_IRQHandler(void)
{
LEDpins[2]++;
if (ADC_GetITStatus(ADC1, ADC_IT_EOC) == SET )
{
ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
data_adc1 = (uint32_t)ADC_GetConversionValue(ADC1);
data_adc2 = (uint32_t)ADC_GetConversionValue(ADC1);
}
}
|
|
|
|
|
20.08.2016, 18:59
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: SOFTPWM stm32f030f4
Сообщение от NewWriter
|
Блин, а я и не пробовал раньше разгонять 030-й.
|
в 96-ом свой 80386 разгонял сопроцессор с 33 МГц до 35 вроде. Даже непомню как это делал )) Но сейчас нет компа в котором я бы не разгонял всё что можно, и видухи. Ток охлаждение соотв. Вот с тех пор наверно всё пробую разгонять ))) Есле б свой мозг разогнать еще чтоб быстрее вкуривать)))
|
|
|
|
20.08.2016, 19:04
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: SOFTPWM stm32f030f4
Сообщение от zöner
|
SoftwPWM оформить как inline
|
Незнаю что это такое inline....
|
|
|
|
20.08.2016, 21:30
|
|
Гражданин KAZUS.RU
Регистрация: 16.02.2012
Сообщений: 441
Сказал спасибо: 89
Сказали Спасибо 735 раз(а) в 149 сообщении(ях)
|
Re: SOFTPWM stm32f030f4
|
|
|
|
20.08.2016, 21:39
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: SOFTPWM stm32f030f4
АЦП запустил. Работает в режиме сканирования. Немогу понять что за два прерывания?
ISR-›EOS ISR-›EOC
EOC - End of conversion - это когда завершено преобразование.
EOS - end of sequence flag - не могу понять когда он включается.
Вот у меня два канала сканируется 3,4. В прерывании сделал так
PHP код:
|
void ADC1_IRQHandler(void)
{
if (ADC_GetITStatus(ADC1, ADC_IT_EOC) == SET )
{
ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
if (bit_temp) data_adc1 = (uint32_t)ADC_GetConversionValue(ADC1); else data_adc2 = (uint32_t)ADC_GetConversionValue(ADC1);
bit_temp^=1;
}
if (ADC_GetITStatus(ADC1, ADC_IT_EOSEQ) == SET )
{
ADC_ClearITPendingBit(ADC1, ADC_IT_EOSEQ);
}
}
|
в переменных data_adc1 и data_adc2 значения перехлёстываются. Немогу понять второй флаг прерывания.
|
|
|
|
21.08.2016, 00:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: SOFTPWM stm32f030f4
Сообщение от miwutka
|
Немогу понять что за два прерывания?
|
Ну фик с ним, с HAL-ом, но в даташит глянуть не быстрее, чем на форуме спрашивать?))
В вашем случае - EOSEQ не играет никакой роли и можно просто не разрешать прерывание по нему.
Последний раз редактировалось AR_Favorit; 21.08.2016 в 00:41.
|
|
|
|
21.08.2016, 01:47
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: SOFTPWM stm32f030f4
а для чего прерывание overrun? Это если режим continiuos и оно просканировало выбранные каналы, и начинает заново?
|
|
|
|
21.08.2016, 02:53
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: SOFTPWM stm32f030f4
Сообщение от miwutka
|
а для чего прерывание overrun? Это если режим continiuos и оно просканировало выбранные каналы, и начинает заново?
|
Нет. Это если независимо от режима при завершении очередного преобразования ADC обнаружилось, что флаг EOC уже установлен. Если программист не забыл очистить этот флаг - то это означает, что при появлении нового результата в ADC_DR предыдущее значение еще не было считано, то бишь потерялось при его перезаписи.
Именно поэтому, кстати, надо сначала считать значение ADC_DR, а уж потом очищать флаг EOC (у вас сделано наоборот), иначе возможна ситуация, что новое значение ADC_DR устанавливается где-то между очисткой флага и чтением регистра, и реально считывается значение уже следующего канала в последовательности, и даже отслеживание overrun эту ситуацию не исправит.
А завершение последовательности сканирования выбранных каналов - это как раз EOSEQ из предыдущих постов.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо AR_Favorit за это сообщение:
|
|
|
21.08.2016, 10:01
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: SOFTPWM stm32f030f4
AR_Favorit, Как же мне тогда правильно считывать значение с двух каналов при последовательном сканировании?...
|
|
|
|
21.08.2016, 10:23
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: SOFTPWM stm32f030f4
Сообщение от zöner
|
можно просто единицу писать, без &: TIM17-›SR = ~TIM_SR_UIF
один ldr лишний
|
TIM17-›SR &= ~TIM_SR_UIF;
Вот здесь я не понял. Я было подумал, что в этом случае мы сбрасываем бит UIF.
TIM17-›SR = ~TIM_SR_UIF;
А в этом случае мы записываем в регистр TIM17_SR число 0xFFFFFFFE. Ну, бит UIF сбросится, а как же остальные биты?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 17:51.
|
|