ART_ME

STM32 для чайника

1 899 сообщений в этой теме

Smith2007    0
41 минуту назад, snn_krs сказал:

Странно что Pin_7 работает. Первой командой при инициализации порта, должно быть включение тактирования

Я не весь код привел. Безусловно тактирование включено.

зы. В обед успел отключить 

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);

GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE); 

Все работает! PB3, PB4 - светодиод ожил. Загрузка прошивки нормальная.

Еще одну страничку в stm32 изучил с Вашей помощью :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
MaksHimik    1
В 22.09.2017 в 18:53, mail_robot сказал:

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

Я обычно таких сложностей стараюсь избегать. Чем проще код, тем он понятнее и меньше багов

возможно вместо этой ерунды


reinterpret_cast<const uint8_t*>(buf);

прокатит простое явное приведение типа


(uint8_t*)buf;

дуриновски обьектный код это жопа полная. Старайтесь его избегать

 

в треугольных скобках -- это не приведение типа. Это указание компилятору, с каким типом реализовывать шаблонную функцию (есть такая штука в Ц++). Можно написать без треугольных скобок, но в реализации явно указать тип параметра. Шаблоны нужны для того, чтобы компилятор скопом создавал функции с нужными типами параметра и результата в зависимости от того, как в каком месте кода эта функция используется. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Oxford    27

По умолчанию после сброса ноги заняты под отладчики. Можно освободить под свои нужды.photo_2018-06-07_06-01-40.thumb.jpg.a4acddc438d75ee71956bcc4ad5ee4d0.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
MihaNN52    2

Привет всем.

Ни как не могу побороть HAL BUSY На F103;

Может есть у кого решение? Происходит в случае не получения ответа от слейва и все встает колом. С меня что угодно, я чет уже замучился совсем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    559
8 часов назад, MihaNN52 сказал:

все встает колом

Существует такое понятие, как "Таймаут". Как раз на случаи, чтобы не вставало всё колом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Oxford    27
16 часов назад, MihaNN52 сказал:

Привет всем.

Ни как не могу побороть HAL BUSY На F103;

Может есть у кого решение? Происходит в случае не получения ответа от слейва и все встает колом. С меня что угодно, я чет уже замучился совсем.

Что не работает, я просто не совсем понял что такое HAL  BUSY

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Проблема такая, всегда работал с инжекторными каналами, но нужно применить ДМА для АЦП, попробовал инжекторный канал с ДМА не получилось запустить, не знаю должно ли работать, потом попробовал регулярные каналы с ДМА, и тоже не удалось запустить, причем как ХАЛом, так и регистрами, потом попробовал регулярный канал без ДМА тоже не работает. Сейчас пытаюсь первый регулярный канал АЦП с ДМА запустить и ничего

Скрытый текст

void ADC_Init()
{ 
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
GPIOA->CRL&=~GPIO_CRL_MODE1;
GPIOA->CRL&=~GPIO_CRL_CNF1;
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;
RCC->CFGR|=RCC_CFGR_ADCPRE_DIV6;// делитель на 6, таккак тактирование проца 72МГц

ADC1->CR1 = 0;
ADC1->SQR1 = 0;
ADC1->CR2 |= ADC_CR2_CAL;//калибр.
while (!(ADC1->CR2 & ADC_CR2_CAL));
ADC1->CR2 |= ADC_CR2_EXTSEL | ADC_CR2_DMA;
ADC1->CR2 |= ADC_CR2_CONT;
ADC1->CR1 |= ADC_CR1_EOCIE;//прерывание
ADC1->SQR3= 1;//первый канал
ADC1->CR2 = ADC_CR2_ADON; 
//ADC1->CR2 |= ADC_CR2_SWSTART;
}
void ADC_Start_RegChnl(uint16_t *tADC_DataBuff, uint8_t tCnt)
{RCC->AHBENR |= RCC_AHBENR_DMA1EN;
  // настриваем ДМА
  DMA1_Channel1->CCR &= ~(DMA_CCR_EN | DMA_CCR_TCIE);  // отключили канал
  DMA1->IFCR = (0xf << 0);
  DMA1_Channel1->CPAR = (uint32_t) &ADC1->DR;
  DMA1_Channel1->CMAR = (uint32_t) tADC_DataBuff;
  DMA1_Channel1->CNDTR = tCnt;
  DMA1_Channel1->CCR |= (DMA_CCR_PSIZE| DMA_CCR_MSIZE| DMA_CCR_MINC | DMA_CCR_TCIE | DMA_CCR_EN);//Задать размерность данных 16бит

 ADC1->CR2 |= ADC_CR2_SWSTART;

}
int main(void)
{
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();


NVIC_EnableIRQ(DMA1_Channel1_IRQn);

 NVIC_EnableIRQ(ADC1_IRQn);

ADC_Init(ADC1);
	ADC_Start_RegChnl(data112, 1);

  while (1)
  {

if(Event & EVENT_ADC_CMPL)
   {
	data112[0] = 0;

	ADC_Start_RegChnl(data112, 1);
	Event &= ~EVENT_ADC_CMPL;
   }
}
}

void ADC1_IRQHandler(void)
{
  if(ADC1->SR & ADC_SR_EOC)
  {// закончили преобразование
   Event |= EVENT_ADC_CMPL;
     
   ADC1->SR &= ~ADC_SR_EOC;


  }
}

 

 

А вот пробую один регулярный канал, по прерыванию, без ДМА

Скрытый текст

void ADC_Init()
{ 
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
GPIOA->CRL&=~GPIO_CRL_MODE1;
GPIOA->CRL&=~GPIO_CRL_CNF1;
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;
RCC->CFGR|=RCC_CFGR_ADCPRE_DIV6;// делитель на 6, таккак тактирование проца 72МГц

ADC1->CR1 = 0;
ADC1->SQR1 = 0;
ADC1->CR2 |= ADC_CR2_CAL;//калибр.
while (!(ADC1->CR2 & ADC_CR2_CAL));
ADC1->CR2 |= ADC_CR2_EXTSEL;
ADC1->CR2 |= ADC_CR2_CONT;
 ADC1->CR1 |= ADC_CR1_EOCIE;
ADC1->SQR3= 1;//первый канал
ADC1->CR2 = ADC_CR2_ADON; 
}



int main(void)
{
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();



 NVIC_EnableIRQ(ADC1_IRQn);

ADC_Init(ADC1);
	
 ADC1->CR2 |= ADC_CR2_SWSTART;

  while (1)
  {

if(Event & EVENT_ADC_CMPL)
   {
	data112[0] =ADC1->DR;

	 ADC1->CR2 |= ADC_CR2_SWSTART;

	Event &= ~EVENT_ADC_CMPL;
   }
}
}

void ADC1_IRQHandler(void)
{
  if(ADC1->SR & ADC_SR_EOC)
  {// закончили преобразование
   Event |= EVENT_ADC_CMPL;
     
   ADC1->SR &= ~ADC_SR_EOC;


  }
}

 

 

Изменено пользователем Электронщик

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Oxford    27

Электронщик, Ну и какой микроконтроллер?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Oxford    27

HAL_Init();

SystemClock_Config();

А это для чего?

Микроконтроллер STM32F103C8T6?

За такой код надо за яйки подвесить.

 

Изменено пользователем Oxford

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да, это конфигурация тактирования проца сделана кубом.

И что с кодом не так? Пользуюсь такм не первый раз, дае, если я регистрами тактирование вставлю, оно все равно работать не будет.. Проблема не в этом, посмотрел отладчиком., регистры настройки АЦП установлены, что не так, не понятно

Изменено пользователем Электронщик

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
snn_krs    47
3 hours ago, Электронщик said:

ADC_Init(ADC1);

Интересно какую функцию подставляет компилятор по этому вызову. Есть ваша без параметров и HAL с двумя параметрами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да то была функция с выбором ADC1 ,2 или 3, потом убрал выбор в итоге ADC_Init(); и это моя функция, а не хал

Хал с двумя параметрами, то просто тактирование процветания, у меня так всегда все работает, ну подставляю регистрами тактирование проца, ну будет тоже самое. Времени нет сейчас вставить тактирование по регистрам, но позже сделаю.

Изменено пользователем Электронщик

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
snn_krs    47
4 hours ago, Электронщик said:

ADC1->CR2 = ADC_CR2_ADON;

Наверно надо ADC1->CR2 |= ADC_CR2_ADON;

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Oxford    27
11 минуту назад, snn_krs сказал:

Наверно надо ADC1->CR2 |= ADC_CR2_ADON;

 

Ага. Он  настраивал, а потом присвоил тем самым стерев все. CR2 тупо равен 0x00000001

Изменено пользователем Oxford

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Кстати не заметил, что или не сделал. Попробую, так бывает десять раз что-то меняешь и не замечаешь, спасибо, проверю. Это ж включение АЦП))).

Изменено пользователем Электронщик

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Oxford    27
5 минут назад, Электронщик сказал:

Кстати не заметил, что или не сделал. Попробую, так бывает десять раз что-то меняешь и не замечаешь, спасибо, проверю. Это ж включение АЦП))).

Ага по умолчанию все биты в нулях кроме 1 бита включения ))), а ты посмотри по дефолту что там они означают. Считай ничего и не настраивал. Ты когда выкладываешь, скрины регистров пожалуйста прикрепляй или хотя бы число.

А надо не по сто раз менять все, а просто изучить ADC периферию и работать с ней правильно. Это не сложно.

 

HAL_Init();

SystemClock_Config();

Это убрать чтобы я больше не видел в коде.

Изменено пользователем Oxford

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mail_robot    1 431

там если не выпендриваться, то делов на 2 минуты. Куб этот код автоматом пишет

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
MihaNN52    2
В 17.06.2018 в 12:57, GOR23 сказал:

@MihaNN52 С какой функции hal_ busy возврашается?

 

HAL_I2C_Master_Read и  HAL_I2C_Mem_Read  В любом случае если подчиненный не дает ответ приходит BUSSY и че дальше с ним делать не понимаю. Как его сбросить? Командой или по таймауту?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mail_robot    1 431

HAL_BUSY возвращается функцией только в одном случае, когда флаг состояния в регистре SR1 I2C говорит о том, что шина не готова к следующей транзакции (HAL_I2C_STATE_READY != 1)

Если в наглую, то нужно просто перезапустить чтение заново. По флаг HAL_BUSY ваша функция вывалится в колбэк, там надо проверить состояние этого флага. Если он есть, просто перезапускаем чтение и все. Он сбрасывается автоматически.

Но надо гдето сохранить данные о том, что произошло такое событие.

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mail_robot    1 431
1 hour ago, mail_robot said:

В нормальной жизни этот флаг не должен получаться никогда

немного надо уточнить - никогда, если вы не в режиме поллинга

Изменено пользователем mail_robot

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...

  • Сообщения

    • я вот за кодинг стм еще ни разу не платил. Откуда у человека такие проблемы? В детстве что-ли уронили?... ему уже целую страницу опытные люди говорят - чувак, грусти нет, открой глаза. А он с бараньим упорством продолжает утверждать обратное, по сути даже и не начиная что-то писать. Беседа теряет смысл
    • Выложили бы в удобном формате типа картинка
    • так примените лучшую схему управы,  где напряжение не гуляет а стоит стабильно даже на ХХ.http://ruslanlipin.narod.ru/puskovoe_fixaty.html
    • выше уже писал об этой проблеме и протестировано. да оно работает, но не стабильно особенно на малых токах. и обороты добавляются не достаточно. а на малых токах  движок дергается. не очень сильно но стабильно дугу держать не может. если бы на выходе инвертора была бы чистая постоянка то никаких проблем.  а там импульсы, движок индуктивность  они друг с другом не дружат. тем более заполнение импульса постоянно гуляет 
    • @Ulis nsl32 вроде тоже с резистивным выходом и вроде ещё есть в продаже у официальных продавцов. Его можно было бы использовать ?
    • Скажите пожалуйста, как грамотнее крепить большой (от 10 ") круглый динамик к лицевой панели? в смысле просто привинчивать его в штатные отверстия саморезами или винтами? Если магнит тяжелый, тонкая стальная штампованная кольцевая рамка согнется. Или нужны какие-то хитрые сегментные/секторные шайбы (я прикинул, круглые большие шайбы залезают и давят на подвес диффузора, а мелкие не имеют смысла).   Прокладки резиновые под посадку нужны? Из чего вырезают эти кольца? Я было прицелился вырезать из автомобильной камеры, а фига - камеру сегодня днем с огнем не найдешь.  Что разумнее сделать практически? 
    • Да . Конечно есть косяки ... .  Главный из них -- С5 огромной ёмкости . Когда вы занижаете выходное напряжение подключением мощной нагрузки ... на некий промежуток времени  вход микросхемы напрямую через мощный конденсатор оказывается под отрицательным напряжением и всей мощью ёмкости С5 ... , а к работе в таком режиме ну совершенно "не предназначен" ... и пробивает как правило внутренний транзистор в режиме прямого диода из-за того что конденсатор фактически разряжается через два диода микросхемы напрямую на общий провод ... .  А всё потому что ни микросхема ни транзистор совершенно не являются мгновенными приборами ... . И ещё и отчасти также недостаточной ёмкостью выходного конденсатора ... .  Да , сам С5 нужен для быстрой отработки выходного напряжения , но ёмкости его в 1000 пф более чем достаточно ... ! И то желательно с последовательным сопротивлением ом на 100 где-то ... .  С входным напряжением микросхемы тоже некие проблемы на грани фолла ... . Думаю не нужно сильно объяснять чем это грозит при разных нестационарных процессах ... . Вылечить угрозы ... тут лучше всего нагрузив микросхему на эмиттер n-p-n повторителя тока , база которого имеет потенциал чуть выше  рабочего напряжения микросхемы . Если выбрать рабочее напряжение порядка 2.5 Вольт (обычный минимум для микросхемы) , то где-то на базе биполярного транзистора достаточно порядка 3.5 вольт , скажем организованного на такой же 431 с конденсатором и резисторе гораздо скромнее по уровню тока ... . При этом рабочее напряжение схемы управления выходным транзистором будет уже определяться допустимым напряжением коллектора биполярного транзистора в режиме с ОбщейБазой ... . Но и это ещё не всё . Третья проблема в том что если вы хоть на момент (под)"коротнёте" выход  ... напряжение на затворе выходного транзистора окажется равным входному и более 30 Вольт ... , на который более 20 Вольт уже подавать не требуется и не рекомендуется ... .  А четвёртый подвох ещё в том  что при всём этом  в номинальном режиме на затвор нужно хотя бы +10 вольт относительно выхода , а это уже больше чем мы можем получить ввиду того что входное напряжение ниже требуемого ... . На схему управления для решения всего этого принято монтировать отдельный параллельный выпрямитель малой мощности  для получения хоть пары вольт дополнительно для раскачки ... . Но если капельку коротнуть выход ... у нас уже 40 вольт на затворе получиться ... со всеми шансами получить неописуемые впечатления от увиденного ... .  Вот примерно такой наборчик "косячков" ... .