Search the Community
Showing results for tags 'stm32f1'.
-
Есть плата, на которой находятся MCP348 и STM32F103T8U6. К MCP подключается термопара, стмка должна собирать преобразованные данные с MCP через интерфейс I2C и обрабатывать данные. Я застрял на моменте сбора данных. Написал функции для общения стм и mcp, но в ответ получаю это: При этом не важно какой канал выбран и к какому каналу подключена термопара. Функция main: int main(void) { Configure_GPIO_LED(); Configure_GPIO_I2C1(); Configure_I2C1_Master(); Configure_SysTick(); reg_conf = CONFIG_REG(1, 3, 1, 0, 0); while (1) { I2C_write_MCP(DA3_1_ADDR, reg_conf); delay(50); I2C_read_MCP(DA3_1_ADDR); delay(50); } } Функция чтения: void I2C_read_MCP(uint8_t slave_addr) { I2C1->CR1 |= I2C_CR1_START; while(!(I2C1->SR1 & I2C_SR1_SB)); I2C1->DR = (uint8_t)(DEVICE_CODE | (slave_addr << 1) | MODE_READ); while(!(I2C1->SR1 & I2C_SR1_ADDR)); for(int i = 0; i < 3; i++) { while(!(I2C1->SR1 & I2C_SR1_RXNE)); output[i] = I2C1->DR; } I2C1->CR1 |= I2C_CR1_STOP; } Функция записи: void I2C_write_MCP(uint8_t slave_addr, uint8_t data) { I2C1->CR1 |= I2C_CR1_START; while(!(I2C1->SR1 & I2C_SR1_SB)); I2C1->DR = (uint8_t)(DEVICE_CODE | (slave_addr << 1) | MODE_WRITE); while(!(I2C1->SR1 & I2C_SR1_TXE)); delay(1); I2C1->DR = data; while(!(I2C1->SR1 & I2C_SR1_TXE)); I2C1->CR1 |= I2C_CR1_STOP; } Функция настройки модуля I2C: void Configure_I2C1_Master(void) { RCC->APB1ENR |= RCC_APB1ENR_I2C1EN; I2C1->CR1 &= ~I2C_CR1_SMBUS; I2C1->CR2 |= 48; I2C1->CCR &= ~I2C_CCR_CCR; I2C1->CCR |= 120; I2C1->CCR |= I2C_CCR_FS; I2C1->TRISE = 24; I2C1->CR1 |= I2C_CR1_PE; } Подскажите, в чем может быть проблема? Или что я делаю не так.
-
Добрый день. Пытаюсь собрать тахометр на stm32f100c8t6b. Вывод информации - четырехразрядный семисегментный индикатор, счетчик - таймер №1, 1ый канал. На системном таймере висит индикация показаний. Вычисление оборотов - в обработчике таймера 1. Проблема в том, что при подаче импульсов на PB13 (Tim1 Ch1) не происходит прерывания. Скажите, пожалуйста, что я упускаю из виду. Заранее большое спасибо. Taho_2.rar
-
Добрый день. Пытаюсь разобраться с таймерами в stm32f10x (stm32f100c8t6b), на просторах всего русскоязычного интернета есть примеры практически под все таймеры кроме TIM1, который как раз меня и интересует. Собрал проект, работающий с другими таймерами, например TIM3, пытаюсь переделать для TIM1, выскакивает ошибка в строке NVIC_EnableIRQ(TIM1_IRQn); (строки 36, 43, 98) - error: 'TIM1_IRQn' undeclared (first use in this function). Если я правильно понял, то компилятор не понимает, что такое TIM1_IRQn (хотя с TIM3_IRQn все в порядке). Полез в библиотеки, там написано , что полный список источников, которые могут вызывать прерывания, описан в stm32f10x.h stm32f10x.c. Списка, где хотя бы упоминались TIM3_IRQn и прочие, к сожалению, не обнаружил ни в одной подключаемой библиотеке. Среда CoIDE. Проект прикладываю к сообщению. Вопрос заключается в следующем - как в стандартной библиотеке называется источник прерывания от TIM1 и где это можно посмотреть. Заранее большое спасибо. TIM_3.rar
-
Здравствуйте. Подскажите пожалуйста, как выйти из режима STOP по прерыванию от UART. Если можно с примером. Спасибо.
-
Пытаюсь разобраться с 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 клинит. В чём может быть проблема? Аппаратная часть исправна - прошивки с использованием готовых библиотек на этой плате работают нормально.