Jump to content

Search the Community

Showing results for tags 'stm32f103'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Вопрос-Ответ. Для начинающих
    • Песочница (Q&A)
    • Дайте схему!
    • Школьникам и студентам
    • Начинающим
    • Паяльник TV
    • Обсуждение материалов с сайта
    • Competition 2019
  • Радиоэлектроника для профессионалов
    • Световые эффекты и LED
    • Роботы и модели на ДУ-управлении
    • Автоматика
    • Самодельные устройства к компьютеру
    • Программное обеспечение
    • Автомобильная электроника
    • Системы охраны и наблюдения. Личная безопасность
    • Питание
    • Электрика
    • Промышленная электроника
    • Ремонт
    • Металлоискатели
    • Измерительная техника
    • Мастерская радиолюбителя
    • Сотовая связь
    • Спутниковое ТВ
    • КВ и УКВ радиосвязь
    • Жучки
    • Телефония и фрикинг
    • Высокое напряжение
    • Идеи и технологии будущего
    • Справочная радиоэлементов
    • Литература
    • Разное
  • Аудио
    • FAQ, Технологии и компоненты
    • Для начинающих
    • Источники звука
    • Предусилители, темброблоки, фильтры
    • Питание аудио аппаратуры
    • Усилители мощности
    • Акустические системы
    • Авто-аудио
    • Ламповая техника
    • Гитарное оборудование
    • Прочее
  • Микроконтроллеры
  • Товары и услуги
  • Разное
  • Переделки's ATX->ЛБП
  • Переделки's разные темы
  • Киловольты юмора's Юмор в youtube
  • Радиолюбительская доска объявлений exDIY's Надежность и группы продавцов

Blogs

There are no results to display.

There are no results to display.

Marker Groups

  • Пользователи форума

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


ICQ


Skype


Интересы


Город


Сфера радиоэлектроники


Оборудование

Found 8 results

  1. Доброго времени суток, товарищи, пытаюсь создать функции передачи по spi с использованием cmsis и прерываний. Раньше пользовался HAL на "полу- интуитивном" уровне. Все работало. Сейчас пытаюсь все писать только на cmsis и вот возникла проблема... Я попытался сделать две функции ( Отправка по SPI - 8-битного массива и передача 8 битная DFF = 0 и отправка 16 битного массива и передача 16 бит DFF =1 и все это через прерывания)Результат смотрю анализатором и вот в чем проблема... если сначала идет функция передачи 8 битная а потом 16 битная то мелькает лишняя передача, 8 бит 0x00 и потом идет правильная передача, 16 битная. Не могу понять откуда берется эта передача??? (0xAA 0xBB 0xCC 0x00 0xDD 0xDD 0xEE 0xEE 0xFF 0xFF) , если поставить передачи 8 бит 16 бит 8 бит 16 бит то получается вот это (0xAA 0xBB 0xCC 0x00 0xDD 0xDD 0xEE 0xEE 0xFF 0xFF 0xAA 0xBB 0xCC 0xFE 0xDD 0xDD 0xEE 0xEE 0xFF 0xFF), если между функциями вставить задержку 1 мс то все ок иначе тот результат о котором писал ..."головной убор Михаила Боярского" void SPI1_STM32F1_init(void) { // --- Инициализация порта для работы spi --- // ------ Настраиваем порт А -------------------------------------------------------------------------- RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; //--- Включаем тактирование порта А RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; //--- Включаем тактирование альтернативных функции RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; //--- Включаем тактированние SPI1 // ---------------------------------------------------------------------------------------------------- GPIOA->CRL &= ~(GPIO_CRL_CNF5|GPIO_CRL_CNF7|GPIO_CRL_MODE5|GPIO_CRL_MODE7); //--- Обнуление первоначальных параметров порта GPIOA->CRL |= ( GPIO_CRL_MODE5 // --- |Настройка вывода SCL, на работу в режиме альтернативной функции |GPIO_CRL_CNF5_1 // --- |режим output mode 11b - max 50 Мгц, CNF = 10b Альтернативная функция output push-pull ) |GPIO_CRL_MODE7 // --- |Настройка вывода MOSI |GPIO_CRL_CNF7_1 // --- | ); // ---------------------------------------------------------------------------------------------------- GPIOA->CRL &= ~(GPIO_CRL_CNF6|GPIO_CRL_CNF6); GPIOA->CRL |= GPIO_CRL_MODE6; SPI1->CR1 |= SPI_CR1_BIDIMODE; // --- BIDIMODE режим работы (1 - одна линия, 0 - две линии связи) SPI1->CR1 |= SPI_CR1_BIDIOE; // --- BIDIOE Этот бит в сочетании с битом BIDImode выбирает направление передачи в двунаправленном режиме // --- 0: Output disabled (receive-only mode) // --- 1: Output enabled (transmit-only mode) SPI1->CR1 &=~SPI_CR1_CRCEN; // --- Аппаратный расчет CRC включить // --- 0: расчет CRC отключен // --- 1: Расчет CRC включен SPI1->CR1 &= ~SPI_CR1_CRCNEXT; // --- Следующая передача данных будет завершаться CRC-кодом. // --- 0: Этап передачи данных // --- 1: Следующая передача завершится передачей RCR SPI1->CR1 &= ~SPI_CR1_DFF; // --- Формат кадра данных // --- 0: Размер кадра передачи 8 бит // --- 1: Размер кадра передачи 16 бит SPI1->CR1 &= ~SPI_CR1_RXONLY; // --- Этот бит совместно с BIDIMODE выбирает направление передачи в 2-х проводном (MISO и MISO) режиме. // --- 0: Full duplex — передача и прием // --- 1: Output disabled — только прием SPI1->CR1 |= SPI_CR1_SSM; // --- Программное управление ведомым устройством. Когда бит SSM установлен, сигнал NSS заменяется значением бита SSI. // --- 0: Программное управление ведомым отключено // --- 1: Программное управление ведомым включено SPI1->CR1 |= SPI_CR1_SSI; // --- Внутренний выбор ведомого. Этот бит работает только когда бит SSM установлен. Значение этого бита принудительно подается на NSS, а значение IO вывода NSS игнорируется. // --- 1: (Master) Заменяет значение на выводе NSS // --- 0; (Slave) SPI1->CR1 &= ~SPI_CR1_LSBFIRST;// --- Формат кадра // --- 0: MSB передается первым // --- 1: LSB передается первым SPI1->CR1 |= SPI_CR1_BR; // --- BR[2:0]: Выбор скорости передачи // 000: fPCLK/2 // 001: fPCLK/4 // 010: fPCLK/8 // 011: fPCLK/16 // 100: fPCLK/32 // 101: fPCLK/64 // 110: fPCLK/128 // 111: fPCLK/256 //#define SPI_CR1_BR_Pos (3U) //#define SPI_CR1_BR_Msk (0x7U << SPI_CR1_BR_Pos) /*!< 0x00000038 */ //#define SPI_CR1_BR SPI_CR1_BR_Msk /*!< BR[2:0] bits (Baud Rate Control) */ //#define SPI_CR1_BR_0 (0x1U << SPI_CR1_BR_Pos) /*!< 0x00000008 */ //#define SPI_CR1_BR_1 (0x2U << SPI_CR1_BR_Pos) /*!< 0x00000010 */ //#define SPI_CR1_BR_2 (0x4U << SPI_CR1_BR_Pos) /*!< 0x00000020 */ SPI1->CR1 |= SPI_CR1_MSTR; // --- Выбор режима работы SPI: Master/Slave // --- 0: Режим Slave (ведомый) // --- 1: Режим Master (ведущий) SPI1->CR1 &= ~SPI_CR1_CPOL; // --- Полярность тактового сигнала // --- 0: CK в 0 при простое // --- 1: CK в 1 при простое SPI1->CR1 &= ~SPI_CR1_CPHA; // --- Фаза тактового сигнала // --- 0: Первый переход тактового сигнала является краем захвата данных // --- 1: Второй переход тактового сигнала является краем захвата данных SPI1->CR2 &= ~SPI_CR2_TXEIE; // --- Прерывание опустошения буфера передачи данных Tx // --- 0: Прерывание TXE запрещено // --- 1: Прерывание TXE разрешено. Используется для генерации прерывания когда устанавливается флаг TXE SPI1->CR2 &= ~SPI_CR2_RXNEIE; // --- Прерывание не пустого буфера приема Rx // --- 0: Прерывание RXNE запрещено // --- 1: Прерывание RXNE разрешено. Используется для генерации прерывания когда устанавливается флаг RXNE. SPI1->CR2 &= ~SPI_CR2_ERRIE; // --- Прерывание при возникновении ошибок передачи. Этот бит контролирует генерацию прерывания при возникновении одной из ошибок интерфейса SPI (CRCERR, OVR, MODF). // --- 0: Прерывание при возникновении ошибок запрещено // --- 1: Прерывание при возникновении ошибок разрешено SPI1->CR2 |= SPI_CR2_SSOE; // --- Разрешить выход SS // --- 0: Выход SS отключен в режиме master (ведущий) и есть возможность работать в multimaster режиме // --- 1: Выход SS включен в режиме master (ведущий), при этом нет возможности работать в multimaster режиме SPI1->CR2 &= ~SPI_CR2_TXDMAEN; // --- Когда этот бит установлен, запрос DMA возникает при установке флага TXE // --- 0: Tx buffer DMA disabled // --- 1: Tx buffer DMA enabled SPI1->CR2 &= ~SPI_CR2_RXDMAEN; // --- Когда этот бит установлен, запрос DMA возникает при установке флага RXNE // --- 0: Rx buffer DMA disabled // --- 1: Rx buffer DMA enabled SPI1_Enable; NVIC_EnableIRQ(SPI1_IRQn); } void SPI1_STM32F1_write_8bit_irq(uint8_t *data, int32_t len_8bit) { if(len_8bit<=0) return; //Ждем, пока SPI освободится от предыдущей передачи while(SPI1->SR & SPI_SR_BSY)) ; SPI1->CR1 &= ~SPI_CR1_SPE; SPI1->CR1 &= ~SPI_CR1_DFF; SPI1->CR1 |= SPI_CR1_SPE; //Настройка переменных, которые будут //использоваться в обработчике прерывания SPI tx_index_8_bit = 0; tx_len_8_bit = len_8bit; tx_data_8_bit = data; //Разрешаем прерывание TXEIE И запускаем обмен SPI1->CR2 |= SPI_CR2_TXEIE; } void SPI1_STM32F1_write_16bit_irq(uint16_t *data, int32_t len_16bit) { if(len_16bit<=0) return; //Ждем, пока SPI освободится от предыдущей передачи while(SPI1->SR & SPI_SR_BSY) ; SPI1->CR1 &= ~SPI_CR1_SPE; SPI1->CR1 |= SPI_CR1_DFF; SPI1->CR1 |= SPI_CR1_SPE; //Настройка переменных, которые будут //использоваться в обработчике прерывания SPI tx_index_16_bit = 0; tx_len_16_bit = len_16bit; tx_data_16_bit = data; //Разрешаем прерывание TXEIE И запускаем обмен SPI1->CR2 |= SPI_CR2_TXEIE; } void SPI1_IRQHandler(void) { if ((SPI1->CR1&SPI_CR1_DFF) == 0) { SPI1->DR = tx_data_8_bit[tx_index_8_bit]; //Записываем новое значение в DR tx_index_8_bit++; //увеличиваем счетчик переданных байт на единицу //если все передали, то отключаем прерывание, //тем самым завершаем передачу данных if(tx_index_8_bit >= tx_len_8_bit) SPI1->CR2 &= ~(SPI_CR2_TXEIE); } else { SPI1->DR = tx_data_16_bit[tx_index_16_bit]; //Записываем новое значение в DR tx_index_16_bit++; //увеличиваем счетчик переданных байт на единицу //если все передали, то отключаем прерывание, //тем самым завершаем передачу данных if(tx_index_16_bit >= tx_len_16_bit) SPI1->CR2 &= ~(SPI_CR2_TXEIE); } } ............. uint8_t data_8bit[3] = { 0xAA, 0xBB, 0xCC}; uint16_t data_16bit[3] = { 0xDDDD, 0xEEEE, 0xFFFF}; int main(void) { SPI1_STM32F1_write_8bit_irq( data_8bit, 3); //LL_mDelay(1); SPI1_STM32F1_write_16bit_irq( data_16bit, 3); //LL_mDelay(1); SPI1_STM32F1_write_8bit_irq( data_8bit, 3); //LL_mDelay(1); SPI1_STM32F1_write_16bit_irq( data_16bit, 3); }
  2. Решил разобраться с модулем компаса GY-271 - одним из немногих модулей, которые вообще сумел найти. Пол-интернета заполнены утверждениями что собран данный модуль на микросхеме HMC5883L, которая общается по I2C и отзывается на адрес 0x1E (соответственно, 0x3C/0x3D для записи и чтения). На практике же посылка этого адреса натыкалась на глухой таймаут, мол знать не знаем такого адреса, и вообще мы не оно. Целенаправленные, но больше случайные поиски по интернету дали наводку что данное чудо техники, возможно, отзовется на адрес 0x0D (0x1A/0x1B для записи и чтения) и действительно, по такому адресу удалось добиться ответа, правда не совсем того, что ожидалось. К примеру, без "шаманской" (опять же, советы из "Всезнающего") записи единицы по адресу 9, ответ был нулевым. Потом более-менее осмысленные данные появились, но не с адреса 0x03, как положено по даташиту, а вовсе даже с 0x00. Очередная случайная находка дала направление, что заботливые китайцы запаяли на плату не HMC5883L, а вовсе даже QMC5883L - совсем другую микросхему с другими регистрами. И вот она действительно похожа по настройкам и адресу. Стал бы я создавать тему, если бы все было так хорошо... Хотя ответ от микросхемы и есть, как-то он слабо похож на нормальные данные. Теоретически, в регистрах 1:0, 3:2, 5:4 должны быть проекции магнитного поля на оси X, Y, Z. То есть вдали от магнитов и массивных железяк, геометрическая сумма значений должны быть примерно 0.5 Гс, то есть ~32000 единиц модуля, причем пока модуль лежит на столе, сильно меняться значениям не с чего. Привожу лог снятых данных (во вложении исходный код прошивки: вся работа с периферией идет руками, без автоконфигураторов и тому подобного). За все время съема этого лога модель лежал на столе в одном положении, но данные по осям скачут достаточно произвольным образом. I2C test FB FF 0A 00 14 00 00 A8 F5 0D 00 01 01 00 Write 0F 00 05 00 F1 FF 04 99 F5 | 15 5 -15 2337 FB FF 00 00 05 00 00 9A F5 | -5 0 5 2338 0F 00 05 00 00 00 00 8F F5 | 15 5 0 2327 E2 FF 00 00 F6 FF 00 93 F5 | -30 0 -10 2331 28 00 F6 FF FB FF 00 90 F5 | 40 -10 -5 2328 05 00 FB FF FB FF 00 99 F5 | 5 -5 -5 2337 00 00 00 00 00 00 00 97 F5 | 0 0 0 2335 00 00 0F 00 D6 FF 00 99 F5 | 0 15 -42 2337 32 00 E2 FF 00 00 00 94 F5 | 50 -30 0 2332 E7 FF EC FF 00 00 00 97 F5 | -25 -20 0 2335 05 00 F6 FF 00 00 04 92 F5 | 5 -10 0 2330 Продублирую код чтения регистра (насколько я знаю, он довольно типичный, но мало ли...). Естественно, код писался в первую очередь под конкретную задачу - оптимизация будет потом, если оно вообще заработает. void I2C_Read(uint8_t device, uint8_t addr, uint8_t *buf, uint8_t count){ //start I2C2->CR1 |= I2C_CR1_START; while(!(I2C2->SR1 & I2C_SR1_SB)){} (void) I2C2->SR1; //device I2C2->DR = (device<<1) &~(1<<0); while(!(I2C2->SR1 & I2C_SR1_ADDR)){} (void) I2C2->SR1; (void) I2C2->SR2; //addr I2C2->DR = addr; while(!(I2C2->SR1 & I2C_SR1_TXE)){} I2C2->CR1 |= I2C_CR1_STOP; //restart I2C2->CR1 |= I2C_CR1_START; while(!(I2C2->SR1 & I2C_SR1_SB)){} //device I2C2->DR = (device<<1) | (1<<0); while(!(I2C2->SR1 & I2C_SR1_ADDR)){} (void) I2C2->SR1; (void) I2C2->SR2; //data for(uint8_t i=0; i<count-1; i++){ //I2C2->CR1 &=~ I2C_CR1_ACK; I2C2->CR1 |= I2C_CR1_ACK; while(!(I2C2->SR1 & I2C_SR1_RXNE)){} buf[i] = I2C2->DR; } I2C2->CR1 &=~I2C_CR1_ACK; while(!(I2C2->SR1 & I2C_SR1_RXNE)){} buf[count-1] = I2C2->DR; //stop I2C2->CR1 |= I2C_CR1_STOP; } #define QMC5883L 0x0D I2C_Read(QMC5883L, 0, data, 14); for(uint8_t i=0; i<14; i++){ UART_HEX(data[i]); UART_putc(USART, ' '); } data[0] = 0x80; I2C_Write(QMC5883L, 10, data, 1); data[0] = 0x01; I2C_Write(QMC5883L, 0x0B, data, 1); data[0] = (0b00<<6) | (0b00<<4) | (0b11<<2) | (0b01<<0); //oversampling = 512 //range = 2 G //ODR = 200 Hz //mode = continuous I2C_Write(QMC5883L, 9, data, 1); UART_puts(USART, "Write\x0d\n"); while(1){ I2C_Read(QMC5883L, 0, data, 9); for(uint8_t i=0; i<9; i++){ UART_HEX(data[i]); UART_putc(USART, ' '); } i16a x,y,z,t; x.u8val[0] = data[0]; x.u8val[1] = data[1]; y.u8val[0] = data[2]; y.u8val[1] = data[3]; z.u8val[0] = data[4]; z.u8val[1] = data[5]; t.u8val[0] = data[7]; t.u8val[1] = data[8]; t.ival += 3000+2000; sprintf(str,"| %i %i %i %i", x.ival, y.ival, z.ival, t.ival); UART_puts(USART, str); Собственно, вопрос: что я делаю не так и как сделать так, чтобы модуль отдавал правильные данные магнитного поля? compass.rar
  3. Здравствуйте, в силу поставленных передо мной ограничений (на плате нет внешнего резонатора), я вынужден пытаться запустить STM32F103 от внутреннего тактирования, да ещё и под 72МГц. Правильный ли код? RCC_DeInit(); //Сброс RCC_HSEConfig(RCC_HSE_OFF); //Выключение внешнего тактирования (на всякий случай) RCC_PLLConfig( RCC_PLLSource_HSI_Div1, RCC_PLLMul_9); //использование множителя 9 для получения 72МГц, но компилятор ругается на делитель Div1 Дескать, минимум можно использовать Div2, а совсем без делителя нельзя, как ещё можно выставить множитель? RCC_PLLCmd( ENABLE); //Включение PLL как такового RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK); //Использование PLL в качестве основного источника тактирования Вышеперечисленная шняга будет вызываться в мэйне, но это совсем другая история, пока что с этим туплю.
  4. День добрый! Кто работал с такой памятью?? Проблема у меня следующая: Считывать массив получается , но иногда он считывается как ноли. Писать весь массив (больше одной страницы) тоже не получается, записывается в лучшем случае 2 страницы (64байта) остальной массив остается со старыми данными. Но вот если писать страницы по отдельности. Например записать во вторую страницу что то , или в третью и т.д. - то все нормально . Как я пишу: 1) отправляю команду на откл.защиты от записи 2) отправляю команду что я хочу записать по адресу 0 3) потом пишу 32 байта далее идет задержка (пробовал разные) 50мс. повторяю снова 1,2,3 пункты только адрес уже 32. и снова заливаю 32 байта , CS при зтом поднимаю перед первым пунктом после первого и после третьего пункта. Код покажу чуть позже , а то он дома остался.... Кто работал с этой памятью , что я упустил???
  5. Всем привет! Есть необходимость выполнять некоторую функцию по таймеру, для этого вызов функции осуществляется по условию и из бесконечного цикла main, выполнение условия - по флагу, собственно, флаг передергивается в обработчике прерывания по таймеру. Проблема заключается в том, что while (1) { if(flag == 1) // сюда программа попадает один раз, последующие передергивания флага дают результат условия 1, однако код в условии не выполняется // дальше цикл бесконечно крутит, таймер дергает флаг, условие сравнивает, но не пускает { func(); flag = 0; } } Контроллер stm32f103c8. Буду благодарен и постараюсь оперативно уточнять, если вдруг проблема не типовая и нужно более подробное описание!
  6. Пытаюсь разобраться с USB у STM32F103 на низком уровне (т.е. без сторонних библиотек) и столкнулся с проблемой. Мои действия: 1) У меня внешний кварц на 8 МГц. Запускаю PLL на 72 МГц (коэффициент умножения 9, делитель для USB 3). Разумеется, этот процесс состоит из нескольких этапов, однако в результате в регистре RCC->CFGR оказывается значение 0x001DC40A (что помимо прочего обозначает, что PLL успешно выбран как системный источник частоты). Работа USART и SysTick адекватна (частота точно верная). 2) Включаю тактирование USB. Убираю бит PWDN из USB->CNTR. Жду 1 микросекунду (по даташиту нужно для стабилизации источника опорного напряжения), пишу нули в CNTR, BTABLE и ISTR. Разрешаю прерывания USB_FS_WKUP и CAN1_RX0. Пишу в CNTR значение USB_CNTR_RESETM | USB_CNTR_SUSPM | USB_CNTR_WKUPM | USB_CNTR_CTRM. 3) На этом инициализация окончена. Далее приходит прерывание от USB. Причина, определённая из ISTR - RESET. Да, именно это и должно случиться, всё логично. Обнуляю соответствующий флаг прерывания. 4) Настраиваю нулевую конечную точку. В итоге в USB->EP0R оказывается значение 0x3220. По адресу USB_PMA_BASE + 0 оказывается значение 64 (TXADDR для EP0 == 64), по адресу USB_PMA_BASE + 8 оказывается значение 128 (RXADDR для EP0 == 128), по адресу USB_PMA_BASE + 12 оказывается значение 0x8400 (размер буфера приёма для EP0 - 64 байта). 5) Разрешаю работу USB - пишу в USB->DADDR значение 0x80. 6) Выхожу из прерывания. 7) Ожидаю, что мне придёт первый SETUP-пакет, о чём мне скажет прерывание с флагом CTR в регистре ISTR. А оно не приходит. Зато приходит куча прерываний по причине WKUP (я сбрасываю этот флаг, а оно снова приходит). Иногда приходит RESET (у хоста срабатывает таймаут назначения адреса устройству и он устраивает новый сброс), но после него опять куча WKUP. В конце-концов хост забивает на устройство и события прекращаются. Помимо WKUP ещё приходит ESOF. Моя теория: USB-модуль не запускается должным образом и не способен разобрать, что приходит по шине кроме RESET. Передача данных видится им как событие WKUP (которое по сути вызывается любой активностью на линии). Возможно, я забыл что-то инициализировать или же я что-то неправильно настроил и машину состояний USB клинит. В чём может быть проблема? Аппаратная часть исправна - прошивки с использованием готовых библиотек на этой плате работают нормально.
  7. Доброе время суток. Имеется микроконтроллер STM32F103VBT6, на нём заведен ADC1 и используются 6 входных каналов на ножках PA0..PA5. Если в конфигурации установить оцифровку сигнала с пина PA0, то оцифровка проходит успешно, то же самое с пином PA1. Ситуация меняется, если пытаюсь оцифровать PA2..PA5. Считываются нули. Ниже привожу код. Просьба подсказать в чём может быть дело и как это исправить. Канал меняю в строчке ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_1Cycles5);. К примеру, ADC_Channel_2. #include "stm32f10x_rcc.h" #include "stm32f10x_adc.h" #include "stm32f10x_gpio.h" #include "stm32f10x_usart.h" #include "misc.h" #include "delay.h" void SetupUSART(void); void send_to_uart(uint8_t data); void ADC1_2_IRQHandler(void); void Get_Temp(void); uint8_t ind1_B; uint8_t ind2_B; uint8_t ind3_B; uint8_t ind4_B; uint8_t ind5_B; uint8_t ind1_C; uint8_t ind2_C; uint8_t ind3_C; uint8_t ind4_C; uint8_t ind5_C; uint8_t ind1_D; uint8_t ind2_D; uint8_t ind3_D; uint8_t ind4_D; uint8_t ind5_D; uint8_t ind_B; static volatile uint16_t temp=0; int main(void) { SysTick_Config(8000); RCC_APB2PeriphClockCmd(RCC_APB2ENR_AFIOEN, ENABLE); // ?? GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE); //GPIO_PinRemapConfig(GPIO_Remap_USART2, DISABLE); //RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;// ?? //AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE; // ?? disable JTAG GPIO_InitTypeDef GPIO_InitStructure; // PORTA // input RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = /*GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 |*/ GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); // alternative GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); // PORTB // input RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_3 | GPIO_Pin_5 | GPIO_Pin_8; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, &GPIO_InitStructure); // output GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_4 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); // PORTC // input RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOC, &GPIO_InitStructure); // output GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &GPIO_InitStructure); // PORTD // input RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOD, &GPIO_InitStructure); // alternative GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); // PWM output pins GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOD, &GPIO_InitStructure); // PORTE // input RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOE, &GPIO_InitStructure); // output GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOE, &GPIO_InitStructure); SetupUSART(); // TIM4 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); // Clock to PORTD for TIM4 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); // Clock to TIM4 GPIO_PinRemapConfig(GPIO_Remap_TIM4, ENABLE); TIM4->CCER |= (TIM_CCER_CC1E|TIM_CCER_CC2E|TIM_CCER_CC3E|TIM_CCER_CC4E); // Enable all PWM outputs TIM4->CCMR1|= (TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2); //Forward PWM for ch1 TIM4 TIM4->CCMR1|= (TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2); //Forward PWM for ch2 TIM4 TIM4->CCMR2|= (TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2); //Forward PWM for ch3 TIM4 TIM4->CCMR2|= (TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2); //Forward PWM for ch4 TIM4 TIM4->CR1 |= TIM_CR1_CEN; TIM4->CCR1 = 65536/5; // Duty cycle PWM1 (Avr voltage = 1.65 V) TIM4->CCR2 = 65536/4; // Duty cycle PWM2 TIM4->CCR3 = 65536/3; // Duty cycle PWM3 TIM4->CCR4 = 65536/2; // Duty cycle PWM4 // ADC RCC_ADCCLKConfig(RCC_PCLK2_Div8); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; ADC_DeInit(ADC1); ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE); NVIC_Init(&NVIC_InitStructure); ADC_Cmd(ADC1, ENABLE); //ADC_TempSensorVrefintCmd(ENABLE); ADC_ResetCalibration(ADC1); while (ADC_GetResetCalibrationStatus(ADC1)) { }; ADC_StartCalibration(ADC1); while (ADC_GetCalibrationStatus(ADC1)) { }; GPIO_SetBits(GPIOE,GPIO_Pin_1); while(1) { GPIO_SetBits(GPIOC,GPIO_Pin_6); //uint8_t pa2 = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2); //send_to_uart(pa2); //GPIO_SetBits(GPIOB,GPIO_Pin_4); // always 1 /*/chB GPIO_SetBits(GPIOB,GPIO_Pin_6); GPIO_SetBits(GPIOB,GPIO_Pin_4); GPIO_SetBits(GPIOB,GPIO_Pin_7); GPIO_SetBits(GPIOB,GPIO_Pin_9); GPIO_SetBits(GPIOE,GPIO_Pin_0); */ Delay_ms(500); GPIO_ResetBits(GPIOC,GPIO_Pin_6); //GPIO_ResetBits(GPIOB,GPIO_Pin_4); // always 1 /*/chB GPIO_ResetBits(GPIOB,GPIO_Pin_6); GPIO_ResetBits(GPIOB,GPIO_Pin_4); GPIO_ResetBits(GPIOB,GPIO_Pin_7); GPIO_ResetBits(GPIOB,GPIO_Pin_9); GPIO_ResetBits(GPIOE,GPIO_Pin_0); */ Delay_ms(500); ind1_B = GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_6); // ok ind2_B = GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_7); // ok ind3_B = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_3); // ok //(?) always 0 ind4_B = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5); // ok ind5_B = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8); // ok ind1_C = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2); // ok ind2_C = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3); // ok ind3_C = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4); // ok ind4_C = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_6); // ok ind5_C = GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1); // ok ind1_D = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6); // ok ind2_D = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7); // ok ind3_D = GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4); // ok ind4_D = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0); // ok ind5_D = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_7); // ok //send_to_uart(ind1_; //send_to_uart(ind2_; //send_to_uart(ind3_; //send_to_uart(ind4_; //send_to_uart(ind5_; ind_B = 5-(ind1_B+ind2_B+ind3_B+ind4_B+ind5_; switch (ind_ { case 0: GPIO_ResetBits(GPIOB,GPIO_Pin_6); // sel1_B GPIO_ResetBits(GPIOB,GPIO_Pin_4); // sel2_B GPIO_ResetBits(GPIOB,GPIO_Pin_7); // sel3_B GPIO_ResetBits(GPIOB,GPIO_Pin_9); // sel4_B GPIO_ResetBits(GPIOE,GPIO_Pin_0); // sel5_B break; case 1: GPIO_SetBits(GPIOB,GPIO_Pin_6); // sel1_B GPIO_ResetBits(GPIOB,GPIO_Pin_4); // sel2_B GPIO_ResetBits(GPIOB,GPIO_Pin_7); // sel3_B GPIO_ResetBits(GPIOB,GPIO_Pin_9); // sel4_B GPIO_ResetBits(GPIOE,GPIO_Pin_0); // sel5_B break; case 2: GPIO_ResetBits(GPIOB,GPIO_Pin_6); // sel1_B GPIO_SetBits(GPIOB,GPIO_Pin_4); // sel2_B GPIO_ResetBits(GPIOB,GPIO_Pin_7); // sel3_B GPIO_ResetBits(GPIOB,GPIO_Pin_9); // sel4_B GPIO_ResetBits(GPIOE,GPIO_Pin_0); // sel5_B break; case 3: GPIO_ResetBits(GPIOB,GPIO_Pin_6); // sel1_B GPIO_ResetBits(GPIOB,GPIO_Pin_4); // sel2_B GPIO_SetBits(GPIOB,GPIO_Pin_7); // sel3_B GPIO_ResetBits(GPIOB,GPIO_Pin_9); // sel4_B GPIO_ResetBits(GPIOE,GPIO_Pin_0); // sel5_B break; case 4: GPIO_ResetBits(GPIOB,GPIO_Pin_6); // sel1_B GPIO_ResetBits(GPIOB,GPIO_Pin_4); // sel2_B GPIO_ResetBits(GPIOB,GPIO_Pin_7); // sel3_B GPIO_SetBits(GPIOB,GPIO_Pin_9); // sel4_B GPIO_ResetBits(GPIOE,GPIO_Pin_0); // sel5_B break; case 5: GPIO_ResetBits(GPIOB,GPIO_Pin_6); // sel1_B GPIO_ResetBits(GPIOB,GPIO_Pin_4); // sel2_B GPIO_ResetBits(GPIOB,GPIO_Pin_7); // sel3_B GPIO_ResetBits(GPIOB,GPIO_Pin_9); // sel4_B GPIO_SetBits(GPIOE,GPIO_Pin_0); // sel5_B break; } Get_Temp(); unsigned char a = temp>>4; send_to_uart(a); send_to_uart(0xFF); } } void ADC1_2_IRQHandler(void) { if (ADC_GetITStatus(ADC1, ADC_IT_EOC)) { ADC_ClearITPendingBit(ADC1, ADC_IT_EOC); temp = ADC_GetConversionValue(ADC1); } } void Get_Temp(void) { ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_1Cycles5); ADC_SoftwareStartConvCmd(ADC1, ENABLE); } void send_to_uart(uint8_t data) { while(!(USART1->SR & USART_SR_TC)); USART1->DR=data; } void SetupUSART() { RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE); //RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; /* Configure USART1 Tx (PA.09) as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure USART1 Rx (PA.10) as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_DeInit(USART1); USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); }
  8. здраствуйте Хотел бы связать контроллер stm32f103 с программой LabView но незнаю как это сделать. Впринципи я работал с системой сбора данных (такая коробочка ) тут все просто подключил куда нада и все. Так вот как можно наподобии того что выше подключить мк, может быть какнибудь через UART посылать данные в комп, а прогой их дальше обрабатывать?
×
×
  • Create New...