Jump to content

mappy89

Members
  • Content Count

    316
  • Joined

  • Last visited

Community Reputation

1 Обычный

About mappy89

  • Rank
    Постоялец
  • Birthday 11/08/1989

Информация

  • Пол
    Мужчина
  • Город
    Санкт-Петербург

Электроника

  • Стаж в электронике
    1-2 года
  • Сфера радиоэлектроники
    Микроконтроллеры
  1. Возникла такая проблема с IAR'ом. Работаю с STM32f051, добавил в проект STM Cryptographic Lib (именно библиотека с расширением *.a), создал отдельную ф-цию TEST_F, в теле которой манипулирую с функциями библиотеки. При этом саму TEST_F в программу не добавляю, Компилируется программа нормально, однако при отладке прога валится в Hard_Foult handler. Повторюсь, ф-цию TEST_F с манипуляциями библиотекой в программе НЕТ (только тело функции), однако отладка камня сразу идёт в хардфолт сразу после SystemInit У кого есть соображения на этот счёт?
  2. Ладно, киньте просто рабочий кусок кода приёма/передачи нескольких байт по spi для stm32 контроллеров, буду признателен
  3. Контроллер 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); } Помогите разобраться, в чём дело
  4. Всем доброго времени суток! Контроллер 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. В чём ошибка настройки?
  5. В кейле средствами SPL создаю проект. В файле stm32f4xx.h раскомментированием указываю свой процессор и частоту внешнего кварца для параметра HSE (8МГц). После настройки SysTick таймера SysTick_Config(7999999); ... void SysTick_Handler(void) { GPIO_ToggleBits(GPIOG, GPIO_Pin_13|GPIO_Pin_14); } запускается прерывание, которое по хорошему должно срабатывать раз в секунду, однако диоды мигают гораздо чаще, раза эдак 4 в секунду. Какие ещё настройки необходимо произвести для указания внешнего тактирования камня, что точность системного таймера соответствовала настройке?
  6. Такая проблема, не получается запустить АЦП на 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); }
  7. Доброго времени суток. Использую контроллер stm32f429ZI: настроил 3-й таймер на ШИМ, который подключен к светодиоду, параметр outputChannelInit.TIM_Pulse задаёт скважность свечения диода. 4-й таймер настроил на режим энкодера. Не совсем понимаю, как организовать прерывания в этом режиме. Есть регистр ARR автоперезагрузки счётчика, при настройке прерывания TIM_IT_Update оно возникает только при достижения счётчиком значения ARR. Соответственно, чтобы оно возникало на каждый поворот энкодера нужно в регистре ARR прописать значение 1, но тогда каким образом понять, в какую сторону я кручу энкодер?
  8. Доброго времени суток. Работаю с платой 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-х (такого же содержания). Подскажите, что и как нужно настроить, т.к. новичок
  9. Кто работал в кейле с платой 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]
  10. Ваше сообщение по поводу резистора я увидел, или вы имеете ввиду что-то ещё?
  11. Прошу прощения, входной сигнал +15В ОДНОПОЛЯРНЫЙ, -15В на рисунке я обозначил Землю сигнала
  12. Не могли бы вы пояснить, куда и зачем здесь нужно убрать землю?
  13. Подскажите, в чём ошибка схемы? На диоды подаётся двуполярка для защиты от напряжения, выше/ниже +/- 10В. После диодов на резисторе снимаю подаваемое напряжение, которое по идее не должно превышать 10В при сигнале в 15В, но на резюке падает именно 15В. В чём дело?
  14. Вопрос по сдвиговому регистру: имеется микросхемка 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 приходят импульсы с такой частотой?
×
×
  • Create New...