Перейти к содержанию

mappy89

Members
  • Постов

    316
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные mappy89

  1. Возникла такая проблема с IAR'ом. Работаю с STM32f051, добавил в проект STM Cryptographic Lib (именно библиотека с расширением *.a), создал отдельную ф-цию TEST_F, в теле которой манипулирую с функциями библиотеки. При этом саму TEST_F в программу не добавляю,

    Компилируется программа нормально, однако при отладке прога валится в Hard_Foult handler. Повторюсь, ф-цию TEST_F с манипуляциями библиотекой в программе НЕТ (только тело функции), однако отладка камня сразу идёт в хардфолт сразу после SystemInit

    У кого есть соображения на этот счёт?

  2. Контроллер 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);
    }
    

    Помогите разобраться, в чём дело

  3. Всем доброго времени суток!

    Контроллер 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. В чём ошибка настройки?

  4. В кейле средствами SPL создаю проект. В файле stm32f4xx.h раскомментированием указываю свой процессор и частоту внешнего кварца для параметра HSE (8МГц).

    После настройки SysTick таймера

    SysTick_Config(7999999);
    ...
    void SysTick_Handler(void)
    {
    GPIO_ToggleBits(GPIOG, GPIO_Pin_13|GPIO_Pin_14);
    }
    

    запускается прерывание, которое по хорошему должно срабатывать раз в секунду, однако диоды мигают гораздо чаще, раза эдак 4 в секунду. Какие ещё настройки необходимо произвести для указания внешнего тактирования камня, что точность системного таймера соответствовала настройке?

  5. Такая проблема, не получается запустить АЦП на 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);
    }
    

  6. Доброго времени суток.

    Использую контроллер stm32f429ZI: настроил 3-й таймер на ШИМ, который подключен к светодиоду, параметр outputChannelInit.TIM_Pulse задаёт скважность свечения диода. 4-й таймер настроил на режим энкодера.

    Не совсем понимаю, как организовать прерывания в этом режиме. Есть регистр ARR автоперезагрузки счётчика, при настройке прерывания TIM_IT_Update оно возникает только при достижения счётчиком значения ARR. Соответственно, чтобы оно возникало на каждый поворот энкодера нужно в регистре ARR прописать значение 1, но тогда каким образом понять, в какую сторону я кручу энкодер?

  7. Доброго времени суток.

    Работаю с платой 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-х (такого же содержания). Подскажите, что и как нужно настроить, т.к. новичок

  8. Кто работал в кейле с платой 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]
    

  9. Подскажите, в чём ошибка схемы? На диоды подаётся двуполярка для защиты от напряжения, выше/ниже +/- 10В. После диодов на резисторе снимаю подаваемое напряжение, которое по идее не должно превышать 10В при сигнале в 15В, но на резюке падает именно 15В. В чём дело?

    post-138727-0-95739700-1395742189_thumb.png

  10. Вопрос по сдвиговому регистру: имеется микросхемка 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 приходят импульсы с такой частотой?

  11. А выходное сопротивление также задаётся резистором, или еще параметрами ОУ? и ещё, входной сигнал на прямой вход подаётся относительно общей шины (земли)? и куда подаётся минус вх. сигнала, на инверсный вход?

  12. Ок, понял, что Вход А лишний, нужно оставить только обратную связь.

    А входной сигнал на вход В вне зависимости от полярности нужно подавать относительно "-" питания?

  13. Помогите понять основы работы с операционным усилителем. Имеется эмиттерный повторитель в связке с операционником (ОУ для "гашения" падения напряжения БЭ). ОУ запитываем от двуполярного источника ±18В. На прямой и инверсный вход подаём сигналы двуполярного питания на "Вход А" и "Вход B". Притом на эти входы будут подаваться напряжения в разной полярности (либо "+" на вход А и "-" на вход В, или наоборот). На выходе я хочу получить ту же разность потенциалов, что подал на вход, только с сопротивлением R3.

    Вопрос: относительно какой точки нужно снимать напряжение с эмиттера транзистора и получу ли я ту же разность потенциалов на выходе, что и на входе (вх. сигналы меньше ±18В), либо будет где то падать часть напряжения?

    post-138727-0-28335300-1393047545_thumb.png

  14. IMXO - да, именно так.

    При 5В на входе, на выходах к МК напряжение не дотянет до логической единицы.

    Тогда нужно увеличить номинал резисторов R1/R4? Мне нужно на МК получить уровень хотябы 3В

  15. Доброго времени суток!

    Прошу Вас указать, правильно ли составлена схема (ниже). Имеется испытуемое эл/магн. реле (управление обмоткой на рисунке опущено), на контакты которого подаётся напряжение от 5 до 100 В (ток через контакты задаётся резисторами R2/R3). Параллельно резисторам R2/R3 через резисторы R1/R4 (10К) подключены 2 стабилитрона для того, чтобы на них падало напряжение не более 5 В (U ном стабилитрона ~ 4 В, в противном случае сгорят входы микроконтроллера), а затем от стабилитрона идут выводы к микроконтроллеру, чтобы уловить момент замыкания/размыкания контактов реле.

    Т.е. суть схемы - в ограничении до маленьких напряжений входного напряжения питания контактов реле и улавливания их замыкания/размыкания. Правильно ли построена схема? Какие в ней есть ошибки?

    post-138727-0-08985000-1392200310_thumb.png

×
×
  • Создать...