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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

Там же где я вычитал что
Читал где-то что DMA_FLAG выставляется за ранее как только байт положили в регистр.
Было то что в принцепе флаги DMA не ныжны можно из без них определить когда передача завершенна будут. Меня это заинтересовало, а так на ум пришли флаги флаги TXE, RXNE (потому что их постоянно использовал) возник вопрос каким образом.
Никак!!! Это говорит о неправильности кода...
Ну это понятно я хотел узнать в какую сторону копать.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3443
Зарегистрирован: Вт июн 28, 2011 12:11:50
Откуда: Россия,Ставропольский край, ст.Бекешевская

Сообщение rus084 »

при каком входном напряжении порта stm32f4 начинает думать что на нее подали логическую 1 ?
Меня зовут Димон .
Изображение
Изображение
Контактная информация:
Реклама
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Сообщение ut1wpr »

rus084 писал(а):при каком входном напряжении порта stm32f4 начинает думать что на нее подали логическую 1 ?
Ни при каком напряжении на его портах МК думать не начнет. Думать обязан программист. А ответ на этот вопрос лежит в КАЖДОМ PDF на КАЖДЫЙ МК. Достаточно открыть и прочитать. Заодно немного отвлечься и осознать, а что же это такое - "логическая 1"? Нечто непокобелимое или шаткое и безразмерное? :) :)
С уважением,
Виктор.
Друг Кота
Аватара пользователя
Сообщения: 3443
Зарегистрирован: Вт июн 28, 2011 12:11:50
Откуда: Россия,Ставропольский край, ст.Бекешевская

Сообщение rus084 »

тогда проще сделать так:
брать минимальное значение ацп за прошлый период , если текущее значение ацп меньше минимального прошлого значения ацп + х% , генерировать прерывание .
но как это сделать?
ведь контроллер вычисляет еще много чего
Изображение
Вложения
2014-02-20 19_51rpm_0_analog.png
(10.11 КБ) 2116 скачиваний
Меня зовут Димон .
Изображение
Изображение
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Грызет канифоль
Аватара пользователя
Сообщения: 299
Зарегистрирован: Вт июн 15, 2010 07:16:42
Откуда: Иркутск

Сообщение Rimsky »

Здравствуйте друзья.
Инициализировал USART1 (МК STM32F100C4T6) при помощи стандартной библиотеки STDLib

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

	GPIO_InitTypeDef GPIO_InitStruct;
	USART_InitTypeDef USART_InitStructure;


#if !defined REMAP_USART1
	// Включаем тактирование порта А и USART1
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);
	// Настраиваем ногу TxD (PA9) как выход push-pull c альтернативной функцией
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Init(GPIOA, &GPIO_InitStruct);

	GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_10;
	GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOA, &GPIO_InitStruct);

#else
	/** USART1 GPIO Configuration	
		 PB6	 ------> USART1_TX
		 PB7	 ------> USART1_RX
	*/

	/*Enable or disable APB2 peripheral clock */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1, ENABLE);

	/*Configure GPIO pin */
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(GPIOB, &GPIO_InitStruct);

	/*Configure GPIO pin */
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(GPIOB, &GPIO_InitStruct);

	/*Configure peripheral I/O remapping */
	GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
#endif	
	USART_StructInit(&USART_InitStructure);
	USART_InitStructure.USART_BaudRate = 9600;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_Parity = USART_Parity_No ;
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_Init(USART1, &USART_InitStructure);

	/* Enable the USART1 */
	USART_Cmd(USART1, ENABLE);

	/* Enable USART1 Receive and send interrupts */
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);     
	USART_ITConfig(USART1, USART_IT_TC, ENABLE);

	NVIC_EnableIRQ(USART1_IRQn); 			// Разрешение прерывания USART1
Но вот символьная скорость вместо 9600 бод как заказывал, в 2 раза меньше. В чем может быть причина?
Контактная информация:
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск

Сообщение Chip115 »

Всем привет!
Пишу тут одну программулину.
Понадобилось мне обработать критическую секцию, где нужно отрубить все прерывания.
Пораскинув чем смог пришел к выводу что если есть __enable_irq (); (глобальное разрешение прерывания), то есть и __disable_irq ();. Так вот вопрос, а насколько __disable_irq (); глобально? т.е. если ли прерывания, на которые __disable_irq (); не влияет?
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Контактная информация:
Реклама
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт июл 06, 2012 14:28:17
Откуда: Россия. г.Смоленск

Сообщение The_D »

Rimsky писал(а):Здравствуйте друзья.
Инициализировал USART1 (МК STM32F100C4T6) при помощи стандартной библиотеки STDLib


Но вот символьная скорость вместо 9600 бод как заказывал, в 2 раза меньше. В чем может быть причина?
Подробнее можно о обвязке камешка? Кварц какой использовали? Делители подбирали?
И как выяснили что скорость меньше?
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

Rimsky, даже как-то не верится - apbclock для расчета битрейта берется из текста и автоматически все делители учитываются..
Единственное объяснение - в тексте стоит кварц на 8, а физически стоит 4.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

urry, неизвестно как тактовая настроена . Судя по юзанью SPL - методом тыка ...
Прорезались зубы
Аватара пользователя
Сообщения: 232
Зарегистрирован: Вт май 08, 2012 10:42:29

Сообщение optima »

Добрый день! имеется прерывание

Изображение

По выходу из которого я запрещаю его! но вываливаясь из него оно автоматический становится разрешенным!
можно ли это как то вылечить?
Друг Кота
Аватара пользователя
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск

Сообщение Леонид Иванович »

Флаг нужно сбрасывать записью единицы: EXTI->PR |= EXTI_PR_PR21 или просто EXTI->PR = EXTI_PR_PR21, другие флаги не изменятся.
Контактная информация:
Прорезались зубы
Аватара пользователя
Сообщения: 232
Зарегистрирован: Вт май 08, 2012 10:42:29

Сообщение optima »

Да нет флаг нужно сбросить 0, при срабатывании прерывания флаг становится в 1
С проблемой уже разобрался отладка IDE глючила!
Друг Кота
Аватара пользователя
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск

Сообщение Леонид Иванович »

Флаги в регистре EXTI->PR сбрасываются записью единицы. Можно, конечно, написать и EXTI->PR &= EXTI_PR_PR21, но лучше просто EXTI->PR = EXTI_PR_PR21.
Последний раз редактировалось Леонид Иванович Пн мар 24, 2014 16:20:58, всего редактировалось 1 раз.
Контактная информация:
Прорезались зубы
Аватара пользователя
Сообщения: 232
Зарегистрирован: Вт май 08, 2012 10:42:29

Сообщение optima »

Ну как же Леонид Иванович! если после сброса там итак нули, а когда записывается 1 значит бит установлен!
Изображение
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

PRx: Pending bit on line x (x = 17 to 0)
0: No trigger request occurred
1: selected trigger request occurred
This bit is set when the selected edge event arrives on the external interrupt line.
This bit is cleared by writing a 1 to the bit.

Почитайте что такое rc_w1 ...

read/clear (rc_w1) Software can read as well as clear this bit by writing 1. Writing ‘0’ has no effect
on the bit value.
"Я не даю готовых решений, я заставляю думать!"(С)
Прорезались зубы
Аватара пользователя
Сообщения: 232
Зарегистрирован: Вт май 08, 2012 10:42:29

Сообщение optima »

Cпасибо за науку!
Теперь вроде догоняю!
Прорезались зубы
Аватара пользователя
Сообщения: 202
Зарегистрирован: Пн сен 26, 2011 13:48:25
Откуда: Харьков

Сообщение slavokhire5 »

Здравствуйте, уважаемые коты:)
Начал ковыряться с SPI в STM32, пытаюсь отправить байтик от SPI2 (master) к SPI1 (slave). Вылез ворох всяких проблем :))
Вот код (надерган из интернета и местами дополнен моими "светлыми мыслями") :

инициализация обоих SPI
Спойлер

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

void SPI_init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	SPI_InitTypeDef SPI_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

	// SPI2, master_mode
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15 ;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOB, &GPIO_InitStructure);


	//Заполняем структуру с параметрами SPI модуля
	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;	// полный дуплекс
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;					// передаем по 8 бит
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;							// Полярность и
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;						// фаза тактового сигнала
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;							// Управлять состоянием сигнала NSS аппаратно
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;	// Предделитель SCK
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;					// Первым отправляется старший бит
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;						// Режим - слейв
	SPI_Init(SPI2, &SPI_InitStructure);									// Настраиваем SPI2
	//SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,ENABLE);						// Включаем прерывание по приему байта
	SPI_Cmd(SPI2, ENABLE);												// Включаем модуль SPI2....
	NVIC_EnableIRQ(SPI2_IRQn);											// Разрешаем прерывания от SPI2

	SPI_NSSInternalSoftwareConfig(SPI2, SPI_NSSInternalSoft_Set);



	// SPI1_Slave_mode
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_6 ;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	//Заполняем структуру с параметрами SPI модуля
	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //полный дуплекс
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; // передаем по 8 бит
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; // Полярность и
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; // фаза тактового сигнала
	SPI_InitStructure.SPI_NSS = SPI_NSS_Hard; // Управлять состоянием сигнала NSS аппаратно
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32; // Предделитель SCK
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; // Первым отправляется старший бит
	SPI_InitStructure.SPI_Mode = SPI_Mode_Slave; // Режим - слейв
	SPI_Init(SPI1, &SPI_InitStructure); //Настраиваем SPI1
	SPI_I2S_ITConfig(SPI1,SPI_I2S_IT_RXNE,ENABLE); //Включаем прерывание по приему байта
	SPI_Cmd(SPI1, ENABLE); // Включаем модуль SPI1....
	NVIC_EnableIRQ(SPI1_IRQn); //Разрешаем прерывания от SPI1

}
main
Спойлер

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

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_usart.h"
#include "stm32f10x_spi.h"
#include "pereph.h"
#include <stdio.h>

volatile u32 time = 0;

int main(void)
{
	SystemInit();
	SPI_init();

	__enable_irq();			//Глобальное включение прерывания

	
        GPIO_InitTypeDef  GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(GPIOC, &GPIO_InitStructure);

	while (1)
    {
		GPIO_ResetBits(GPIOB,GPIO_Pin_12); //Подаем сигнал CS слейву
		
		SPI2->DR = 0x30;
		while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET) //Передатчик занят?
			; // значит ничего не делаем

		GPIO_SetBits(GPIOB,GPIO_Pin_12); //Снимаем сигнал CS


		GPIO_SetBits(GPIOC, GPIO_Pin_8);

		for (time = 100000; time > 0; time--)
		{
			;
		}
		GPIO_ResetBits(GPIOC, GPIO_Pin_8);
		for (time = 100000; time > 0; time--)
		{
			;
		}
    }
}


//Обработчик прерываний от SPI2
void SPI2_IRQHandler (void)
{
	if (SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE)==SET)
	{
		// Прерывание вызвано приемом байта ?
		uint8_t SPI_master_resive_data = SPI2->DR; //Читаем то что пришло
		SPI_I2S_ClearFlag(SPI2, SPI_I2S_FLAG_RXNE);
	}
}

//Обработчик прерываний от SPI1

void SPI1_IRQHandler (void)
{
	if (SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==SET)
	{
		// Прерывание вызвано приемом байта ?
		uint8_t data = SPI1->DR; //Читаем то что пришло

		SPI1->DR = data + 1; //И отправляем обратно то что приняли
		SPI_I2S_ClearFlag(SPI1, SPI_I2S_FLAG_RXNE);
	}



}


Ну и собственно проблемы:
1) SPI2 шлет байтики исправно (хотя тут тоже непонятно: смотрю осциллографом - вижу что-то похожее на свои 0x30, а в регистре данных 0x0...0FF), но если я разрешаю прерывание по получению байта в SPI2, то сразу после отправления байта попадаю в обработчик прерываний по умолчанию. Пробовал закомментировать инициализацию ног SPI, особо не повлияло
2) SPI1 как-то не хочет эти байтики видеть и в регистре данных исправно пишет нули. Но если ткнуть осциллографом в лапу NSS, данные я получаю один раз и тут же отправляюсь в обработчик прерываний по умолчанию.

Ткните меня носом в мои косяки, если кто увидит:) Камень большой и для меня новый, так что не знаю многих вещей
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

Если не изменяет память... в SPL примерах была именно связка двух SPI...
Зачем изобретать велосипед... запустите и разбирайтесь...
"Я не даю готовых решений, я заставляю думать!"(С)
Прорезались зубы
Аватара пользователя
Сообщения: 202
Зарегистрирован: Пн сен 26, 2011 13:48:25
Откуда: Харьков

Сообщение slavokhire5 »

Проблему с паршивым приемом по SPI1 я решил. На SPI2 (master) был неправильно инициализирован вывод NSS. У меня IF, a нужно Out_PP.
Осталась только проблема с тем, что я висну при разрешении прерывания по приему от SPI1 или SPI2. Может вектор прерывания я не до конца описал? Или он расположен у меня не там?
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
Прорезались зубы
Аватара пользователя
Сообщения: 202
Зарегистрирован: Пн сен 26, 2011 13:48:25
Откуда: Харьков

Сообщение slavokhire5 »

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

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

    NVIC_InitTypeDef NVIC_InitStructure;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

    // SPI3 IRQ Channel configuration
    NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    // SPI2 IRQ channel configuration
    NVIC_InitStructure.NVIC_IRQChannel = SPI2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;		
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			
    NVIC_Init(&NVIC_InitStructure);
и после этого полегчало.
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
Ответить

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