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

Tapochka

Участник
  • Постов

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

  • Посещение

Репутация

0 Обычный

Информация о Tapochka

  • Звание
    Участник
    Участник
  1. мда, заработало: вместо TXCIF поставил DREIF, и после while запятая не стояла
  2. да, я это тоже заметил, исправил, не помогло)
  3. спасибо за ответ, но в моей проге что не так все же хотелось бы узнать)
  4. hello world на usart atxmega

    Добрый день, совсем недавно начал осваивать avr axmega, до этого имел дело с arm, решил забабацать hello world с помощью выплевывания строки по usart на терминал брея. В проге ничего нету практически, ошибок нет, однако hello world! на терминалке не наблюдается. Помогите разобраться в чем дело, просто уж хочется добить первую прогу Код #include <avr/io.h> #include <stdio.h> #include <avr/interrupt.h> static int usart_putchar (char data, FILE *stream); static FILE mystdout = FDEV_SETUP_STREAM(usart_putchar, NULL, _FDEV_SETUP_WRITE); void delay(); void initall(); void delay(uint32_t i) { while(i) i--; } int main(void) { cli(); initall(); sei(); stdout = &mystdout; while(1) { printf('Hello world\n'); delay(0xFFFF); } } void initall(void) { PORTD.DIR|=1<<7; //высокий уровень на TXD1, 7 нога PORTD.OUT=0xA0; //TXD1 и XCK1 высокий логический уровни USARTD0.CTRLC= USART_PMODE1_bm | USART_CHSIZE0_bm | USART_CHSIZE1_bm; //разрешен четный паритет, по 8 бит, стоп-бит 1 USARTD0.CTRLB= USART_TXEN_bm; //включен передатчик USARTD0.BAUDCTRLA=0x91; // BSEL = 401 USARTD0.BAUDCTRLB=0xC1; // BSCALE = -4, Реальная скорость ~115200 } int usart_putchar(char data, FILE *stream) { if (data=='\n') usart_putchar('\r', stream); //для терминала bray else { while (!(USARTD0.STATUS & (USART_TXCIF_bm))) //пока флаг TXCIF не равен единице USARTD0.DATA = data; } return 0; }
  5. spi и usb на stm32

    дебагер работает, как ни странно :rolleyes: спасибо за подсказку, примерно там же был и у меня, однако по вышеприведенной ссылке добавил кусок кода и это ничего не дало(
  6. spi и usb на stm32

    нашел как увеличить стек http://www.coocox.org/forum/topic.php?id=917 однако не могу найти файл arm-gcc-link.ld, где он находится хоть примерно?
  7. spi и usb на stm32

    spi-шных прерываний то нету в проекте, если только usb-шные свои, в файле usb_bsp.c... а как стек то увеличить?
  8. spi и usb на stm32

    а что следует в обработчике делать по-вашему?
  9. spi и usb на stm32

    сделал кнопку - vcp нормально не определяется хоть при нажатой, хоть нет. неужели дело в портах((( подскажите пожалуйста что думаете, просто ума не приложу как связаны могут быть spi и usb ногами в моем примере
  10. spi и usb на stm32

    спасибо большое, однако нету в моей библиотеке дефайна VBUS_SENSING_ENABLED, да и по схеме проверил PC10, PC11, PC12 никак на дискавери не связаны с usb. не в пинах счастье :( видимо в этом и дело
  11. spi и usb на stm32

    Здравствуйте. Моя задача такова: по spi принимать/отдавать данные с АЦП и по usb передавать принятые данные на hyperterminal на компе(комп должен видеть плату как виртуальный com порт) на плате stm32f4discovery. По отдельности спи и виртуальный com порт работают нормально, но вместе com порт не инициализируется, а комп видит плату как неисправное usb устройство. Помогите разобраться в чем может быть проблема т.к. ноги otg и spi-шные не пересекаются, вроде сто раз проверил(spi3 - PC10, PC11, PC12), просто ума не приложу в чем может быть проблема. Код main для организации виртуального com порта и вывод напечатанных символов с клавы на терминал: #include "stm32f4xx.h" #include "usbd_cdc_vcp.h" // подключаем USB CDC __ALIGN_BEGIN USB_OTG_CORE_HANDLE USB_OTG_dev __ALIGN_END; const char ch3[]="receive 3\x0D\x0A"; const char ch4[]="получено 4\x0D\x0A"; char ch5[]="receive 5\x0D\x0A"; char ch6[]="receive 6\x0D\x0A"; int main(void) { SystemInit(); // настройки тактирования // включаем usb USBD_Init(&USB_OTG_dev,USB_OTG_FS_CORE_ID,&USR_desc,&USBD_CDC_cb,&USR_cb); while (1){ if(usb_cdc_kbhit()){ // проверка: приняты данные? char c; c = usb_cdc_getc(); // получение байта с usb switch(c){ // разбор принятого символа case '3': usb_cdc_printf((char *)ch3); // строки на хост break; case '4': usb_cdc_printf((char *)ch4); break; case '5': usb_cdc_printf(ch5); break; case '6': usb_cdc_printf(ch6); break; } } } } прикрепляю полный проект на кокосе, proba6 главный ______.rar
  12. не работает spi

    Здравствуйте, есть задача связи по spi платы stm32f4 discovery и АЦП ad7714. Алгоритм такой: отправляем сначала слова для настройки АЦП в функции __configuration(4 слова); далее чтобы считывать данные с АЦП нужно отправлять запрос из двух слов(отправляем два слова, далее принимает 24 бита с АЦП). В чем проблема ума не приложу: даже частота тактирования не находится(осциллографом), а вместо нее просто логическая единица, не говоря уже о приеме-передачи и т.д. Мучаюсь уже долго :( Помогите пожалуйста. Код привожу ниже: #define RegisterFilterHigh1 0x21 //верх. регистр фильтра AIN2 AIN6 #define FilterHigh 0xC1 //униполярный, 24 разряда, сниж. тока #define RegisterFilterLow1 0x31 //ниж. регистр фильтра AIN2 AIN6 ---- ну это все все для конфигурации АЦП #define FilterLow 0x80 //униполярный, 24 разряда, сниж. тока #define RegisterMode 0x12 //регистр режима #define ModeAuto 0x20 //автокалибровка #include "stm32f4xx.h" #include "stm32f4xx_gpio.h" #include "stm32f4xx_rcc.h" #include "misc.h" #include "stm32f4xx_spi.h" uint32_t data; //принятые данные с AD7714 uint8_t one_buf; // числа для отсчета отправленных слов uint8_t two_buf; int __Configuration(); GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; SPI_InitTypeDef SPI_InitStructure; int __Configuration(void) { SPI_I2S_SendData(SPI3, RegisterFilterHigh1); while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY) == SET); //проверяем статус флага во время передачи SPI_I2S_SendData(SPI3, FilterHigh); while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY) == SET); SPI_I2S_SendData(SPI3, RegisterFilterLow1); while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY) == SET); SPI_I2S_SendData(SPI3, FilterLow); while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY) == SET); if (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == SET) //проверяем флаг TXE: когда передача слова завершена, то one_buf++ one_buf++; return one_buf; } int main(void) { RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD , ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12; //тактируем ноги spi GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //тактируем DRDY GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2; //тактируем CS и SYNC GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_SPI3); GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_SPI3); GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_SPI3); RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE); SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; // NSS программно управляется SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_Init(SPI3, &SPI_InitStructure); SPI_I2S_ITConfig(SPI3, SPI_I2S_IT_TXE, ENABLE); // Разрешаем прерывания по окончанию передачи байта SPI_Cmd(SPI3, ENABLE); SPI_NSSInternalSoftwareConfig(SPI3, SPI_NSSInternalSoft_Set); //NSS в единицу NVIC_InitStructure.NVIC_IRQChannel = SPI3_IRQn; // прерывания от SPI NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x04; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //на всякий случай оформил прерывания на будущее NVIC_Init(&NVIC_InitStructure); __enable_irq(); NVIC_EnableIRQ(SPI3_IRQn); __Configuration(); //конфигурация AD7714 GPIO_ResetBits(GPIOD, GPIO_Pin_1); //кидаем нуль на CS if(one_buf==4) { while(1) { SPI_I2S_SendData(SPI3, RegisterMode); //начинаем отправлять запрос в AD7714 while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY) == SET); //проверка статуса флага передачи SPI_I2S_SendData(SPI3, ModeAuto); while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY) == SET); if (SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_TXE)==SET) two_buf++; } } for(;;){} } void SPI3_IRQHandler() { if(two_buf==2) { two_buf==0; if (SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_TXE)==SET) // Если прерывание вызвано окончанием передачи байта data = SPI_I2S_ReceiveData(SPI3); //то принимаем по 24 бита } }
  13. СПАСИБО ОГРОМНОЕ :beer: ошибок больше нет. следуя вашему совету прописал в stm32f4xx_gpio.c, stm32f4xx_rcc.c, stm32f4xx_tim.c, stm32f4xx_exti.c в инклудах этот stm32f4xx_conf.h( хотя они были защищены от записи, так что пришлось создать новые файлы с тем же содержанием и с другим названием), и все нормально.
  14. А как в таком случае подключить нужный заголовочный файл в stm32f4xx_gpio.c ? ничего такого там не нашел
  15. По идее наверно нет, но ошибка то возникает с ним связана. В таком случае хотелось бы узнать как ее миновать не связываясь с assert_param
×
×
  • Создать...