-
Постов
316 -
Зарегистрирован
-
Посещение
Тип контента
Профили
Форумы
Блоги
Сообщения, опубликованные mappy89
-
-
Ладно, киньте просто рабочий кусок кода приёма/передачи нескольких байт по spi для stm32 контроллеров, буду признателен
0 -
Контроллер stm32f429zi. Настроил SPI1, всё работает при передачи отдельных байт. Написал простенькую функцию для передачи строки, однако массив переменных, отвечающих за хранение принятых джанных содержит лишь последний байт
void send_str(char *mych) { while(*mych) { while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(SPI1, *mych++); while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); } } volatile char marr[10]; // буфер приёма данных volatile short count=0; void SPI1_IRQHandler() { marr[count++]=SPI_I2S_ReceiveData(SPI1); }
Помогите разобраться, в чём дело
0 -
Всем доброго времени суток!
Контроллер stm32f429zi, после настройке spi замыкаю MISO на MOSI для получения на вход байта, который посылаю. Ниже код настройки spi:
void spi_init() { SPI_InitTypeDef mySPI; GPIO_InitTypeDef myGPIO; RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOA, ENABLE); // GPIO_PinAFConfig(GPIOA, GPIO_Pin_4, GPIO_AF_SPI1); GPIO_PinAFConfig(GPIOA, GPIO_Pin_5, GPIO_AF_SPI1); GPIO_PinAFConfig(GPIOA, GPIO_Pin_6, GPIO_AF_SPI1); GPIO_PinAFConfig(GPIOA, GPIO_Pin_7, GPIO_AF_SPI1); GPIO_StructInit(&myGPIO); myGPIO.GPIO_Mode=GPIO_Mode_AF; myGPIO.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; GPIO_Init(GPIOA, &myGPIO); SPI_NSSInternalSoftwareConfig(SPI1, SPI_NSSInternalSoft_Set); SPI_StructInit(&mySPI); mySPI.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_32; mySPI.SPI_Mode=SPI_Mode_Master; mySPI.SPI_NSS=SPI_NSS_Soft; SPI_Init(SPI1, &mySPI); SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_RXNE, ENABLE); SPI_Cmd(SPI1, ENABLE); NVIC_EnableIRQ(SPI1_IRQn); } void SPI1_IRQHandler() { volatile uint16_t temp; if (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE)==SET) { temp=SPI_I2S_ReceiveData(SPI1); } void EXTI0_IRQHandler() //внешняя кнопка { EXTI_ClearITPendingBit(EXTI_Line0); GPIO_ResetBits(GPIOA, GPIO_Pin_4); SPI_I2S_SendData(SPI1, 0x03); GPIO_SetBits(GPIOA, GPIO_Pin_4); } }
Вход в прерывание осуществляется при отправке данных, а не при приёме (при отсутствии перемычки MISO-MOSI), и никаких данных в итоге не получаю, переменная temp всегда =0. В чём ошибка настройки?
0 -
В кейле средствами SPL создаю проект. В файле stm32f4xx.h раскомментированием указываю свой процессор и частоту внешнего кварца для параметра HSE (8МГц).
После настройки SysTick таймера
SysTick_Config(7999999); ... void SysTick_Handler(void) { GPIO_ToggleBits(GPIOG, GPIO_Pin_13|GPIO_Pin_14); }
запускается прерывание, которое по хорошему должно срабатывать раз в секунду, однако диоды мигают гораздо чаще, раза эдак 4 в секунду. Какие ещё настройки необходимо произвести для указания внешнего тактирования камня, что точность системного таймера соответствовала настройке?
0 -
stm32f429zi
0 -
Такая проблема, не получается запустить АЦП на stm32 без использования DMA: настраиваю АЦП на срабатывание от первого таймера по совпадению, настраиваю сам таймер и прерывания от АЦП по окончанию обработки. Но программа в обработчик прерывания не заходит. Вот код, буду благодарен за указание ошибок:
void ADCInit() { ADC_InitTypeDef MyADC; ADC_CommonInitTypeDef MyADCCom; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); ADC_StructInit(&MyADC); ADC_CommonStructInit(&MyADCCom); MyADC.ADC_ContinuousConvMode=ENABLE; MyADC.ADC_ExternalTrigConv=ADC_ExternalTrigConv_T1_CC1; MyADC.ADC_NbrOfConversion=100; MyADC.ADC_Resolution=ADC_Resolution_12b; ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 1, ADC_SampleTime_3Cycles); ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE); ADC_Init(ADC1, &MyADC); ADC_CommonInit(&MyADCCom); ADC_Cmd(ADC1, ENABLE); NVIC_EnableIRQ(ADC_IRQn); } void TimInit() { TIM_TimeBaseInitTypeDef MyTim; TIM_OCInitTypeDef MyTimOC; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); TIM_TimeBaseStructInit(&MyTim); MyTim.TIM_Period=100; TIM_TimeBaseInit(TIM1, &MyTim); TIM_OCStructInit(&MyTimOC); TIM_OC1Init(TIM1, &MyTimOC); TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_OC1Ref); TIM_Cmd(TIM1, ENABLE); }
0 -
Доброго времени суток.
Использую контроллер stm32f429ZI: настроил 3-й таймер на ШИМ, который подключен к светодиоду, параметр outputChannelInit.TIM_Pulse задаёт скважность свечения диода. 4-й таймер настроил на режим энкодера.
Не совсем понимаю, как организовать прерывания в этом режиме. Есть регистр ARR автоперезагрузки счётчика, при настройке прерывания TIM_IT_Update оно возникает только при достижения счётчиком значения ARR. Соответственно, чтобы оно возникало на каждый поворот энкодера нужно в регистре ARR прописать значение 1, но тогда каким образом понять, в какую сторону я кручу энкодер?
0 -
Доброго времени суток.
Работаю с платой STM32f429i DISCO в 5-м кейле. Через Manage Run-time Environment настраиваю демо проект для дисплея (Antialiased Text). Файл main.c содержит след. код
#include "GUI.h" int main() { MainTask(); while(1) {} }
После компиляции получаю 90 ошибок по типу
Error: L6406E: No space in execution regions with .ANY selector matching guidev_staticdevices.o(.data).
Error: L6407E: Sections of aggregate size 0x201b58 bytes could not fit into .ANY selector(s).
После подключения IRAM2 кол-во ошибок уменьшилось до 2-х (такого же содержания). Подскажите, что и как нужно настроить, т.к. новичок
0 -
Кто работал в кейле с платой STM32F4xx, помогите понять, что я делаю не так =) Хочу помигать диодами, юзая внешее прерывание на кнопке PA0. Использую функции из библиотек "STM32F4xx.h", "EXTI_STM32F4xx.h", "GPIO_STM32F4xx.h".
Прерывание срабатывает, однако код внутри тупо зависает на первой итерации и дальше не идёт (флаг прерывание не забываю сбрасывать). Помогите определить, в чём проблема
Заранее спасибо
[size=5]#include <stdio.h> #include <stdint.h> #include "STM32F4xx.h" #include "EXTI_STM32F4xx.h" #include "GPIO_STM32F4xx.h" void Delay(uint16_t Val) { for( ; Val != 0; Val--) { int look = Val; __nop(); } } /*---------------------------------------------------------------------------- Main function *----------------------------------------------------------------------------*/ int main (void) { // SystemInit(); SystemCoreClockUpdate(); /* Get Core Clock Frequency */ if (SysTick_Config(SystemCoreClock / 1000)) { /* SysTick 1 msec interrupts */ while (1); /* Capture error */ } //тактируем ноги со светодиодами: PG13 и PG 14 GPIO_PortClock (GPIOG, true); GPIO_PinConfigure(GPIOG, 13,GPIO_MODE_OUTPUT, GPIO_OUTPUT_PUSH_PULL, GPIO_OUTPUT_SPEED_2MHz, GPIO_PULL_DOWN); GPIO_PinConfigure(GPIOG, 14,GPIO_MODE_OUTPUT, GPIO_OUTPUT_PUSH_PULL, GPIO_OUTPUT_SPEED_2MHz, GPIO_PULL_DOWN); //тактируем ногу с кнопкой PA0 GPIO_PortClock (GPIOA, true); GPIO_PinConfigure(GPIOA, 0,GPIO_MODE_INPUT, GPIO_OUTPUT_PUSH_PULL ,GPIO_OUTPUT_SPEED_2MHz, GPIO_PULL_DOWN); //настраиваем регистры внешнего прерывания EXTI_Setup(); EXTI_ConfigurePin (0, EXTI_PIN_PA); EXTI_ConfigureLine (0, EXTI_MODE_INTERRUPT, EXTI_TRIGGER_RISING); //настраиваем приоритет NVIC_SetPriority (EXTI0_IRQn, 2); //включаем переферию NVIC_EnableIRQ (EXTI0_IRQn); //включ прерывание __enable_irq(); while(1) { /* Loop forever */ } } void EXTI0_IRQHandler(void) //обработчик прерывания { static volatile int i=0; if (!i) GPIO_PinWrite(GPIOG, 14, 1); //виснет на этом месте, жиод загорается и всё else GPIO_PinWrite(GPIOG, 14, 0); i=1-i; EXTI_ClearPendingBit(0); }[/size]
0 -
mappy89, вы сообщения через одно читаете?
Ваше сообщение по поводу резистора я увидел, или вы имеете ввиду что-то ещё?
0 -
Прошу прощения, входной сигнал +15В ОДНОПОЛЯРНЫЙ, -15В на рисунке я обозначил Землю сигнала
0 -
уберите землю...
Не могли бы вы пояснить, куда и зачем здесь нужно убрать землю?
0 -
-
Вопрос по сдвиговому регистру: имеется микросхемка 74hc165, которую я тактирую контроллером (Atmega64) на частоте 16МГц в обработчике прерывания таймера по совпадению.:
ISR (TIMER1_COMPA_vect)
{
for (int i=0; i<8; i++) //цикл из 8 клоков
{
PORTF&=~(1<<1); //CLK down
//если на выходе регистра что то есть, то делаем то-то...
PORTF|=(1<<1); //CLK up
}
PORTF&=~(1<<1); //SH/LD down защёлкиваем данные
PORTF|=(1<<1); // SH/LD up
}
Тактирование сдвигового регистра получается на частоте 8МГц, успеет ли тактируемый регистр "сообразить", что на его CLK приходят импульсы с такой частотой?
0 -
Всем спасибо!
0 -
входной сигнал на прямой вход подаётся относительно общей шины (земли)? и куда подаётся минус вх. сигнала, на инверсный вход?
0 -
А выходное сопротивление также задаётся резистором, или еще параметрами ОУ? и ещё, входной сигнал на прямой вход подаётся относительно общей шины (земли)? и куда подаётся минус вх. сигнала, на инверсный вход?
0 -
Хм, мне главный инженер предложил использовать именно схему с биполярником, ему было как раз под 70 =)
0 -
а зачем тогда используют связку с биполярником, я чет не понял? )
0 -
mvkarp, да, вход после повторителя низкоомный, и нужно как раз усиление по току.
Вот ещё вопрос - чем будет принципиально отличаться повторитель на ОУ и повторитель в связке ОУ + биполярник?
0 -
Ок, понял, что Вход А лишний, нужно оставить только обратную связь.
А входной сигнал на вход В вне зависимости от полярности нужно подавать относительно "-" питания?
0 -
Помогите понять основы работы с операционным усилителем. Имеется эмиттерный повторитель в связке с операционником (ОУ для "гашения" падения напряжения БЭ). ОУ запитываем от двуполярного источника ±18В. На прямой и инверсный вход подаём сигналы двуполярного питания на "Вход А" и "Вход B". Притом на эти входы будут подаваться напряжения в разной полярности (либо "+" на вход А и "-" на вход В, или наоборот). На выходе я хочу получить ту же разность потенциалов, что подал на вход, только с сопротивлением R3.
Вопрос: относительно какой точки нужно снимать напряжение с эмиттера транзистора и получу ли я ту же разность потенциалов на выходе, что и на входе (вх. сигналы меньше ±18В), либо будет где то падать часть напряжения?
0 -
IMXO - да, именно так.
При 5В на входе, на выходах к МК напряжение не дотянет до логической единицы.
Тогда нужно увеличить номинал резисторов R1/R4? Мне нужно на МК получить уровень хотябы 3В
0 -
Доброго времени суток!
Прошу Вас указать, правильно ли составлена схема (ниже). Имеется испытуемое эл/магн. реле (управление обмоткой на рисунке опущено), на контакты которого подаётся напряжение от 5 до 100 В (ток через контакты задаётся резисторами R2/R3). Параллельно резисторам R2/R3 через резисторы R1/R4 (10К) подключены 2 стабилитрона для того, чтобы на них падало напряжение не более 5 В (U ном стабилитрона ~ 4 В, в противном случае сгорят входы микроконтроллера), а затем от стабилитрона идут выводы к микроконтроллеру, чтобы уловить момент замыкания/размыкания контактов реле.
Т.е. суть схемы - в ограничении до маленьких напряжений входного напряжения питания контактов реле и улавливания их замыкания/размыкания. Правильно ли построена схема? Какие в ней есть ошибки?
0
Внешняя Библиотека И Hard_Fault Handler
в STM32
Опубликовано
Возникла такая проблема с IAR'ом. Работаю с STM32f051, добавил в проект STM Cryptographic Lib (именно библиотека с расширением *.a), создал отдельную ф-цию TEST_F, в теле которой манипулирую с функциями библиотеки. При этом саму TEST_F в программу не добавляю,
Компилируется программа нормально, однако при отладке прога валится в Hard_Foult handler. Повторюсь, ф-цию TEST_F с манипуляциями библиотекой в программе НЕТ (только тело функции), однако отладка камня сразу идёт в хардфолт сразу после SystemInit
У кого есть соображения на этот счёт?