STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="RoboC",url="/forum/viewtopic.php?p=3800264#p3800264"]Чтение BSRR влияет на настройку таймера или на поднятие флага TIM_SR_CC1IF?[/uquote]Нет, но это как грязной лапой потрогать :) Такой код и читать дальше не хочется.

Ошибка в приоритете операций & и ==. Правильно будет

Код: Выделить всё

if((TIM3->SR & TIM_SR_UIF) == TIM_SR_UIF)
или вообще

Код: Выделить всё

if(TIM3->SR & TIM_SR_UIF)

[uquote="WiseLord",url="/forum/viewtopic.php?p=3800329#p3800329"]2) читать BSRR вообще нельзя, а Вы это в обоих случаях делаете?[/uquote]Да можно. Только зачем и что он оттуда прочтёт.

[uquote="WiseLord",url="/forum/viewtopic.php?p=3800329#p3800329"]1) код "поднятия" и "опускания" ножки у Вас в обработчике абсолютно одинаковый,[/uquote]И всё таки он разный.
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 42
Зарегистрирован: Сб янв 05, 2013 21:03:05

Сообщение passer_by »

[uquote="Oxford",url="/forum/viewtopic.php?p=3800305#p3800305"]кварц 4-16mhz, Pll/2 выводиться, SYSCLK должен быть меньше или равно 50 mhz[/uquote]
Не понял.
RCC->CFGR |= RCC_CFGR_MCO_SYSCLK - Выводит установленную вами системную частоту. Не больше не меньше, а именно ту, что вы установили после всех делителей/множетелей, после System Clock Mux на AHB Prescaler.
к примеру параметры RCC->CFGR из stm32f10x.h

Код: Выделить всё

 #define  RCC_CFGR_MCO_SYSCLK                ((uint32_t)0x04000000)        /*!< System clock selected as MCO source */
 #define  RCC_CFGR_MCO_HSI                   ((uint32_t)0x05000000)        /*!< HSI clock selected as MCO source */
 #define  RCC_CFGR_MCO_HSE                   ((uint32_t)0x06000000)        /*!< HSE clock selected as MCO source */
 #define  RCC_CFGR_MCO_PLLCLK_Div2           ((uint32_t)0x07000000)        /*!< PLL clock divided by 2 selected as MCO source */
Добавлено after 12 minutes 37 seconds:
То есть записывая бит в нужный регистр RCC->CFGR вы можете просмотреть (осциллографом или анализатором) верно ли вы настроили всю цепочку делителей/множителей.
Если птичка уже в одном прыжке от тебя, всё-таки побереги свой нос, может она за оконным стеклом???
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4906
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

VladislavS писал(а):И всё таки он разный
Чёрт, только сейчас, хорошо присмотревшись, вижу разницу BS/BR.
Тогда да, код в части GPIO потенциально рабочий, т.к. читается BSRR всегда как нули, но из-за read-modify-write обработчик будет дольше выполняться, что на высоких частотах критично.
Контактная информация:
Мудрый кот
Аватара пользователя
Сообщения: 1795
Зарегистрирован: Ср апр 04, 2012 09:55:53
Откуда: Северодонецк

Сообщение RoboC »

Ошибка в приоритете операций & и ==.
Да можно. Только зачем и что он оттуда прочтёт.
VladislavS спасибо.
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="passer_by",url="/forum/viewtopic.php?p=3800389#p3800389"]RCC->CFGR |= RCC_CFGR_MCO_SYSCLK - Выводит установленную вами системную частоту.[/uquote]Читаем RM, ибо он рулез!
When the System Clock is selected to output to the MCO pin, make sure that this clock
does not exceed 50 MHz (the maximum IO speed).
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 42
Зарегистрирован: Сб янв 05, 2013 21:03:05

Сообщение passer_by »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3800423#p3800423"]Читаем RM, ибо он рулез![/uquote]
:oops: Не попадалось. Работал исключительно с мк до 50мгц.

Добавлено after 27 minutes 8 seconds:
К с тате. Не знаю в какой теме задать вопрос.
Сделал на STM32f042 ЩИМ на таймере с управляемым заполнением импульса для регулировки мощности на нагрузке. Там много еще чего, по этому тактирывал от внутреннего RC-генератора, экономил ножки. ШИМ вывел на оптрон. И с него управление на затвор мосфета. То есть полная развязка по питанию - микруха от одного источника питания, мосфет от другого. Обычную, активную нагрузку регулирует на ура. Стоит подключить коллекторный двигатель (для чего и делалось) все, хана, микруха сходит с ума, выдает какое то случайное заполнение импульса, ну и остальные блоки то же выходят из под контроля. Каких только фильтров ни делал по питанию двигателя ни чего не помогает. Пока грешу на тактовый RC-генератор микрухи, типа нестабильно работает в условиях помех....
Ни кто не сталкивался?
Если птичка уже в одном прыжке от тебя, всё-таки побереги свой нос, может она за оконным стеклом???
Реклама
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

Сообщение Frogfot »

[uquote="passer_by",url="/forum/viewtopic.php?p=3800102#p3800102"][uquote="Frogfot",url="/forum/viewtopic.php?p=3797063#p3797063"]Или как-то можно вывести 72 МГц?[/uquote]На вывод PA8[/uquote]
Бдагодарю, буду знать.

Добавлено after 5 minutes 9 seconds:
Ещё вопросик знатокам - делаю захват значений таймера TIM4 CH4 по внешнему входу PB9 - захваты есть, прерывания идут, но читаю из TIM4->CCR4 и TIM4->CCR3 одни нули. Код инициализации:
Спойлер

Код: Выделить всё

RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;  // Enabled Clock TIM4
	
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN | // Enabled Alternate Function I/O clock
	                RCC_APB2ENR_IOPAEN | // Enabled Clock GPIO A
                  RCC_APB2ENR_IOPBEN | // Enabled Clock GPIO B
	                RCC_APB2ENR_IOPCEN | // Enabled Clock GPIO C
                  RCC_APB2ENR_TIM1EN;  // Enabled Clock TIM1

GPIOB->CRH = GPIO_CRH_CNF9_0;  // PB9  - TIM4/CH4   - Floatinh Input

TIM4->CR1   = 0; // Counter stopped
TIM4->CR2   = 0;
TIM4->PSC   = 36-1; // Input Clock Prescaller - 36 MHz
TIM4->ARR   = 0xFFFF; // TIM4 auto-reload register
TIM4->CCMR1 = 0;
TIM4->CCMR2 = TIM_CCMR2_OC3M_1 | // CC3 channel is configured as input, IC3 is mapped on TI4
            TIM_CCMR2_CC4S_0;  // CC4 channel is configured as input, IC4 is mapped on TI4
TIM4->CCER  = TIM_CCER_CC3E | // Capture 3 enable
                        TIM_CCER_CC4E;  // Capture 4 enable
TIM4->DIER = TIM_DIER_CC3IE | // Capture 3 interrupt enable
	             TIM_DIER_CC4IE;  // Capture 4 interrupt enable

NVIC_SetPriority(TIM4_IRQn, 9);
NVIC_EnableIRQ(TIM4_IRQn); // Enable TIM4 Interrupt
		
TIM4->CR1 |= TIM_CR1_CEN;  // Counter enabled
Добавлено after 2 hours 40 minutes 37 seconds:
Обработчик прерывания:
Спойлер

Код: Выделить всё


// ----------------------------------------------------------------------
void TIM4_IRQHandler (void) // Capture 3, 4 interrupt Flag
{
static u8 CntCCR3=0;
if(TIM4->SR & TIM_SR_CC3IF) // Check Capture 3 interrupt Flag
  {
    TIM4->SR = ~TIM_SR_CC3IF; // Clear Capture 3 interrupt Flag
     if (CntCCR3 <  16) BufCapture3[CntCCR3++] = TIM4->CCR3;
     else if (CntCCR3 >= 16)
    {
	TIM4->CR1 &= ~TIM_CR1_CEN; // Counter disabled
	MakeScreenTIM4();
    }
  }
}
Хорошему коту и в декабре - март :)
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

Сообщение Frogfot »

Сам нашёл косяк - напутал с определением битов - для 3-го канала поставил бит от компара вместо каптура:

Код: Выделить всё

TIM4->CCMR2 = TIM_CCMR2_OC3M_1 | // CC3 channel is configured as input, IC3 is mapped on TI4
            TIM_CCMR2_CC4S_0;  // CC4 channel is configured as input, IC4 is mapped on TI4
Хорошему коту и в декабре - март :)
Открыл глаза
Сообщения: 65
Зарегистрирован: Ср сен 24, 2014 12:30:09

Сообщение Lum1noFor »

Друзья, у кого-нибудь есть макетка STM32F3 Discovery? Свою в 2018 последний раз использовал, а сейчас включаю - не работает ни одна моя программа. Как я выяснил, не заводится ни один осциллятор - ни внешний кварц на 8 МГц, ни внутренний HSI. При этом демо-программа мигалка от ST исправно работает от внешнего кварца. Варианта тут два - или я разучился и что-то забыл, или мой компилятор что-то мозги парит. Компилятор MikroC. Внизу прикрепляю скомпилированный своим компилятором hex - кто-нибудь может попробовать зашить в свою макетку (должен стоять внешний кварц X2)?

Код: Выделить всё

void main() {

RCC_AHBENRbits.IOPAEN = 1; // Enable all ports
RCC_AHBENRbits.IOPBEN = 1;
RCC_AHBENRbits.IOPCEN = 1;
RCC_AHBENRbits.IOPEEN = 1;
RCC_AHBENRbits.IOPEEN = 1;
RCC_AHBENRbits.IOPDEN = 1;

GPIOE_MODERbits.MODER8           = 0b01; // Output
GPIOE_OTYPERbits.OT8             = 0b00; // Push-Pull
GPIOE_OSPEEDRbits.OSPEEDR8       = 0b11; // High speed

GPIOE_MODERbits.MODER15           = 0b01; // Output
GPIOE_OTYPERbits.OT15             = 0b00; // Push-Pull
GPIOE_OSPEEDRbits.OSPEEDR15       = 0b11; // High speed

while (1) {

GPIOE_ODRbits.ODR8 = 1;
GPIOE_ODRbits.ODR15 = 1;

Delay_ms(1000);

GPIOE_ODRbits.ODR8 = 0;
GPIOE_ODRbits.ODR15 = 0;

Delay_ms(1000);

}

}
Вложения
Clock.jpg
(136.7 КБ) 287 скачиваний
TEST.hex
(3.33 КБ) 292 скачивания
Друг Кота
Аватара пользователя
Сообщения: 4906
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

А где в самом коде вся эта настройка тактирования, множителей и т.п.?
Контактная информация:
Открыл глаза
Сообщения: 55
Зарегистрирован: Вс май 03, 2015 15:05:58

Сообщение Feruz »

Здравствуйте! Разрешите ворваться в тему с вопросом по SPI STM32F103C8.
В одной из веток на форуме я задавал вопрос по SI4463, но проблема оказалась в SPI (https://www.radiokot.ru/forum/viewtopic ... 6#p3785086)
Проблема в том, что CS поднимается раньше чем закончилась транзакция по SPI.

Настройка:

Код: Выделить всё

	//SPI registers
	SPI1->CR1 |= SPI_CR1_BR;						//clock/256
	SPI1->CR1 |= SPI_CR1_SSM;
	SPI1->CR1 |= SPI_CR1_SSI;	
	SPI1->CR1 |= SPI_CR1_MSTR;				  //master mode
	SPI1->CR1 &= ~SPI_CR1_CPOL;					//SCK = 0 in IDLE
	SPI1->CR1 &= ~SPI_CR1_CPHA;					//first rising edge capture
	SPI1->CR1 |= SPI_CR1_SPE;						//enable spi	
Транзакция:

Код: Выделить всё

//SPI transaction
uint8_t spi_trx(uint8_t to_send) //transmit and receive 1 byte (no CS management)
{
	while(!(SPI1->SR & SPI_SR_TXE)){} //while TXE bit = 0
	SPI1->DR = to_send;
	while(!(SPI1->SR & SPI_SR_RXNE)){}	//while RXNE = 0	
	
	while(!(SPI1->SR & SPI_SR_TXE)){} //RM 25.3.8
	while(SPI1->SR & SPI_SR_BSY){}    //RM 25.3.8
	
	return SPI1->DR;
}	
Использование:

Код: Выделить всё

m_cs_active
spi_trx(SI4463_CMD_REQUEST_DEVICE_STATE);	
spi_trx(SI4463_BYTE_DUMMY);
m_cs_inactive

Не смотря на ожидание флагов TXE и BSY согласно п. 25.3.8 референс мануала, чип селект упорно поднимается раньше на 1/4 тактового сигнала (см. прикрепление).
Вложения
Снимок.PNG
(18.18 КБ) 331 скачивание
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

Feruz, а если делитель на SPI сделать меньше 64?
Хотя судя по скрину работать все равно должно, CS поднимается после фронта по которому идет захват...
Открыл глаза
Сообщения: 65
Зарегистрирован: Ср сен 24, 2014 12:30:09

Сообщение Lum1noFor »

[uquote="WiseLord",url="/forum/viewtopic.php?p=3803581#p3803581"]А где в самом коде вся эта настройка тактирования, множителей и т.п.?[/uquote]


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

Попробовал вручную указать настройки тактирования - все равно не работает. Внешний кварц не заводится. При этом, подчеркиваю, мигалка-прошивка от ST работает и кварц заводится! Из чего я делаю вывод, что что-то не так именно с программой.

Код: Выделить всё

void main() {

RCC_CRbits.HSION = 1;
RCC_CRbits.PLLON = 0;
RCC_CRbits.CSSON = 0;
RCC_CRbits.HSEBYP = 0;
RCC_CRbits.HSEON = 1;

RCC_CFGR  = 0x0;
RCC_CFGR2 = 0x00000000;

while (1) {

}

}
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Feruz",url="/forum/viewtopic.php?p=3803670#p3803670"]Не смотря на ожидание флагов TXE и BSY согласно п. 25.3.8 референс мануала, чип селект упорно поднимается раньше на 1/4 тактового сигнала (см. прикрепление).[/uquote]Поднимайте CS после RXNE.

[uquote="Lum1noFor",url="/forum/viewtopic.php?p=3803736#p3803736"]Микроси автоматически вставляет в итоговый хекс те настройки, которые указываешь в свойствах проекта.[/uquote]В топку такую среду разработки. Ну есть же вменяемые тулчейны, где абсолютно всё под контролем программиста.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3803769#p3803769"]Поднимайте CS после RXNE.[/uquote]
Он проверяет даже больше необходимого, проблема в другом. Если менять делители для SPI и замерять время между фронтом защелкивающим данные на SCK и поднятием NSS, то оно не меняется, т.е. SPI считает этот фронт окончанием передачи. При относительно небольших делителях все нормально, но если делитель порядка 64 и больше, то уже могут быть проблемы, т.к. фиксированной задержки перед NSS начинает не хватать и он поднимается в середине последнего периода.
Вымогатель припоя
Сообщения: 576
Зарегистрирован: Пт май 19, 2006 05:39:11

Сообщение DimAlt »

Feruz а так пробовали?

Код: Выделить всё

uint8_t spi_trx(uint8_t to_send)
{
//  while((SPI1->SR & SPI_SR_TXE)==0);//ждать освобождения буфера на передачу
    while(SPI1->SR & SPI_SR_BSY);//ждать окончания передачи   
   
    SPI1->DR = to_send;	//запустить передачу байта

    while((SPI1->SR & SPI_SR_RXNE)==0);//ждать "Receive buffer Not Empty" окончание приема
    return  SPI1->DR;//clear SPI_SR_RXNE flag

}
Контактная информация:
Открыл глаза
Сообщения: 55
Зарегистрирован: Вс май 03, 2015 15:05:58

Сообщение Feruz »

[uquote="Reflector",url="/forum/viewtopic.php?p=3803799#p3803799"][uquote="VladislavS",url="/forum/viewtopic.php?p=3803769#p3803769"]Поднимайте CS после RXNE.[/uquote]
Он проверяет даже больше необходимого, проблема в другом. Если менять делители для SPI и замерять время между фронтом защелкивающим данные на SCK и поднятием NSS, то оно не меняется, т.е. SPI считает этот фронт окончанием передачи. При относительно небольших делителях все нормально, но если делитель порядка 64 и больше, то уже могут быть проблемы, т.к. фиксированной задержки перед NSS начинает не хватать и он поднимается в середине последнего периода.[/uquote]

Все верно, когда частота SPI достаточно высока, тогда все нормально и клоки успевают закончится до подъема чип селекта.

Добавлено after 1 minute 27 seconds:
[uquote="DimAlt",url="/forum/viewtopic.php?p=3804006#p3804006"]Feruz а так пробовали?

Код: Выделить всё

uint8_t spi_trx(uint8_t to_send)
{
//  while((SPI1->SR & SPI_SR_TXE)==0);//ждать освобождения буфера на передачу
    while(SPI1->SR & SPI_SR_BSY);//ждать окончания передачи   
   
    SPI1->DR = to_send;	//запустить передачу байта

    while((SPI1->SR & SPI_SR_RXNE)==0);//ждать "Receive buffer Not Empty" окончание приема
    return  SPI1->DR;//clear SPI_SR_RXNE flag

}
[/uquote]

Попробовал. Вообще не работает - ожидание BSY никогда не закончится, так как SPI транзакция ни разу не инициировалась. <- Бред написал. По идее должно работать, но лог анализатор показывает тишину на линиях.
Опытный кот
Аватара пользователя
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Сообщение baghear »

Добрый день, подскажите можно ли использовать один вывод для внешнего прерывания и для счета таймера.
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

Попробуй
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

Сообщение baghear »

Отвечаю, да можно!!!!
Ответить

Вернуться в «ARM»