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

Nicollo

Members
  • Постов

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

  • Посещение

Информация

  • Город
    Odessa

Электроника

  • Стаж в электронике
    1-2 года

Посетители профиля

Блок последних пользователей отключён и не показывается другим пользователям.

Достижения Nicollo

Новичок

Новичок (1/14)

  • 10 постов на форуме
  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме

Последние значки

-1

Репутация

  1. Да, новый, только купил. Вот такой:
  2. Добрый день, а еще хотел спросить, есть ли в STM32F103 защита от дребезга энкодера? Использую входы 3го таймера RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //Channels TIM3_CH1, TIM3_CH2 as pull up inputs GPIO_InitTypeDef GPIO_InitDef; GPIO_InitDef.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitDef.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitDef.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOA, &GPIO_InitDef); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); /* TIM3 tunning*/ TIM_TimeBaseInitTypeDef TIMER_InitStructure; TIM_TimeBaseStructInit(&TIMER_InitStructure); // set TIM_Period - encoder rotate count reset TIMER_InitStructure.TIM_Period = 4; // backward and forward count TIMER_InitStructure.TIM_CounterMode = TIM_CounterMode_Up | TIM_CounterMode_Down; TIM_TimeBaseInit(TIM3, &TIMER_InitStructure); /* Tuning Encoder Interface */ TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Falling, TIM_ICPolarity_Falling); TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); TIM_Cmd(TIM3, ENABLE); NVIC_EnableIRQ(TIM3_IRQn); Направление определяю вот так: (TIM3->CR1 & TIM_CR1_DIR ? -1 : 1) Иногда детектится противоположное направление. Можно ли как-то это решить программно? Или вешать RC фильтр?
  3. Я в таймере и опрашиваю, но время для антидребезга отслеживаю по BUTTON_DELAY.
  4. Извращяюсь - делаю защиту от антидребезга, для каждой кнопки: т.е. после того как обнаружилось нажатие выжидаю некоторое время и если после него кнопка осталась нажатой - засчитываю нажатие. #define BUTTON_DELAY 0x0F void BUTTON_Check(Button *Button) { /** * Check if button is pressed */ if ((Button->GPIOx->IDR & Button->GPIO_Pin) == (uint32_t) Bit_RESET && Button->ttl == 0x00) { Button->ttl ++; return; } /** * Wait for a while to skip button rattling */ if (Button->ttl > 0x00 && Button->ttl < BUTTON_DELAY) { Button->ttl ++; return ; } if (Button->ttl == BUTTON_DELAY) { if ((Button->GPIOx->IDR & Button->GPIO_Pin) == (uint32_t) Bit_RESET) { Button->ttl ++; } else { Button->ttl = 0x00; } return ; } if ((Button->GPIOx->IDR & Button->GPIO_Pin) == (uint32_t) Bit_SET && Button->ttl == (BUTTON_DELAY + 1)) { Button->isPressed = SET; return ; } }
  5. Добрый день. Пишу программу под STM32f103, в девайсе есть 2 кнопки, подключены напрямую к ваходам GPIOA (0 и 1); Хочу сделать по красоте, написал структуру для кнопок: typedef struct { GPIO_TypeDef* GPIOx; uint16_t GPIO_Pin; uint8_t isPressed; uint8_t ttl; } Button; И глобальную структуру: typedef struct { ... Button* ModeButton; // mode button status ... } GlobalRegister; GlobalRegister Register; Пример инициализации 1 кнопки: void main() { ... GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOA, &GPIO_InitStruct); Button ModeButton; ModeButton.GPIOx = GPIOA; ModeButton.GPIO_Pin = GPIO_Pin_0; ModeButton.ttl = 0x00; ModeButton.isPressed = RESET; Register.ModeButton = &ModeButton; ... } После, в обработчике прерываний по таймеру, я пытаюсь проверить нажатие кнопки: void BUTTON_Check(Button *Button){ ... } void SysTick_Handler(void){ BUTTON_Check(Register.ModeButton); .... } Но указатель уже битый, не могу получить объект кнопки.
  6. я думаю, я нашел причину. Я использую OpenSTM32 IDE Оно, при создании проекта, само подгружает SPL так вот, там есть файлик: sturtup_stm32.s насколько я понял в нем мапятся прерывания с обработчиками, и он не проинициализирован до конца g_pfnVectors: .word _estack .word Reset_Handler .word NMI_Handler .word HardFault_Handler .word MemManage_Handler .word BusFault_Handler .word UsageFault_Handler .word SVC_Handler .word DebugMon_Handler .word PendSV_Handler .word SysTick_Handler Я скачал библиотеку с сайта и посмотрел в этот файлик, и он немного отличается. Сейчас попытаюсь запустить проект с новой либой. Added: Да, все верно, подменил файл, все заработало. Спасибо всем.
  7. Работает эхо, и адаптеры я менял. Оно просто не входит в обработчик, прерывание случается.
  8. Адаптер: FT232RL. PUTTY RX и TX работают. Прием-передачу делал без прерываний в основном цикле - работало без проблем.
  9. Подсоединил, сделал как вы написали, на компе строку получил. прерывание не сработало
  10. void USART1_IRQHandler(void) { static uint8_t isSet = SET; GPIO_WriteBit(GPIOC , GPIO_Pin_13 , isSet); isSet = !isSet; if(USART1->SR & USART_SR_RXNE) { char recive_UART1 = USART1->DR; USART_write(recive_UART1); } } Сделал даже так, помограть диодом - оно в обработчик даже не заходит
  11. void init_USART1(uint32_t baudrate){ RCC_ClocksTypeDef RCC_ClocksStatus; RCC_GetClocksFreq(&RCC_ClocksStatus); RCC->APB2ENR |=RCC_APB2ENR_USART1EN | RCC_APB2ENR_IOPAEN; GPIOA->CRH &=~ (GPIO_CRH_CNF10 |GPIO_CRH_CNF9|GPIO_CRH_MODE10); GPIOA->CRH |= GPIO_CRH_CNF10_0 |GPIO_CRH_CNF9_1 | GPIO_CRH_MODE9; USART1->CR1 |= USART_CR1_TE |USART_CR1_RE |USART_CR1_RXNEIE; USART1->BRR =(RCC_ClocksStatus.PCLK2_Frequency+baudrate/2)/baudrate; USART1->CR1 |=USART_CR1_UE; NVIC_SetPriority(USART1_IRQn,15); NVIC_EnableIRQ(USART1_IRQn); } void USART_write (char data) { while(!(USART1->SR & USART_SR_TXE)); USART1->DR=data; } void USART_WR_String(const char *s) { int i = 0; while (s [i] != 0) { USART_write (s[i++]); } } int main(void) { init_USART1(9600); // initialize USART1 @ 9600 baud RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOC , &GPIO_InitStructure); GPIO_WriteBit(GPIOC , GPIO_Pin_13 , RESET); USART_WR_String("Init complete! Hello World!\r\n"); // just send a message to indicate that it works while (1){ /* * You can do whatever you want in here */ } } // this is the interrupt request handler (IRQ) for ALL USART1 interrupts void USART1_IRQHandler(void) { if(USART1->SR & USART_SR_RXNE) { char recive_UART1 = USART1->DR; USART_write(recive_UART1); } } Не интераптит
  12. Тут и вы и он равы Он сам должен сбрасываться, после прочтения USART_DR, ну или также можно вручную сбросить. В любом случае, мою проблему это не решает.
  13. Я читал где-то что неявная очистка статус регистра немного хромает, и для подстаховки рекомендуют сбрасывать бит флага прерывания вручную. 2Mishany: я так делал, не помогло Инициализация у меня есть вот такая: USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); Т.е. я хочу чтоб прерывание сработало ТОЛЬКО на приеме. И мне кажется что прерывание происходит, но в обработчик оно почему-то не попадает
  14. Добрый вечер. Решил недавно поиграться с микроконтроллерами, ибо были в загашнике такие платы: Ппробовал погонять данные по USART. В обычном режиме - все работает нормально, но вот с прерываниями - немного не получается. Я взял пример из стандартной библиотеки, скомпилил, залил и прерывание не срабатывает. #include <stm32f10x.h> #include <misc.h> volatile char received_string[MAX_STRLEN+1]; void Delay(__IO uint32_t nCount) { while(nCount--) { } } void init_USART1(uint32_t baudrate){ GPIO_InitTypeDef GPIO_InitStruct; USART_InitTypeDef USART_InitStruct; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStruct); USART_InitStruct.USART_BaudRate = baudrate; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(USART1, &USART_InitStruct); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_Cmd(USART1, ENABLE); } void USART_puts(USART_TypeDef* USARTx, volatile char *s){ while(*s){ while( !(USARTx->SR & 0x00000040) ); USART_SendData(USARTx, *s); *s++; } } int main(void) { init_USART1(9600); // initialize USART1 @ 9600 baud USART_puts(USART1, "Init complete! Hello World!\r\n"); // just send a message to indicate that it works while (1){ /* * You can do whatever you want in here */ } } void USART1_IRQHandler(void){ // check if the USART1 receive interrupt flag was set if( USART_GetITStatus(USART1, USART_IT_RXNE) ){ static uint8_t cnt = 0; // this counter is used to determine the string length char t = USART1->DR; // the character from the USART1 data register is saved in t // check if the received character is not the LF character (used to determine end of string) // or the if the maximum string length has been been reached if( (t != '\n') && (cnt < MAX_STRLEN) ){ received_string[cnt] = t; cnt++; } else{ // otherwise reset the character counter and print the received string cnt = 0; USART_puts(USART1, received_string); } } } Решил упростить задачу и поморгать светодиодом: void USART2_IRQHandler(void){ USART_ClearITPendingBit(USART2, USART_IT_TC); USART_ClearITPendingBit(USART2, USART_IT_RXNE); static uint8_t isSet = SET; GPIO_WriteBit(GPIOC , GPIO_Pin_13 , isSet); isSet = !isSet; } Оно в обработчик вообще не попадает. Подскажите, может что не так делаю? Отладчика пока нету, заказал - жду. Есть FTD USB-UART преобразователи, через них прошиваю и проверяю. А еще я в основной цикл добавил постоянную отправку строки, и оно таки прерывается, когда я шлю байт с компа, но в обработчик оно, походу, не попадает. Пробовал на USART2 - такая же фигня.
  15. И еще один усилитель на ГУ-74б Входная мощность: 25-30ватт Выходная мощность: 600-650ватт Цена 550$ тел: 098 42 44 284 Подробнее
×
×
  • Создать...