Перейти к содержанию

Загрузка прошивки в STM32F103C8T6


ilya_orel00

Рекомендуемые сообщения

Заливаю код для моргания светодиодом в STM32,  подключаясь преобразователем уровней для COM порта MAX232 к пинам PA9, PA10. Перед этим выставляю джемперы на программирование и сбрасываю. То есть прошиваю через UART. После прошивки переставляю джемперы на местои сбрасываю. Прошивка загружается успешно, но программа не работает, хотя она заведомо рабочая. Другие программы тоже не пашут. HEX создаю в Keil. В чём проблема? Может в тактировании, может ещё в чём-то. На всех пинах стабильный 0. 

#include "stm32f10x.h" 

#define LED_H (GPIOC->BSRR = GPIO_BSRR_BR13)
#define LED_L (GPIOC->BSRR = GPIO_BSRR_BS13)

volatile unsigned int SysTickDelay;

void _delay_ms(uint32_t Val){
	SysTickDelay = Val;
	while (SysTickDelay != 0) {};
}

//------------------------------------------------------------------------
void SysTick_Handler(void){
   if (SysTickDelay != 0){
      SysTickDelay--;
   }
}

int main(){
  
//LEDs_INIT; 
GPIOC->CRH &= ~GPIO_CRH_CNF13; //
GPIOC->CRH |=  GPIO_CRH_MODE13;	
	
// SysTick INIT
SysTick_Config(72000000/1000);//1ms 
  
  while(1){
    LED_H;
    _delay_ms(1000);
    LED_L;
    _delay_ms(1000);
  }
}

 

lr 1.hex

Изменено пользователем ilya_orel00
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

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

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

19 минут назад, BARS_ сказал:

А еще до этого купить программатор за 3 бакса

Полностью согласен) Сам сутками сижу с чем то вожусь экономя три бакса :D Хотя мог за это время больше заработать)) Тут скорее даже не экономя, а просто интересно же самому без инструментов готовых! Не ища легкий путей. Но потом, когда через кучу времени все получилось, все равно возвращаюсь к покупке инструмента типа программатор, лог анализатор и прочего, и понимаю на сколько ж это удобней и приятней :D 

Изменено пользователем DrobyshevAlex
Ссылка на комментарий
Поделиться на другие сайты

Тактирование порта же не включено!

Что до программатора, лично я вообще предпочитаю на STM32F072 работать через DFU! Крайне удобно: ничего лишнего не нужно. А запускается режим DFU из прошивки. Дал в терминале МК команду "dfu", в соседней вкладке терминала запустил "make dfuboot" — вуаля! Только питание переключить после прошивки (т.к. dfu-util не умеет перезагружать МК). Зато не нужно лишних ног выбрасывать коту под хвост. [url=https://github.com/eddyem/stm32samples/tree/master/F0-nolib/3steppersLB]Вот здесь[/url], например, у меня только одна нога не используется — какой уж тут SWD (или тем паче JTAG)?

А отладка этими страшными gdb — на любителя. Многие вещи - тот же USB и всякие другие рилтаймовые штуки, где задержки неприемлемы - отладить через JTAG или SWD невозможно. st-link применяю лишь для STM8, да в очень редких случаях с STM32F103.

Изменено пользователем Eddy_Em
Ссылка на комментарий
Поделиться на другие сайты

Объясните, пожалуйста, как включить тактирование простыми словами. Я в этой теме ноль. STLINK нет времени ждать из Китая, нужно срочно зашить код в стм и чтоб работало.

UPD: всё разобрался

Изменено пользователем ilya_orel00
Ссылка на комментарий
Поделиться на другие сайты

15 минут назад, Eddy_Em сказал:

Зато не нужно лишних ног выбрасывать коту под хвост.

Ну да, целых две. У вас, видимо, прошивки не сложнее мигания диодов.

 

16 минут назад, Eddy_Em сказал:

А отладка этими страшными gdb — на любителя.

А что страшного? Одна кнопка в Keil и ты видишь весь внутренний мир МК. Это, таки, не на любителя, а на профессионала.

 

17 минут назад, Eddy_Em сказал:

например, у меня только одна нога не используется

Есть такая штука - оптимизация.

 

18 минут назад, Eddy_Em сказал:

ногие вещи - тот же USB и всякие другие рилтаймовые штуки

Интересно, а я отлаживал USB как раз через SWD. Что-то под отладчиком, что-то через RTT. Было невероятно удобно. И какие там еще "реалтаймовские штуки" вы не можете отладить через SWD? 

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

теперь такой вопрос. Вот собственно тот код, который я пытаюсь получить. Задача получить на выходе ЦАП треугольник с частотой 5 Гц. Дискретность выдачи в ЦАП 1 кГц. Связываться по I2C. ЦАП MCP4725. В Keil сам генератор работает и выдаёт 5 Гц. А вот в железе не работает. На выходе ЦАП стабильно 1.5 В при любых условиях. А на выходе PB6 и PB7 нули. Код прилагаю. Что может быть не так? Блок вывода в ЦАП рабочий. В другой программе работал. И переменные тоже получают корректные значения. В общем виртуально работает, но на выходе ЦАП ничего нет. Пробовал адреса 0x60 и 0x61. Ситуация не меняется

#include "stm32f10x.h"
#include "math.h"
int16_t empty16=0;
float i=0;
int j=0,q=0,i2c1,i2c2;
void TIM3_IRQHandler(void) //run with the interrupts of TIM3
	{
		//check the end of the rising front
		if(j==4095)
		{
			q=1;
		}
		//check the end of the falling front
		if(j==0)
		{
			q=0;
		}
		//rising front
		if(q==0)
		{
			i+=40.95;
			j=rint(i);
			i2c1=(j>>8)&0xF; //get 1 byte
			i2c2=j&0xFF; //get 2 byte
		}
		//falling front
		if(q==1)
		{
			i-=40.95;
			j=rint(i);
			i2c1=(j>>8)&0xF; //get 1 byte
			i2c2=j&0xFF; //get 2 byte
		}
		I2C1->CR1|=I2C_CR1_START; //start i2c
		while(!(I2C1->SR1 & I2C_SR1_SB)); //check start bit
		I2C1->DR|=0xC1; //adress 0x60
		while(!(I2C1->SR1 & I2C_SR1_ADDR)); //check address bit
		empty16=I2C1->SR2; //empty read
		while(!(I2C1->SR1 & I2C_SR1_TXE)); //check transmitter
		I2C1->DR=i2c1; //send 1 byte of data
		while(!(I2C1->SR1 & I2C_SR1_TXE));
		I2C1->DR=i2c2; //send 2 byte of data
		while(!(I2C1->SR1 & I2C_SR1_TXE));
		while(!(I2C1->SR1 & I2C_SR1_BTF));
		I2C1->CR1|=I2C_CR1_STOP; //stop i2c
		if(empty16<0x1FFF) //delay and use empty16
			 empty16=0x1FFF;
		while(--empty16);
		TIM3->SR &= ~TIM_SR_UIF; //reset interrupt
  }
int main(void)
{
	RCC->APB2ENR|=(RCC_APB2ENR_IOPBEN); //enable PORTB
	RCC->APB1ENR |=(RCC_APB1ENR_TIM3EN|RCC_APB1ENR_I2C1EN); //enable TIM3, I2C
	GPIOB->CRL|=0x66444444; //set PB6, PB7 2MHz, open drain; 
	TIM3->PSC|=0x1C1F;  //prescaler 72MHz/(7199+1)=10KHz
	TIM3->ARR|=0x9; //set frequency 1kHz 10KHz/(9+1)=1kHz
	TIM3->DIER |= TIM_DIER_UIE; //enable interrupt for TIM3
	TIM3->CR1|=TIM_CR1_CEN; //TIM3 on
	//set initial frequency 36MHz
	I2C1->CR2 &=~0x3F;
	I2C1->CR2|=36;
	//set frequency 100KHz
	I2C1->CCR=180;
	//risetime 1000ns
	I2C1->TRISE &=~0x3F;
	I2C1->TRISE|=37;
	I2C1->CR1|=I2C_CR1_PE; //I2C on
	NVIC_EnableIRQ(TIM3_IRQn); //enable global interrupts
	while(1)
    {
    }
}	

 

Изменено пользователем ilya_orel00
Ссылка на комментарий
Поделиться на другие сайты

55 minutes ago, BARS_ said:

Одна кнопка в Keil

Кайло-то для профессионала? Ну-ну...

55 minutes ago, BARS_ said:

Есть такая штука - оптимизация

Повесить одновременно работающие CAN, USB, I2C и SPI на одни и те же ноги? Ну-ну..

56 minutes ago, BARS_ said:

а я отлаживал USB как раз через SWD.

Без понятия. Я никогда в жизни gdb не использовал. И как-то не вижу смысла в этом. Для отладки есть более удобные методы.

52 minutes ago, ilya_orel00 said:

Ситуация не меняется

Ну кто же в прерывание таймера запихивает жирнючую передачу данных по I2C?

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

Тогда ищи STLink и смотри под отладчиком, где виснет. Ибо у тебя даже проверки ошибок I2C нет .

5 минут назад, Eddy_Em сказал:

Кайло-то для профессионала?

А что они нынче используют, куб? И чем же так плох кеил? Тем, что работает из коробки и поддерживает полнофункциональную отладку?

 

5 минут назад, Eddy_Em сказал:

одновременно работающие CAN, USB, I2C и SPI на одни и те же ноги?

Интерфейсы при всем желании не займут все ноги МК.

 

5 минут назад, Eddy_Em сказал:

Для отладки есть более удобные методы.

Ну так опишите их.

 

5 минут назад, Eddy_Em сказал:

кто же в прерывание таймера запихивает жирнючую передачу данных по I2C?

В случае приведенного выше кода пихать туда можно все что угодно.

Изменено пользователем BARS_
Ссылка на комментарий
Поделиться на другие сайты

3 minutes ago, BARS_ said:

чем же так плох кеил?

а) проприетарное дерьмо, б) работает только под мастдайкой.

3 minutes ago, BARS_ said:

Интерфейсы при всем желании не займут все ноги МК.

Зато есть уйма GPIO всяких разных. Конкретно в этом случае: три таймера, читающих энкодеры, три таймера, генерирующих CLK для шаговика, всякие GPIO для ~EN, DIR и т.п. Это невозможно "оптимизировать", если что.

4 minutes ago, BARS_ said:

Ну так опишите их.

Дрыгать ногой, выдавать тестовые сообщения и т.п. Я вот USB отлаживал через USART1: сделал буфер пожирней, настроил его на 3Мбод и смотрел, что там у меня происходит, когда был затык с этими дурацкими регистрами (додумались же в один регистр пихать флаги с разной реакцией).

 

2 minutes ago, ilya_orel00 said:

выдача кода будет не с частотой 1 кГц

Достаточно в прерывании таймера выставлять флаг, а в суперлупе выдавать код! Либо настроить выдачу по DMA, а таймер пусть инициирует передачу. Но так делать нельзя. Оно разве что в хеллоуворлде будет работать.

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

Для начала напишите элементарный код, который в цикле в суперлупе будет что-нибудь по I2C отправлять. Учтите все тонкости errata. [url=https://github.com/eddyem/stm32samples/blob/master/F1-nolib/I2Cscan/i2c.c#L120]Вот, например[/url] - работающий код. У STM32F103 I2C очень кривой: если какую-нибудь тонкость пропустить, ничего работать не будет.

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

@Eddy_Em пробовал так. Не работает. Дело в том, что сама конструкция вывода по I2C верная. Мы абсолютно такую же проверяли для вывода рандомного напряжения, всё работало. Но там не было таймера

#include "stm32f10x.h"
#include "math.h"
int16_t empty16=0;
float i=0;
int j=0,q=0,i2c1,i2c2,v=0;
void TIM3_IRQHandler(void) //run with the interrupts of TIM3
	{
		//check the end of the rising front
		if(j==4095)
		{
			q=1;
		}
		//check the end of the falling front
		if(j==0)
		{
			q=0;
		}
		//rising front
		if(q==0)
		{
			i+=40.95;
			j=rint(i);
			i2c1=(j>>8)&0xF; //get 1 byte
			i2c2=j&0xFF; //get 2 byte
		}
		//falling front
		if(q==1)
		{
			i-=40.95;
			j=rint(i);
			i2c1=(j>>8)&0xF; //get 1 byte
			i2c2=j&0xFF; //get 2 byte
		}
		v=1;
		TIM3->SR &= ~TIM_SR_UIF; //reset interrupt
  }
int main(void)
{
	RCC->APB2ENR|=(RCC_APB2ENR_IOPBEN); //enable PORTB
	RCC->APB1ENR |=(RCC_APB1ENR_TIM3EN|RCC_APB1ENR_I2C1EN); //enable TIM3, I2C
	GPIOB->CRL|=0x66444444; //set PB6, PB7 2MHz, open drain; 
	TIM3->PSC|=0x1C1F;  //prescaler 72MHz/(7199+1)=10KHz
	TIM3->ARR|=0x9; //set frequency 1kHz 10KHz/(9+1)=1kHz
	TIM3->DIER |= TIM_DIER_UIE; //enable interrupt for TIM3
	TIM3->CR1|=TIM_CR1_CEN; //TIM3 on
	//set initial frequency 36MHz
	I2C1->CR2 &=~0x3F;
	I2C1->CR2|=36;
	//set frequency 400KHz
	I2C1->CCR=180;
	//risetime 1000ns
	I2C1->TRISE &=~0x3F;
	I2C1->TRISE|=37;
	I2C1->CR1|=I2C_CR1_PE; //I2C on
	NVIC_EnableIRQ(TIM3_IRQn); //enable global interrupts
	while(1)
	{
		if(v==1)
		{
		I2C1->CR1|=I2C_CR1_START; //start i2c
		while(!(I2C1->SR1 & I2C_SR1_SB)); //check start bit
		I2C1->DR|=0xC1; //adress 0x60
		while(!(I2C1->SR1 & I2C_SR1_ADDR)); //check address bit
		empty16=I2C1->SR2; //empty read
		while(!(I2C1->SR1 & I2C_SR1_TXE)); //check transmitter
		I2C1->DR=i2c1; //send 1 byte of data
		while(!(I2C1->SR1 & I2C_SR1_TXE));
		I2C1->DR=i2c2; //send 2 byte of data
		while(!(I2C1->SR1 & I2C_SR1_TXE));
		while(!(I2C1->SR1 & I2C_SR1_BTF));
		I2C1->CR1|=I2C_CR1_STOP; //stop i2c
		if(empty16<0x1FFF) //delay and use empty16
			 empty16=0x1FFF;
		while(--empty16);
		v=0;
		}
	}
}	



	

 

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

Изменено пользователем ilya_orel00
Ссылка на комментарий
Поделиться на другие сайты

@ilya_orel00 , нельзя тупо ожидать: может, событие вообще не произойдет? Все ожидания надо делать с таймаутом. И проверять ошибки. Хотя, по идее,  такой простой код должен работать. Может, получатель не дает ACK? Что вообще на втором конце шины сидит?

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

32 минуты назад, Eddy_Em сказал:

а) проприетарное дерьмо, б) работает только под мастдайкой.

Еще раз повторю вопрос. В чем он плох для разработки ПО? И какие есть альтернативы с аналогичным функионалом и работающие из коробки.

 

34 минуты назад, Eddy_Em сказал:

Это невозможно "оптимизировать", если что

Элементарно, было бы желание. Уж всякий мусор, типа ~EN, DIR вообще через сдвиговый регистр можно гнать.

 

35 минут назад, Eddy_Em сказал:

Дрыгать ногой, выдавать тестовые сообщения и т.п. Я вот USB отлаживал через USART1: сделал буфер пожирней, настроил его на 3Мбод и смотрел, что там у меня происходит, когда был затык с этими дурацкими регистрами (додумались же в один регистр пихать флаги с разной реакцией).

Ну да, ведь куда удобнее написать гору ненужного кода, чем воткнуть программатор. Особенно если учесть наличие RTT у того же j-link и real time (ну почти, с частотой 2Гц) отображение содержимого переменных, регистров и т.п.

 

Вот тебе рабочая либа под 103 камень. Тут она приделана к EEPROM, но разобраться не проблема, основные функции чтения/записи вынесены.I2C.rar Ну и прикрути мигание диодом к таймеру чтобы вообще было видно, пашет программа или нет.

 

А задание именно использовать внешний ЦАП? Так то у STM есть и встроенный...

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

32 minutes ago, ilya_orel00 said:
GPIOB->CRL|=0x66444444; //set PB6, PB7 2MHz, open drain; 

вот, где собака порылась! Ну нельзя же MAGICK писать, вот так будет понятней:

[code]

GPIOB->CRL = (GPIOB->CRL & ~(GPIO_CRL_CNF6 | GPIO_CRL_CNF7)) |

CRL(6, CNF_AFOD | MODE_NORMAL) | CRL(7, CNF_AFOD | MODE_NORMAL);

[/code]

И да, там должно быть не |=, а строго = (мало ли, что вначале там было)!

В общем, нужно писать GPIOB->CRL = 0xDD000000, например. А в вашем случае ноги настроены как тупые выходы, естественно, ничего не работает.

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

А, ну и настройка ног

		//I2C1
		GPIOB->CRL |= GPIO_CRL_CNF6 | GPIO_CRL_CNF7; 
		GPIOB->CRL |= GPIO_CRL_MODE6 | GPIO_CRL_MODE7; 

 

1 минуту назад, Eddy_Em сказал:

И да, там должно быть не |=, а строго = (мало ли, что вначале там было)!

Нет, не должно. Во-первых состояние регистра есть в даташите, во-вторых, можно и вырубить что-то полезное, тот же SWD. Для B порта, конечно, не актуально, но все же.

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

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

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

  Разрешено использовать не более 75 эмодзи.

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Согласен, очень криво объяснил. Это работа трёх вольтовой линии, просто на диод шотки сдвоенный, на один анод приходит сигнал напрямую с трансформатора, а на второй через дроссель. Вольт/деление 5 вольт в клетке, тайминг по моему 10 МС. Третья фотография это сигнал на катодах уровень земли ровно по центру экрана. Но все линии по итогу в порядке 3.3 в, 5, в, 12 в и -12 в. Нагрузить все линии не могу сразу ,так как тут же выгорают транзисторы (имеется нагрузка 250 ватт по 10 ампер на каждую линию за исключением-12в), поэтому нагружаю 3.3 вольтовую линию на 10 ампер,  подключаю переменный резистор 50 ватт на 15 ом на 5 вольтовую линию и постепенно довожу до той той картины с перекосом (это гдето  50 ватт общее). По поводу микросхемы, вверху имеется скрин где между импульсами проскакивает мини импульс, если так можно сказать, он проскакивает и на одной  и на второй ноге (7,8). Микросхема не tl 494, а lw4933/abx942.1/c9421646. Далее они приходят на базы транзисторов 945g  коллекторы этих транзисторов соединены с  выводами трансформатора. Просто схема типовая, легче мне кажется просто привести фото самого блока, для тех кто разбирается будет гораздо информативне.  Диод шотки по 12 вольтовой линии был подгоревший, заменил на донора. Приводить скрины не буду что бы не захламлять тему. В итоге, пока все так же, при достижении определенной нагрузки суммарно где-то 50 ватт, появляется этот "выброс и перекос". По этому имеются мысли на два варианта, это микросхема , этот мини импульс между периодами, на низкой нагрузке особо не влияет, но при достижении определенной приводит с самовозбуждению входной цепи и непроизвольному открытию транзистора нижнего плеча. Либо дело в "горячей части", плавающий дефект в обвязке силовых ключей.  Спасибо за ответ.
    • @Gomerchik а вы контролировали как меняется уровень сигнала на А1 ардуины?
    • Спасибо за совет. Автором данного проекта я не являюсь, мне нужно было воссоздать уличный датчик для метеостанции взамен пропавшего(( Из разного найденного в интернете этот проект работает с моей станцией Орегон (спасибо автору). В понедельник попробую последовать Вашему совету. Но все равно куча непоняток  как блин это работает)) Если дело в неправильной отправки команды, то как на это влияет подключение датчика температуры? Если совсем не подключать таймер, то передача идет один раз (как и прописано в программе), станция принимает и отображает, но минут через сколько-то естественно станция уже ни чего не показывает, но с таймером питание полностью не пропадает с ардуинки, но передача сигнала каким-то образом работает по таймеру.  В моем понимании данная команда подается один раз потому, что таймер должен отключать питание МК после передачи сигнала и каждые 43 сек снова подавать питание (так того требует станция).  Ардуино передает показания температуры отключается полностью и 43 секунды мк не работает.  Сейчас у меня питание пока сделано на подпитке от солнечной батареи, но пару пасмурных дней и аккумулятор съедается до отключения(
    • thickman Так и сделаю. Вытащу из бу БП.  Буду знать, как отличить. Благодарю. Заменил транзисторы на IRFB20N50K. Картина стала, совсем другой.  Похоже трудность не в драйвере, на момент подвозбуда, переходные процессы, в нем, завершены. Увеличил затворные резисторы до 50ом, стало немного лучше.  Не понятно, почему верхний ключ греется несколько сильнее. Возможно, стоит посмотреть ток в коллекторе.  Снабберные емкости временно удалил, изменений не произошло.  Замена ТГР на другой, на кольце MSTN-16A-TH, так же, результата не принесла.   irfb20n50k.pdf
    • А что нить из ассортимента активных щупов производства СССР..))
    • Типа такого: https://aliexpress.ru/item/2044864227.html?sku_id=58855020183
×
×
  • Создать...