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

firstvald

Свой
  • Постов

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

  • Посещение

  • Победитель дней

    2

Весь контент firstvald


  1. Кристалл stm32f100. Плата Discovery. Вижу, что передача по USART начинается с задержкой. Т е после записи в DR, на ножке процессора посылка появляется примерно через время равное передачи байта (без стопов и паритета) на выбранной скорости. Для 115200 физически передача начинается через 8 микросекунд, для 19200 - через 400, для 1200 - через 10 миллисекунд. Т е такое впечатление, что после записи в DR автомат вхолостую отрабатывает сдвиг регистра ничего не выдавая на ножку и после одного холостого цикла уже забирает данные из DR. При одновременной работе нескольких портов теряется первый или второй байт в передаваемой последовательности или даже первый со вторым переставляются местами (во всех портах или в каком то одном , картина может меняться при изменении кода). Причем, даже в длинной последовательности все остальные байты передаются нормально. Это возникает при как при одновременной работе нескольких портов так и если оставить один порт. Инициирование USART //Инициируем UARTы void USART1_INI(unsigned char spd, unsigned char par, unsigned char stp) //spd - скорости обмена // 10 115200 // 9 57600 // 8 38400 // 7 19200 // 6 9600 // 5 4800 // 4 2400 // 3 1200 // 2 600 //par - паритет // 0 без паритета // 1 нечетный паритет // 2 четный паритет //stp - число стоп битов // 0, 1 - 1 // 2 - 2 // // // { GPIO_InitTypeDef GPIO_InitStructure; short unsigned int i; //********************************************************* //Конфигурируем ножки под ввод вывод //включаем тактирование портов RCC->APB2ENR|=RCC_APB2ENR_IOPAEN;//GPIOA //TX1 PA9 //Ножка назначается на вывод пуш пуль GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init( GPIOA , &GPIO_InitStructure); //RX1 PA10 //Ножка назначается на ввод GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init( GPIOA , &GPIO_InitStructure); USART1->CR1=0; USART1->CR1|=USART_CR1_UE;//включили UART USART1->CR1&=~USART_CR1_M;//8 бит USART1->CR1&=~USART_CR1_WAKE;// пробуждение по IDLE LINE //if(par==0){ USART1->CR1&=~USART_CR1_PCE;//без паритета USART1->CR1&=~USART_CR1_PS;// нечетный паритет USART1->CR1&=~USART_CR1_M;//8 бит // } if(par==1){ USART1->CR1|=USART_CR1_PCE;//паритет USART1->CR1|=USART_CR1_PS;// нечетный паритет USART1->CR1|=USART_CR1_M;//9 бит } if(par==2){ USART1->CR1|=USART_CR1_PCE;//паритет USART1->CR1&=~USART_CR1_PS;// четный паритет USART1->CR1|=USART_CR1_M;//9 бит } USART1->CR1|=USART_CR1_PEIE;//общее разрешение прерывания // USART1->CR1|=USART_CR1_TXEIE;//разрешение прерывания по опустошению буфера передачи USART1->CR1&=~USART_CR1_TXEIE;//запрещение прерывания по опустошению буфера передачи USART1->CR1&=~USART_CR1_TCIE;//запрещено прерывание от "передача закончена" //USART1->CR1|=USART_CR1_TCIE;// прерывание от "передача закончена" USART1->CR1|=USART_CR1_RXNEIE;// разрешение прерывания по приему USART1->CR1&=~USART_CR1_IDLEIE;//запрещено прерывание от IDLE USART1->CR1|=USART_CR1_TE;//передатчик включен USART1->CR1|=USART_CR1_RE;//приемник включен USART1->CR1&=~USART_CR1_RWU;//приемник в активном режиме USART1->CR1&=~USART_CR1_SBK;//запрос передачи длинного 0 выключен USART1->CR2=0; //if(stp<=1){//1 стоп USART1->CR2&=~USART_CR2_STOP;//1 стоп // } if(stp==2){//2 стоп USART1->CR2&=~USART_CR2_STOP;//1 стоп USART1->CR2|=USART_CR2_STOP_1;//2 стоп } USART1->CR3=0; USART1->SR&=0;//Флаги всех прерываний сбросили USART1->BRR=0X0480;//19200 if(spd==10){ USART1->BRR=0X00C0;//115200 } // готовим буферы обмена //#define rx_buf_long 256 //#define tx_buf_long 256 i=0; while(i<rx_buf_long){ rx_buf1[i]=0; i++; } i=0; while(i<tx_buf_long){ tx_buf1[i]=0; i++; } USART1->SR=0;//СБРАСЫВАЕМ ФЛАГИ // CTS // LBD // TC // RXNE // IDLE // NE // rx_ptr1=0; tx_ptr1=0; //индекс последнего передаваемого элемента буфера tx_last1=0; rx_state1=0; tx_state1=0; } Само прерывание от одного порта void USART1_IRQHandler(void) { //прием if((USART1->SR&USART_SR_RXNE)!=0) {//что то пришло USART1->SR&=~USART_SR_RXNE;//сбросим флаг rx_buf1[rx_ptr1]=USART1->DR; if(rx_ptr1<rx_buf_long){ rx_ptr1++; } }//что то пришло //передача if((USART1->SR&USART_SR_TC)!=0) {//данные переписались из буфера в сдвиговый регистр и ушли из него if(tx_state1==1){//идет передача USART1->SR&=~USART_SR_TC;//сбросим флаг if(tx_ptr1>=tx_last1){//ушел последний байт tx_state1=0; GPIOC->ODR &= ~GPIO_ODR_ODR4;// смотрим этой ножкой момент, когда закончилась передача USART1->CR1&=~USART_CR1_TCIE ; }//ушел последний байт else{//передаем дальше tx_ptr1++; USART1->DR=tx_buf1[tx_ptr1]; }//передаем дальше }//идет передача else{//фантомное прерывание- мы ничего не должны передавать USART1->CR1&=~USART_CR1_TCIE ;//сбросим разрешение этого прерывания }//фантомное прерывание- мы ничего не должны передавать }//данные переписались из буфера в сдвиговый регистр USART1->SR=0; } и затравка которая начинает передачу: InitGPIO(); Init_OSC_my();//инициализация и переключение синхронизации USART1_INI(3,2,2);//1200 tx_buf1[0]=0x30; tx_buf1[1]=0x31; tx_buf1[2]=0x32; tx_buf1[3]=0x33; tx_buf1[4]=0x34; tx_buf1[5]=0x35; tx_buf1[6]=0x36; tx_buf1[7]=0x37; tx_buf1[8]=0x38; tx_buf1[9]=0x39; tx_buf1[10]=0x41; tx_buf1[11]=0x42; tx_buf1[12]=0x43; tx_buf1[13]=0x44; tx_buf1[14]=0x45; tx_buf1[15]=0x46; tx_buf1[16]=0x47; tx_buf1[17]=0x48; tx_buf1[18]=0x49; tx_buf1[19]=0x4a; tx_buf1[20]=0x4b; tx_state1=1; tx_last1=20; tx_ptr1=0; __NOP(); USART1->CR1|=USART_CR1_TCIE ; GPIOC->ODR |= GPIO_ODR_ODR4;// между выставлением этой ножки и началом передачи на ножке - выдержка времени USART1->DR=tx_buf1[tx_ptr1];
  2. ну я на всякий случай обрисовал ситуацию и предложил обходной метод - у кого-то что-то такое может всплыть, причем, не обязательно по 340 серии.
  3. как написал обход на 3 регистре, так появилось прерывание от переполнения основного счетчика PCA0. что изменилось - не знаю. заремарил все что связано с 3 регистром - прерывание от переполнения основного осталось. вроде в тексте кода я никуда не лазил и состояние флагов отладчиком смотрел. непонятно.... :(
  4. придется использовать обход. Для этого счетчик 3 перевожу в режим программного таймера. В PCA0CPL3 записываю 0xffff. При этом получается прерывание при достижении 0xffff, те при переходе 0xfffe->0xffff. Ну это почти 0xffff->0x10000. Разницу в 1 надо будет учитывать при рассчетах. PCA0CPM3=0; PCA0CPM3|=0X08;//MAT=1 программный таймер PCA0CPM3|=0x01;//ECCF=1 прерывание от компаратора этого регистра PCA0CPL3=0XFF;//число для сравнения 0xFFFF PCA0CPH3=0XFF;
  5. для пробы я смотрю как генерируется прерывание по изменению состояния ножки - все генерируется. Т е и вектор по правилному адресу и в EIE1 все как надо. Единственным битом который управляет от работающей части (можно заключить, что от или, который собирает флаги массива счетчиков все работает) до неработающей остается ECF.Но он выставлен. На силабовском форуме нашел упоминание, что для 120 кристаллов был баг, что переполнение не вызывало прерывание. Народ ржал что силабовцы его не занесли в еррату, а обозвали фичей. Про 340 не нашел(первый раз за 8 лет пользования этого проца понадобился этот узел и как то сразу не пошел). void Interrupts_Init(void) { IP = 0x20; EIE1 = 0x80; IT01CF = 0x98; // IE = 0xA0; //IE ðàçðåøåíèå ïðåðûâàíèÿìè // // EA // ESPI0 // ET2 // ES0 // ET1 // EX1 // ET0 // EX0 // //EA ESPI0 ET2 ES0 ET1 EX1 ET0 EX0 // 7 6 5 4 3 2 1 0 // 80 40 20 10 8 4 2 1 // 1 - 1 - - - - - // ET2=1; //***************************** //EIE1 // // ET3 // ECP1 êîìïàðàòîð 1 // ECP0 êîìïàðàòîð 0 // EPCA0 ìàññèâ òàéìåðîâ // EADC0 // EWADC0 // EUSB0 // ESMB0 // // ET3 ECP1 ECP0 EPCA0 EADC0 EWADC0 EUSB0 ESMB0 // 7 6 5 4 3 2 1 0 // 80 40 20 10 8 4 2 1 //ET3=1; EIE1|=0X80; EIE1|=0X10;// EPCA0 //******************************** // IP // // PSPIO // PT2 // PS0 // PT1 // PX1 // PT0 // PX0 // - PSPI0 PT2 PS0 PT1 PX1 PT0 PX0 // 7 6 5 4 3 2 1 0 // 80 40 20 10 8 4 2 1 IP=0X20; //********************************* // EIP1 // // PT3 // PCP1 êîìïàðàòîð 1 // PCP0 // PPCA0 // PADC0 // PWADC0 // PUSB0 // PSMB0 // // // PT3 PCP1 PCP0 PPCA0 PADC0 PWADC0 PUSB0 PSMB0 // 7 6 5 4 3 2 1 0 // 80 40 20 10 8 4 2 1 EIP1=0X80; EA=1; } void PCA_Init(void) { PCA0MD &= ~0x40;//çàïðåòèëè ñîáàêó PCA0MD=0x00; PCA0CN=0x00; //Âèáèðàåì èñòî÷íèê òàêòèðîâàíèÿ äëÿ ðåãèñòðà-ñ÷åò÷èêà PCA0H PCA0MD&=~0x0e;//òàêòèðóåì îò SYSCLK/12 // PCA0MD|=0x02;//òàêòèðóåì îò SYSCLK/4 // PCA0MD|=0x04;//òàêòèðóåì îò T0 // PCA0MD|=0x06;//òàêòèðóåì îò íîæêè ECI // PCA0MD|=0x08;//òàêòèðóåì îò SYSCLK PCA0MD|=0x0A;//òàêòèðóåì îò EXOSC/8 EA=1; EIE1|=0X10; PCA0MD|=0x01;//ECF=1 ðàçðåøàåì ïðåðûâàíèå //PCA0MD&=~1;//ECF=0 ðàçðåøàåì ïðåðûâàíèå PCA0H=0; PCA0L=0; PCA0CPM0=0; PCA0CPM1=0; PCA0CPM2=0; PCA0CPM3=0; PCA0CPM4=0; // PCA0CPM5=0; //íà÷èíàåì ñ÷åò PCA0MD&=~0X80;//CIDL=0; //PCA0MD|=0X80;//CIDL=1; PCA0CN|=0x40;//CR=1 ðàçðåøàåì ñ÷åò //PCA0CN = 0x40; // PCA0MD &= ~0x40; // PCA0MD = 0x0B; // PCA0CPL4 = 0x00; // PCA0MD |= 0x40; //ïåðåâîäèì 0 çàùåëêó â ðåæèì çàõâàòà ïî ïåðåõîäó 0->1 //PCA0CPM0|=0x20;//çàõâàò ïî ïåðåõîäó 0->1 PCA0CPM0|=0x10;//çàõâàò ïî ïåðåõîäó 1->0 PCA0CPM0|=0x01;//ïåðåõîä âûçîâåò ïðåðûâàíèå }
  6. Отсмотрел все. Прерывание разрешено : ECF в PCA0MD выставлен, EPCA0 в EIE1 выставлен. Видно, что счетчик считает и что флаг CF в PCA0CN выставляется. А прерывания нет. Процессор 340.
  7. Отладка Silabsov

    ускоряет процесс появления хоть какого-то сообщения винды отключение и подключение адаптера от целевой платы.
  8. ну да. за 19 лет первый раз вижу такую запись. :rolleyes: пад сталом я смотрел - там нету
  9. не простая функция и приглядывать надо при использовании. пользую в 51 процессоре. озу осталось байт 300. сомневаюсь, что использует стек в регистрах, но если народ знает в каком месте print sprintf творит свое черное дело, то милости просим высказаться. ps вот как только я стал писать параноидально, ручками раскладывая каждый байтик - эффект исчез. const char specif[] = "%4.2f\0"; неплохо, но на самом деле же писал что спецификатор надо в ряде случаев менять . sprintf(out_line, "%*.*f", digits, decimals, in_val); вот это интересно
  10. вот что увидел . детально как всегда нет времени. стал использовать строку в которой формирую спецификатор. Это нужно когда скажем меняем число знаков после запятой и что-то такое. unsigned char specif[8]; float in_val; unsigned char out_line[16]; memset(out_line,0,sizeof(out_line)); memset(specif,0,sizeof(specif)); specif[0]='%'; specif[1]='4'; specif[2]='.'; specif[3]='2'; specif[4]='f'; specif[5]=0;//это очень важно //строка должна оканчиваться нулем (там выше вся строка обнулена, но это подчеркивает обязательность нуля) и используем это sprintf(out_line,specif,in_val); важно, чтобы в строке , в которой записывается спецификация, после полезной части был обязательно 0. Собственно, это определение строки. Если нуля нет , то результат будет как я описывал изначально: мусор на неопределенную глубину , причем, результат изменяется от запуска к запуску (собственно программа пошла гулять по озу пока не нарвется на 0).
  11. во франклине (для работы с плав арифметикой не использую, но спецэффект видел) и в кейле сталкиваюсь с тем, что sprintf мусорит в строке после полезной части. при выводе плавающего числа со спецификатором f4.1 после полезной части кидается еще байт так 9 мусора. обычно обхожу это тем, что завожу большую строку с запасом, фактически для вывода плавающего числа по спецификатору f4.1 требуется строка длиной 24 байта (с некоторым запасом), но может быть кто- то нашел лечилку? в порядке пожарного бубна может кому срочно поможет, как посмотрю подробнее еще отпишусь. вроде бы мусор исчезает, если вызвать последовательно сначала sprintf без поля точности: sprintf(...,"%f",....) и сразу же еще раз, но уже как нам нужно sprintf(...,"%4.3f",...).
  12. За все годы, что читаю форум, самое доброе объявление.
  13. Заранее поздравляю коллег с праздниками. Желаю здоровья близким . Поменьше маразма и побольше позитива! :)
  14. Хе! Тут за последний час удалили целый опрос на соседней ветке, а вы про общение сожалеете. Конечно возвращать.
  15. Проголосовал За, хотя последний мордобой из-за дом животных показал, что нет такой темы, на которой бы нельзя было устроить кулачные бои. Есть много тем, которые нужно обсудить с коллегами, незачем ими заваливать остальной форум (хотя бы о базовах станциях на доме). Теоретически можно ввести подраздел Гайд парк (который неминуемо трансформируется в клоаку) в котором и собачится. Кто будет модерировать - бАльшой вопрос . Читать весь срач изо дня в день отдельная ноша. Похуже программы Время. Боюсь на молоко придется скидываться. PS ветка отлично выявляла буйных :) Но на остальных разделах все было путем.
  16. По сети периодитски бегают киловольты. Нормальные источники питания и нагревательные приборы их почти не замечают. Ваш динистор будет отфигачивать квартиру аккурат раз 10 за сутки. Но проблема актуальна - раз в 10 лет ноль на ближайшей подстанции отваливается. Но больший врем ИМХО конечно медвепуты приносят, автомат от этого уже придуман.
  17. Ну зачем вам этот контроллер? Вы его наспех сваяли, и чего с этим делать будете? Из любви к искусству? Но наспех кое как нафига это надо. Да еще ARM и это после вопросов по кондюкам. С ума сойти можно. И цена такого самообразования? Если уж делать, то какой-нибудь 89с52. За полгода осилили бы прогу какую в него написать. Здесь народ такого не любит.
  18. Тока одна штука стоит рублев 220. Вообще стало забавно, надо на форум ВМА сходить, как там врачи дипломы получают?
  19. Я бы не заморачивался и кондюки 3, 4, 5, 7, 8, 9, 10, 15, 16 , 17, 18, 19, 20 по 1 микрофараде керамику и всего делов то. Про С7,8,9,10 - товарисча, который аккуратненько рисовал приведенную схему смутило наличие полярности на обозначениях выводов микрухи. Эти полярности показывают какое напряжение на этой ножке будет появляться при работе внутренних ключей. Это не руководство к постановке электролита. С1 С2 С17 С19 можно тоже одной емкости 10 мкф на 10 вольт. Особо номиналы изобретать не стоит. В производстве (нормальном) стараются номенклатуру уменьшать. Итого вам надо найти 3 коньдюка в любом каталоге мюраты хитано эпкоса: на кварц керамику, на блокировку питания керамику, электролит на питание. Пусть электролит будет EHR 10 мк 16 вольт Хитано Керамика R15 N 330 J 1E L 2 - 33пф NPO 25 вольт Мюрата R25 Y 105 Z 1H L 5 - 1 микрофарада Z5U 50 вольт Мюрата
  20. Ага! ага! Вот что значит - Первомай шагает по стране! И вас так же! Скажем так: всем кто паяет - большого здоровья! 73! 88!
  21. Крепко позабавило про скважность. Это мы не чайник греем и не действующее значение определяем. Если есть источник радиации с мощностью, скажем 1 рентген/час, то сомнительно успокаивать себя мыслью , что оказавшись под его излучением на секундочку, но каждые три часа, в среднем даже и не опасно.
  22. Без растяжек просто нет условий для правильной работы приемника прибора.
  23. Там целое закулисье , мы скоро все узнаем.
  24. Задача которую вам подсунули - авантюра.
×
×
  • Создать...