ART_ME

STM32 для чайника

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

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    25

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

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


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

Привет всем.

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

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

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


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

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

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

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


Ссылка на сообщение
Поделиться на других сайтах
Oxford    25
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    25

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

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


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

HAL_Init();

SystemClock_Config();

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

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

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

 

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

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


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

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

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

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

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


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

ADC_Init(ADC1);

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

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


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

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

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

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

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


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

ADC1->CR2 = ADC_CR2_ADON;

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

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


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

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

 

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

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

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


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

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

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

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


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

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

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

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

 

HAL_Init();

SystemClock_Config();

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

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

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


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

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

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


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

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

 

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

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


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

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

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

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

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

 

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


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

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

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

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

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


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

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

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

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

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

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

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

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

Загрузка...