Поиск сообщества
Показаны результаты для тегов 'STM32F4'.
Найдено: 10 результатов
-
Добрый день! Пытаюсь наладить передачу по SPI данных к дисплею с DMA. Передача работает, дисплей полностью закрашивается, но устанавливается флаг ошибки FIFO в регистрах DMA. МК: STM32F401CEU6 Инициализация //Где-то там alignas(32) uint16_t buff[80 * 160]; // SPI init SPI2->CR1 |= (0b000 << SPI_CR1_BR_Pos) | SPI_CR1_MSTR | SPI_CR1_SSI | SPI_CR1_SSM; SPI2->CR2 |= SPI_CR2_TXDMAEN; SPI2->CR1 |= SPI_CR1_SPE; // DMA init DMA1_Stream4->CR |= (0b01 << DMA_SxCR_DIR_Pos) | (0 << DMA_SxCR_CHSEL_Pos) | (0b11 << DMA_SxCR_MBURST_Pos) | DMA_SxCR_MINC; DMA1_Stream4->PAR = (uint32_t)&SPI2->DR; DMA1_Stream4->M0AR = (uint32_t)getBuffer(); DMA1_Stream4->FCR &= ~DMA_SxFCR_FTH; DMA1_Stream4->FCR |= DMA_SxFCR_DMDIS; __DMB(); DMA1_Stream4->FCR |= (0b11 << DMA_SxFCR_FTH_Pos); Функции отправки void ST7735s::stopScreenUpdate() { DMA1_Stream4->CR &= ~DMA_SxCR_EN; while (DMA2_Stream4->CR & DMA_SxCR_EN) ; CS_Up(); } void ST7735s::startScreenUpdate() { stopScreenUpdate(); sendCommand(ST77XX_RAMWR); CS_Down(); DC_Up(); DMA1->HIFCR = DMA_HIFCR_CFEIF4 | DMA_HIFCR_CHTIF4 | DMA_HIFCR_CTCIF4 | DMA_HIFCR_CTEIF4 | DMA_HIFCR_CDMEIF4; DMA1_Stream4->NDTR = WIDTH * HEIGHT * 2; DMA1_Stream4->CR |= DMA_SxCR_EN; } После передачи устанавливается флаг ошибки работы FIFO-буфера в DMA. Флаг приходится сбрасывать вручную + ненормально это как-то. Ошибка, как-никак. Выдержка из документации 80 пикселей * 160 пикселей * 2 байта = 25 600 байт. Итого, если я правильно понял логику, при размере пакета в 16 кусков, при размере куска = MSIZE = 1 байту, должно всё работать, т.к. конфигурации допустима + 25 600 байт ровно делиться на транзакции по 16 байт. Пробовал менять NDTR - делил на 16, но это не помогло, т.к. надо указать именно количество передаваемых байт. С делением на 16 заполняется лишь 1/16 часть дисплея. Перезаписи (ovverun) тоже нет - все пиксели занимают свои места Ошибок SPI нет Выравнивание сделал с запасом. Пробовал ранее 4 - без результата (Точнее результат - ошибка).
-
Здравствуйте! Имеется плата на основе микрокотроллера stm32f405vg, есть задача получения значения rms(среднеквадратичное значение тока) посредством АЦП ade7953. Данные с АЦП принимаются по SPI(посредством обращения к регистру 0x31a) в массив по типу arr[0] = 0x00, arr[1] = 0x00, arr[2] = 0xB1, arr[3] = 2C. Столкнулся с проблемой перевода этого значения в амперы. В application note к АЦП я нашел формулу, прикреплённых ниже, которая должна решать этот вопрос, но как применить её так и не додумался, прошу знающих помочь. Язык Си
-
Добрый день всем! Столкнулся с проблемой, над решением которой бьюсь уже месяц - суть в том, что при пересылке аудио данных с контроллера в внешний цап на выходе цапа звучит белый шум(именно когда летят данные). Уже перепробовал разные конфигурации и параметры, да даже другой цап ставил - всё равно та же самая проблема. Может кто сталкивался, или у кого есть идеи почему так происходит? Контроллер stm32f407ve китайский, но вроде как рабочий, цап - pcm1606, вытащенный из двд-плеера. код инициализации i2s RCC_PLLI2SCmd(DISABLE); RCC_I2SCLKConfig(RCC_I2S2CLKSource_PLLI2S); RCC_PLLI2SConfig(200,5); RCC_PLLI2SCmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_PLLI2SRDY) == RESET){}; //WS - word clock output GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_SPI2); GPIO_StructInit(&gpioInit); gpioInit.GPIO_Pin = GPIO_Pin_9; gpioInit.GPIO_Mode = GPIO_Mode_AF; gpioInit.GPIO_OType = GPIO_OType_PP; gpioInit.GPIO_PuPd = GPIO_PuPd_NOPULL; gpioInit.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Init(GPIOB, &gpioInit); //BCLK - shift clock output GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_SPI2); gpioInit.GPIO_Pin = GPIO_Pin_10; GPIO_Init(GPIOB, &gpioInit); //SD - serial audio data GPIO_PinAFConfig(GPIOC, GPIO_PinSource3, GPIO_AF_SPI2); gpioInit.GPIO_Pin = GPIO_Pin_3; GPIO_Init(GPIOC, &gpioInit); //MCO - master clock output GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_SPI2); gpioInit.GPIO_Pin = GPIO_Pin_6; GPIO_Init(GPIOC, &gpioInit); I2S_StructInit(&i2sInit); i2sInit.I2S_CPOL = I2S_CPOL_Low; i2sInit.I2S_Mode = I2S_Mode_MasterTx; i2sInit.I2S_MCLKOutput = I2S_MCLKOutput_Enable; i2sInit.I2S_Standard = I2S_Standard_Phillips; i2sInit.I2S_AudioFreq = I2S_AudioFreq_48k; i2sInit.I2S_DataFormat = I2S_DataFormat_24b; I2S_Init(SPI2, &i2sInit); SPI2->I2SPR = (uint16_t)((uint16_t)512 | (uint16_t)12 | (uint16_t)1); //for 48k Fs SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE); I2S_Cmd(SPI2, ENABLE); код инициализации dma DMA_InitTypeDef dmaInit; NVIC_InitTypeDef nvicInit; DMA_DeInit(DMA1_Stream4); DMA_Cmd(DMA1_Stream4, DISABLE); while(DMA_GetCmdStatus(DMA1_Stream4) == ENABLE){}; __ISB(); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE); //To dmaInit.DMA_PeripheralBaseAddr = (uint32_t) &(SPI2->DR); //From dmaInit.DMA_Memory0BaseAddr = (uint32_t)&AUDIO_SAMPLE; dmaInit.DMA_BufferSize = 20480; dmaInit.DMA_Channel = DMA_Channel_0; dmaInit.DMA_DIR = DMA_DIR_MemoryToPeripheral; dmaInit.DMA_PeripheralInc = DMA_PeripheralInc_Disable; dmaInit.DMA_MemoryInc = DMA_MemoryInc_Enable; dmaInit.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; dmaInit.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; dmaInit.DMA_Mode = DMA_Mode_Circular; dmaInit.DMA_Priority = DMA_Priority_High; dmaInit.DMA_FIFOMode = DMA_FIFOMode_Enable; dmaInit.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; dmaInit.DMA_MemoryBurst = DMA_MemoryBurst_Single; dmaInit.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; while(DMA_GetCmdStatus(DMA1_Stream4) == ENABLE); DMA_Init(DMA1_Stream4, &dmaInit); DMA_ITConfig(DMA1_Stream4, DMA_IT_TC | DMA_IT_HT, ENABLE); //configure interrupt nvicInit.NVIC_IRQChannel = DMA1_Stream4_IRQn; nvicInit.NVIC_IRQChannelPreemptionPriority = 0; nvicInit.NVIC_IRQChannelSubPriority = 0; nvicInit.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&nvicInit); DMA_Cmd(DMA1_Stream4, ENABLE); while(DMA_GetCmdStatus(DMA1_Stream4) != ENABLE){}; AUDIO_SAMPLE просто wav скопированный через hex редактор и живущий в памяти контроллера, крутиться по кругу. Вроде как, в теории всё должно работать(снизу скрин из pulseview - снято логическим анализатором), к сожалению осциллограф пока что не приобрёл, так что проверить правильность частот не представляется возможнымб но всё же всё вроде как красиво. Формат i2s на контроллере совпадает с форматом на цапе - первый бит передаётся через 1 тик sck после смены ws П.С. подозреваю сразу вопросы про MSB/LSB - wav файл сам по себе little-endian, собственно как и контроллер, то есть тут не должно быть проблем, а i2s стандарт передаёт MSB первым, соответственно если у меня в памяти записано 0x64, 0x61, 0x61, 0x66, 0x02, 0x00, 0x85... то, судя по скрину всё передаётся правильно? или я что то не понимаю в этом всём? Но не в этом суть - в один момент тоже подумал что порядок не тот, но, к сожалению, попытки свапать байты местами(и побайтово, и по словам) не дали ни какого результата
-
Вливаюсь в среду программирования MBED OS с платой STM32F429I-DISC1 и вот что заметил: 1) Почему-то PWM у меня нормально заработал только на ножке PF_6. Я перебрал, конечно, не все порты, которые поддерживают работу с PWM, но другие, которые я попробовал, не заработали. 2) Пытался сконфигурировать некоторые порты в качестве цифрового выходи и тоже фигушки. Нормально заработали только те, что подключены к зеленому и красному светодиодам (PG_13 и PG_14). На некоторых ножках был какой-то неведомый мне меандр, какие-то не захотели переходить в низкоомное состояние. В качестве базы я использовал код DISCO-F429ZI_LCDTS_demo (это из примеров по этой плате с работой ЖК индикатора и тачскрина). Что может быть не так? Может быть какие-нибудь библиотеки, подключаемые при работе тачскрина и/или дисплея занимают большую часть портов и не позволяют их использовать по усмотрению программиста? Или я еще что-то не понимаю в архитектуре ARM? (Сам я прихожу из AVR-ов)
-
STM32F4 DISCOVERY не работает USART в автономном режиме (без подключения USB ST-LINK))
Гость опубликовал тема в STM32
Добрый день Проблема с оценочной платой STM32F4-DISCOVERY в части работы USART суть вопроса по USART шлется и принимается блоки данных по 3 байта (в принципе сколько угодно) при этом если подключен USB разъем ST-LINKа то все работает должным образом (данные снуют туда сюда без проблем), но при отключении USB ST-LINKа данные из платы STM32F4-DISCOVERY идут а вот принимать данные плата отказывается (естественно подаю внешнее питание +5 вольт на одноименный контакт). Если кто сталкивался с подобной проблемой прошу хотя бы направить в сторону железа или софта. На плате STM32F4-DISCOVERY убраны перемычки SB11(T_NRST) и SB12(T_SWO) а так же отпаян резистор R68 (MCO). Плата при этом прошивается без проблем, и стартует при внешнем питании(не от USB ST-LINKа) тоже без каких то заморочек. код прикладывать на данный момент не вижу смысла там все просто, при чем при подключении USB ST-LINKа программа работает. Проект пишется на IARe, конфигурация формируется в STM32Cube. Заранее спасибо за ответ -
Здравствуйте, подскажите, как можно получить 3.3В для питания МК STM32F4 от Li-Ion аккумулятора? Использовать какой-нибудь понижающий преобразователь? Если да, то какой?
- 5 ответов
-
- питание
- аккумулятор
-
(и ещё 1 )
C тегом:
-
Добрый вечер. Друзья, кто из вас использует МК STM32F407xxx, поделитесь информацией по поводу внешнего кварца на вашей плате. Что за кварц, фирма, а также используемые конденсаторы и Rext? Дело в том, что облажался я с выбором кварца. Не заводится он. Drive level превосходит указанный в инструкции к кристаллу... (расчеты проводились согласно заметки AN2867 от ST). В общем чтобы не мучится с поиском нужного кристалла, хочу поинтересоваться что у вас? Заранее спасибо. Моя конфигурация: Кристалл Geyer KX-K (part no. 12.87823) 8МГц. Конденсаторы 22пФ Резистор Rext = 0 Ом Расположение кристалла идентично расположению на плате Discovery. Расстояние от края до ножек - примерно 6 мм. Также интересует напряжение RMS между выводами кварца. У меня - 1.94В У Discovery - 1.65В А у вас?
- 2 ответа
-
- кварц
- кварцевый резонатор
-
(и ещё 2 )
C тегом:
-
Всем привет. У меня не работает сервомотор, контроллер stm32f407discovery. Вот код: #include #include #include #include void delay_ms(uint32_t ms) { volatile uint32_t nCount; //переменная для счета RCC_ClocksTypeDef RCC_Clocks; //переменная для считывания текущей частоты RCC_GetClocksFreq (&RCC_Clocks); //считываем текущую тактовую частоту nCount=(RCC_Clocks.HCLK_Frequency/10000)*ms; //пересчитываем мс в циклы for (; nCount!=0; nCount--); //гоняем пустые циклы } int main(void) { int x = 1023; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); //включить тактирование GPIO_InitTypeDef PORT_SETUP; //структура настройки ножки PORT_SETUP.GPIO_Mode = GPIO_Mode_AF; //альтернативная функция ножки PORT_SETUP.GPIO_OType = GPIO_OType_PP; //ножка пуш-пул PORT_SETUP.GPIO_Pin = GPIO_Pin_12; //12 ножка PORT_SETUP.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOD, &PORT_SETUP); GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_TIM4); //использовать таймер4 для 12 ножки TIM_TimeBaseInitTypeDef TIM_SETUP; //структура настройки таймера TIM_SETUP.TIM_CounterMode = TIM_CounterMode_Up; //считаем вверх TIM_SETUP.TIM_Period = 4096; //период таймера 1023 отсчета TIM_SETUP.TIM_Prescaler = 334; //предделитель откл TIM_TimeBaseInit(TIM4, &TIM_SETUP); TIM_OCInitTypeDef PWM_SETUP; //структура настройки ШИМ PWM_SETUP.TIM_Pulse = 254; //начальное заполнение PWM_SETUP.TIM_OCMode = TIM_OCMode_PWM1; //режим1 center align PWM_SETUP.TIM_OutputState =TIM_OutputState_Enable; //подключаем к выходу PWM_SETUP.TIM_OCPolarity = TIM_OCPolarity_High; //положительная полярность TIM_OC1Init(TIM4, &PWM_SETUP); TIM_Cmd(TIM4, ENABLE); while(1) { TIM4->CCR1=0; delay_ms(500); TIM4->CCR1=2047; delay_ms(500); TIM4->CCR1=4095; delay_ms(500); } } Что с этим делать?
- 12 ответов
-
- stm32
- сервомотор
-
(и ещё 1 )
C тегом:
-
Всем привет, пытаюсь заставить общаться 2 микроконтроллера через UART, программа для atmega8 очень простая: #define BAUD 9600 #define BAUDRATE ((F_CPU)/(BAUD*16UL)-1) #include <avr/io.h> #include <util/delay.h> void uart_init (void) { UBRRH = (BAUDRATE >> 8); UBRRL = BAUDRATE; UCSRB = (1 << TXEN ) | (1 << RXEN); UCSRC = (1 << URSEL) | (1 << USBS) | (1 << UCSZ0) | (1 << UCSZ1); } void uart_transmit (uint8_t data) { while (!( UCSRA & (1 << UDRE))); UDR = data; } int main() { DDRC = 0xff; PORTC = 0x00; DDRB = 0xFF; PORTB = 0x00; DDRD = 0x00; PORTD = 0x00; uart_init(); while(1) { uart_transmit('1'); _delay_ms(100); } return 0; } На STM принимаю через UART2 (порт PA.3) вывожу через USB в терминал, за основу взял вот это: https://github.com/rowol/stm32_discovery_arm_gcc/tree/master/usb_cdc_vcp Принимать данные с клавиатуры принимает (через терминал) и символы распознает хорошо, помигал светодиодом на плате, но когда пытаюсь передать с atmega8 данные на stm32 получаю вместо символов вопросительные знаки... Что с этим делать не знаю, уже что только не пробовал. Пробовал конфигурацию которая автоматически создается как в примере выше, и пробовал сам конфигурировать: RCC_APB2PeriphClockCmd(DISCOVERY_COM_CLK, ENABLE); RCC_AHB1PeriphClockCmd(DISCOVERY_COM_RX_GPIO_CLK, ENABLE); GPIO_InitTypeDef gpio; USART_InitTypeDef usart; GPIO_StructInit(&gpio); gpio.GPIO_Mode = GPIO_Mode_AF; gpio.GPIO_Pin = DISCOVERY_COM_TX_PIN; gpio.GPIO_Speed = GPIO_Speed_50MHz; gpio.GPIO_OType = GPIO_OType_PP; gpio.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &gpio); gpio.GPIO_Mode = GPIO_Mode_AF; gpio.GPIO_Pin = DISCOVERY_COM_RX_PIN; gpio.GPIO_Speed = GPIO_Speed_50MHz; gpio.GPIO_OType = GPIO_OType_PP; gpio.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &gpio); GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1); USART_StructInit(&usart); usart.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; usart.USART_BaudRate = 9600; usart.USART_WordLength=USART_WordLength_8b; usart.USART_Parity=USART_Parity_No; usart.USART_StopBits = USART_StopBits_2; usart.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_Init(DISCOVERY_COM, &usart); USART_ITConfig(DISCOVERY_COM, USART_IT_RXNE, ENABLE); USART_Cmd(DISCOVERY_COM, ENABLE); Когда сам конфигурирую вообще ничего не приходит, точнее приходит, но вопросительные знаки не рисуются, но свитодиод мигает, и говорит что данные приходят. Еще один момент, микроконтроллер atmega работает не от кварцевого резонатора, может быть из-за этого?
-
Добрый день. Есть несколько вопросов по созданию USB соединения ПК и STM32F4. Использоваться будет разъем microUSB. Соединение нужно только для заливки прошивки и считывания данных из памяти (внешней), следовательно плата должна определяться к периферийное устройство (режим хоста не требуется). 1. Куда нужно девать ногу ID на разъеме? Оставить не соединенной ни с чем или припаять на землю? В схеме с STM32F4DISCOVERY в STLink она припаяна к земле. В схеме с самим МК она идет в контроллер. А где-то вообще читал, что ее можно оставить висящей. 2. Нужно ли ставить внешний кварцевый резонатор? На странице 185 в параграфе "USB OTG full speed (FS) interface solutions" на рисунке он вроде как указан (выводы OSC_IN и OSC_OUT), но так и не ясно, нужно ли и на какую частоту. В Дискореви стоит на 8MГц, хотя где проскакивала цифра в 48МГц. Спасибо.