| Форум РадиоКот https://radiokot.ru/forum/ |
|
| stm32 eeprom https://radiokot.ru/forum/viewtopic.php?f=59&t=172856 |
Страница 1 из 1 |
| Автор: | ivan dimir [ Сб сен 19, 2020 22:44:14 ] |
| Заголовок сообщения: | stm32 eeprom |
Уже не один вечер пітаюсь запустить стм32 с eeprom для сохранения данных .Контроллер гаснет в прямом смысле слова .когда выполняется комада (чтения eeprom) Код: Код: /* * main.c * * Created on: 12 авг. 2020 г. * Author: Ivan */ #include"main.h" #include<stdio.h> #define button1 // GPIOA->IDR &GPIO_IDR_ID6 #define button2 // GPIOA->IDR &GPIO_IDR_ID7 //#include"#include"main.h"lcd2.h" volatile unsigned int pauza=0; volatile unsigned int pauza_1=0; volatile unsigned char flag1=0; volatile unsigned char flag=0; volatile unsigned char flag2=0; volatile unsigned int b,c; volatile unsigned char b1,b2,c1,c2,t1,t2; volatile unsigned int t,m; volatile unsigned char menu=0; volatile unsigned char menu_en=0; volatile unsigned char menu_eep=0; volatile unsigned int adc_data1=0; volatile unsigned int adc_data2=0; volatile unsigned int adc_data3=0; volatile unsigned int adc_data4=0; char bufer1[16]={}; char bufer2[16]; char bufer3[16]; uint16_t temp; uint16_t ADC_Data[4]; //#define z 0xB1//Я typedef unsigned char byte; //переопределяем тип void delay_ms(int a) { int i = 0; int f = 0; while(f < a) { while(i<60) {i++;} f++; } } uint8_t bii [8]= { 0B00000, 0B00000, 0B01010, 0B00100, 0B00100, 0B00100, 0B00100, 0B00000 }; uint8_t bk [8]= { 0B00000, 0B00000, 0B01001, 0B01010, 0B01100, 0B01010, 0B01001, 0B00000 }; uint8_t bj [8]= { 0B00000, 0B00000, 0B10101, 0B01110, 0B00100, 0B01110, 0B10101, 0B00000 }; uint8_t bm[]= { 0B00000, 0B00000, 0B10001, 0B11011, 0B10101, 0B10001, 0B10001, 0B00000 }; uint8_t bn[]= { 0B00000, 0B00000, 0B10010, 0B10010, 0B11110, 0B10010, 0B10010, 0B00000 }; uint8_t biu[]= { 0B00000, 0B00000, 0B10111, 0B10101, 0B11101, 0B10101, 0B10111, 0B00000 }; uint8_t iorp[]= { 0b00000, 0b01100, 0b11110, 0b11110, 0b01111, 0b00111, 0b00011, 0b00001 }; uint8_t ior2p[]= { 0b00000, 0b00110, 0b01111, 0b01110, 0b11110, 0b11100, 0b11000, 0b10000 }; void init_IWDGtimer(void) { RCC->CSR|= RCC_CSR_LSION; IWDG->KR = 0x5555; // Access to registers IWDG->PR&= ~(IWDG_PR_PR_0 | IWDG_PR_PR_1 | IWDG_PR_PR_2); // 4096 IWDG->RLR =250;//0x7FF; while (!((IWDG->SR & IWDG_SR_PVU) && (IWDG->SR & IWDG_SR_RVU))){} // wait while bist of PVU and RVU will be set. IWDG->KR = 0xCCCC; // Start count down; } void program1(void) { if(pauza==1) { lcd_clear(); lcd_set_xy(0, 0); // IWDG->KR = 0xAAAA; } if(pauza==20) { //PORTC13_ON; lcd_clear(); lcd_set_xy(0, 0); lcd_send(2,DATA); } if(pauza==35) { // PORTC13_OF; lcd_clear(); lcd_set_xy(0, 0); lcd_send('a',DATA); lcd_send(2,DATA); // pauza=0; } if(pauza==50) { lcd_clear(); lcd_set_xy(0, 0); // lcd_set_user_char(0, bii); // lcd_set_user_char(1, bj); lcd_send(1,DATA); lcd_send('a',DATA); lcd_send(2,DATA); } if(pauza==65) { lcd_clear(); //lcd_set_user_char(0, bii); // lcd_set_user_char(1, bj); lcd_set_xy(0, 0); lcd_send(0,DATA); lcd_send(1,DATA); lcd_send('a',DATA); lcd_send(2,DATA); //pauza=0; } if(pauza==80) { lcd_clear(); lcd_set_xy(0, 0); lcd_send(' ' ,DATA); lcd_send( 0 ,DATA); lcd_send(1,DATA); lcd_send('a',DATA); lcd_send(2,DATA); //pauza=0; } if(pauza==95) { lcd_clear(); // lcd_set_xy(0, 0); // lcd_set_user_char(0, bii); // lcd_set_user_char(1, bj); lcd_set_xy(0, 0); lcd_send(' ',DATA); lcd_send(' ',DATA); lcd_send( 0 ,DATA); lcd_send(1,DATA); lcd_send('a',DATA); lcd_send(2,DATA); lcd_set_xy(0, 1); lcd_send(3,DATA); lcd_send('e',DATA); lcd_send(4,DATA); lcd_send(5,DATA); lcd_send(' ',DATA); lcd_send( 3 ,DATA); lcd_send('a',DATA); lcd_send( 3 ,DATA); lcd_send('a',DATA); // lcd_out("mama"); // pauza=0; } // IWDG->KR = 0xAAAA; } void program2(void) { // TIM3->CNT=0; // lcd_clear(); lcd_set_xy(0, 0); lcd_send(' ',DATA); lcd_send(' ',DATA); lcd_send( 0 ,DATA); lcd_send(1,DATA); lcd_send('a',DATA); lcd_send(2,DATA); lcd_send(' ',DATA); lcd_send(3,DATA); lcd_send('e',DATA); lcd_send(4,DATA); lcd_send(5,DATA); lcd_set_xy(0, 1); // lcd_send(' ',DATA); // lcd_send('b',DATA); // lcd_send('=',DATA); // lcd_send(b/10+0x30,DATA); //lcd_send(b%10+0x30,DATA); //lcd_send(b%100+0x30,DATA); // b1=b/256; // b2=b%256; //TIM3->CNT=b; // t=0; lcd_send(' ',DATA); lcd_send(' ',DATA); sprintf(bufer1,"b=%4d",b); lcd_out(bufer1); // lcd_send(' ',DATA); // flag2=1; b2=b/256; b1=b%256; // Delay(40); // IWDG->KR = 0xAAAA; // } } void program3(void) {// // lcd_clear(); lcd_set_xy(0, 0); lcd_send(' ',DATA); lcd_send(' ',DATA); lcd_send( 0 ,DATA); lcd_send(1,DATA); lcd_send('a',DATA); lcd_send(2,DATA); lcd_send(' ',DATA); lcd_send(3,DATA); lcd_send('e',DATA); lcd_send(4,DATA); lcd_send(5,DATA); // t=700; // t=TIM3->CNT; lcd_set_xy(0,1); //lcd_send(' ',DATA); // lcd_send('t',DATA); //lcd_send('=',DATA); //lcd_send(t/10+0x30,DATA); //lcd_send(t%10+0x30,DATA); // lcd_send(t%100+0x30,DATA); //t1=t/256; // t2=t%256; lcd_send(' ',DATA); lcd_send(' ',DATA); sprintf(bufer2,"t=%4d",t); lcd_out(bufer2); //IWDG->KR = 0xAAAA; } void program4(void) { // lcd_clear(); lcd_set_xy(0, 0); lcd_send(' ',DATA); lcd_send(' ',DATA); lcd_send( 0 ,DATA); lcd_send(1,DATA); lcd_send('a',DATA); lcd_send(2,DATA); lcd_send(' ',DATA); lcd_send(3,DATA); lcd_send('e',DATA); lcd_send(4,DATA); lcd_send(5,DATA); // t=700; // c=TIM3->CNT; lcd_set_xy(0,1); // lcd_send(' ',DATA); //lcd_send('c',DATA); // lcd_send('=',DATA); //lcd_send(c/10+0x30,DATA); // lcd_send(c%10+0x30,DATA); // lcd_send(c%100+0x30,DATA); // c1=c/256; // c2=c%256; // TIM3->CNT=c; lcd_send(' ',DATA); lcd_send(' ',DATA); sprintf(bufer3,"c= %4d",c); lcd_out(bufer3); } void Calbac (void) { ADC_Data[0]=ADC1->JDR1; ADC_Data[1]=ADC1->JDR2; ADC_Data[2]=ADC1->JDR3; ADC_Data[3]=ADC1->JDR4; //TIM4->CCR3=ADC_Data[2]; // TIM4->CCR3=ADC_Data[0]; //TIM4->CCR3=ADC_Data[2]; } int main(void) { //I2C1_readByteByADDR1(1,0); //char bufer1[16]; //lcd_delay(); //int b; //init_IWDGtimer(); ./ AHB1ER_init(); i2c1_AF_init(); i2c1_init(); // lcd_clear(); I2C1_readByteByADDR1(0x02,b); //I2C1_readByteByADDR1(0x11,b1); PORT_init(); timer1_init(); timer2_init(); AFR_init_time3(); timer3_init(); AFR_init_time4(); time4_init(); time5_init(); timer6_init(); adc3_init_regular(); adc1_init_inject(); //lcd_init_GPIO(); // str_lcd("string"); //I2C1_readByteByADDR1(1,0); //I2C1_readByteByADDR1(3,2); //I2C1_readByteByADDR1(5,4); // I2C1_readByteByADDR1(7,6); //I2C1_readByteByADDR1(9,8); //I2C1_readByteByADDR1(11,10); // LCD_Clear(); ADC1->CR1|= ADC_CR1_JEOCIE; ADC1->CR2 |= ADC_CR2_ADON; NVIC_EnableIRQ ( ADC_IRQn); ADC3->CR2|=ADC_CR2_EXTSEL_2 |ADC_CR2_EXTSEL_1; ADC1->CR2|=ADC_CR2_JEXTSEL_1 |ADC_CR2_JEXTSEL_0; //ADC1->CR2|=ADC_CR2_JSWSTART; //LCD_init1(); lcd_init(); //(); //lcd_set_state(LCD_ENABLE, CURSOR_ENABLE, BLINK); lcd_set_user_char(0, bii); lcd_set_user_char(1, bj); lcd_set_user_char(2, bk); lcd_set_user_char(3, bm); lcd_set_user_char(4, bn); lcd_set_user_char(5, biu); // Наша рыба это символ номер ноль // lcd_out("This is fish"); //Выводим надпись в нулевую строку // lcd_set_xy(0,1); //переводим курсор в первую строку //lcd_send(0,DATA); // lcd_send(1,DATA); //lcd_send('a',DATA); //Выводим символ номер ноль // lcd_set_state(LCD_ENABLE, CURSOR_ENABLE, BLINK); //lcd_set_state(LCD_ENABLE,CURSOR_ENABLE,NO_BLINK); //lcd_clear(); //lcd_set_state(LCD_ENABLE,CURSOR_ENABLE,NO_BLINK); //InitialLCD(); //ClearLCD(); //Cursor(0,2); //lcd_out("mama"); //PrintStr("MAMA"); //lcd_set_xy(0, 1); //lcd_out("mama"); //lcd_set_xy(6, 6); //lcd_out("papa"); //lcd_send('X',DATA); // lcd_send('y',DATA); //lcd_send('e',DATA); // clearlcd(); // str_lcd("string"); // delay_ms(50); init_IWDGtimer(); b=((unsigned int) b1<<8)|b2; c=((unsigned int )c1<<8)|c2; t=((unsigned int) t1<<8)|t2; while(1) { if(menu==0) { program1(); } if(menu==1) { program2(); Delay(50); } if(menu==2) { program3(); Delay(50); } if(menu==3) { program4(); Delay(50); } if(menu==4) { menu=0; } } } Код: #include"main.h" #define I2C_REQUEST_WRITE 0x00//0 #define I2C_REQUEST_READ 0x01 #define EEPROM_ADDRESS 0b1010000 #define I2C_OWNADDRESS1_7BIT 0x00004000U void i2c1_AF_init(void) { GPIOB->AFR[0]&=~GPIO_AFRL_AFSEL7_0; GPIOB->AFR[0]&=~GPIO_AFRL_AFSEL7_1; GPIOB->AFR[0]|=GPIO_AFRL_AFSEL7_2 ; GPIOB->AFR[0]&=~GPIO_AFRL_AFSEL7_3; GPIOB->AFR[0]&=~GPIO_AFRL_AFSEL6_0; GPIOB->AFR[0]&=~GPIO_AFRL_AFSEL6_1; GPIOB->AFR[0]|=GPIO_AFRL_AFSEL6_2; GPIOB->AFR[0]&=~GPIO_AFRL_AFSEL6_3; } void i2c1_init(void) { GPIOB->MODER|=GPIO_MODER_MODE7_1; GPIOB->MODER&=~GPIO_MODER_MODE7_0; GPIOB->OTYPER|=GPIO_OTYPER_OT7; GPIOB->MODER|=GPIO_MODER_MODE6_1; GPIOB->MODER&=~GPIO_MODER_MODE6_0; GPIOB->OTYPER|=GPIO_OTYPER_OT6; RCC->APB1ENR|=RCC_APB1ENR_I2C1EN; I2C1->CR2&=~I2C_CR2_FREQ_2 ; I2C1->TRISE=9; I2C1->CCR&=~I2C_CCR_FS; //I2C1->OAR1|=I2C_OAR1_ADD0 | I2C_OAR1_ADD1_7 | I2C_OAR1_ADD8_9 | I2C_OAR1_ADDMODE; I2C1->OAR1|= I2C_OWNADDRESS1_7BIT; //I2C1->CR1|=I2C_CR1_SMBUS | I2C_CR1_SMBTYPE | I2C_CR1_ENARP; I2C1->CR1|=I2C_CR1_ACK; I2C1->OAR2|=I2C_OAR2_ADD2; I2C1->CR1|=I2C_CR1_PE; } void I2C1_SendByteByADDR1(uint16_t adres,uint8_t data) { //uint8_t data2; I2C1->CR1|=I2C_CR1_ACK; I2C1->CR1|=I2C_CR1_START; while(!(I2C1->SR1&I2C_SR1_SB)) { } (void) I2C1->SR1; I2C1->DR|= EEPROM_ADDRESS |I2C_REQUEST_WRITE; //I2C1->DR|= addr | I2C_REQUEST_WRITE;// while (!(I2C1->SR1& I2C_SR1_ADDR)) { } (void) I2C1->SR1; (void) I2C1->SR2; I2C1->DR|=(uint8_t)adres;// while (!(I2C1->SR1& I2C_SR1_TXE)) { } I2C1->DR|=(uint8_t) (adres>>8) ;// while (!(I2C1->SR1 & I2C_SR1_TXE)) { } I2C1->DR|=data; while (!(I2C1->SR1 & I2C_SR1_BTF)) { } I2C1->CR1|=I2C_CR1_STOP; } void I2C1_readByteByADDR1(uint16_t adres,uint8_t data) { //uint8_t data2; //uint8_t data1; I2C1->CR1|=I2C_CR1_ACK; I2C1->CR1|= I2C_CR1_START; while (!(I2C1->SR1& I2C_SR1_SB)){} (void) I2C1->SR1; I2C1->DR|= EEPROM_ADDRESS |I2C_REQUEST_WRITE; // I2C1->DR|= SLAVE_OWN_ADDRESS | I2C_REQUEST_WRITE; while (!(I2C1->SR1& I2C_SR1_ADDR)){} (void) I2C1->SR1; (void) I2C1->SR2; //Transmit Address begin EEPROM I2C1->DR|= (uint8_t) adres; while (!(I2C1->SR1& I2C_SR1_TXE)){} I2C1->DR|=(uint8_t) (adres>>8); while (!(I2C1->SR1& I2C_SR1_TXE)){} I2C1->CR1 |= I2C_CR1_START; while (!(I2C1->SR1 & I2C_SR1_SB)){} (void) I2C1->SR1; I2C1->DR = EEPROM_ADDRESS|I2C_REQUEST_READ; while (!(I2C1->SR1 & I2C_SR1_ADDR)){} (void) I2C1->SR1; (void) I2C1->SR2; I2C1->CR1 &= ~I2C_CR1_ACK; while (!(I2C1->SR1 & I2C_SR1_RXNE)){} data= I2C1->DR; // while (!(I2C1->SR1 & I2C_SR1_RXNE)){} //data2 =I2C1->DR; I2C1->CR1 |= I2C_CR1_STOP; // return data; // Delay(5); } void i2c2_AF_init(void) { GPIOB->AFR[1]&=~GPIO_AFRH_AFSEL10_0; GPIOB->AFR[1]&=~GPIO_AFRH_AFSEL10_1; GPIOB->AFR[1]|=GPIO_AFRH_AFSEL10_2 ; GPIOB->AFR[1]&=~GPIO_AFRH_AFSEL10_3; GPIOB->AFR[1]&=~GPIO_AFRH_AFSEL11_0; GPIOB->AFR[1]&=~GPIO_AFRH_AFSEL11_1; GPIOB->AFR[1]|=GPIO_AFRH_AFSEL11_2; GPIOB->AFR[1]&=~GPIO_AFRH_AFSEL11_3; } void i2c2_init(void) { GPIOB->MODER|=GPIO_MODER_MODE10_1; GPIOB->MODER&=~GPIO_MODER_MODE10_0; GPIOB->OTYPER|=GPIO_OTYPER_OT10; GPIOB->MODER|=GPIO_MODER_MODE11_1; GPIOB->MODER&=~GPIO_MODER_MODE11_0; GPIOB->OTYPER|=GPIO_OTYPER_OT11; //RCC->APB1ENR|=RCC_APB1ENR_I2C2EN; } |
|
| Автор: | Мурик [ Сб сен 19, 2020 23:39:59 ] |
| Заголовок сообщения: | Re: stm32 eeprom |
ivan dimir писал(а): когда выполняется комада (чтения eeprom) На I2C?Я полагаю мы должны также догадаться в какой строке виснет? Что за манера написать "на работает" и вывалить код и пусть помогающие догадываются что не работает. Так задавая вопросы, вероятно ответа не получите. |
|
| Автор: | ivan dimir [ Сб сен 19, 2020 23:43:47 ] |
| Заголовок сообщения: | Re: stm32 eeprom |
Ну подсказать хоть можно.Где собака зарыта?Вы сразу в штыки .Это же форум для людей.Или как? |
|
| Автор: | Мурик [ Вс сен 20, 2020 00:14:07 ] |
| Заголовок сообщения: | Re: stm32 eeprom |
ivan dimir писал(а): Ну подсказать хоть можно. Где собака зарыта? Что подсказать? По коду сразу не скажешь что не так. Нужно запустить под отладчиком, посмотреть логическим анализатором и т. д.Может у вас ошибка в схеме или забыли резисторы на I2C и может eeprom неисправна или неправильный адрес. Откуда мы можем это знать? С теми сведениями что вы предоставили можно только гадать что не так. Или вы полагаете что тут экстрасенсы? ivan dimir писал(а): Вы сразу в штыки. Неужели вы не понимаете что предоставили очень мало данных чтобы можно было помочь? Разве тут форум экстрасенсов?ivan dimir писал(а): Это же форум для людей. Отвечающие (помогающие вам) тоже люди или нет? Вот вы хотите нормальных ответов, а вопрос задали так что ответить по существу сложно.Если и так дальше будете задавать вопросы, ответов по существу не будет. Не потому что не хотят помогать, просто вопрос задан неправильно. Напишите подробнее что неправильно работает, в каком месте виснет. Что при этом на шине I2C и т. д. и тогда возможно напишут в чем причина. |
|
| Автор: | VladislavS [ Вс сен 20, 2020 00:18:58 ] |
| Заголовок сообщения: | Re: stm32 eeprom |
Подсказать можно. Работа с I2C неправильная совсем. Там даже не имеет смысла ошибки искать, всё надо переписывать с нуля. Да, собственно, и всё остальное тоже. Не надо вам программированием заниматься, не ваше это. А вы могли бы оформлять свои сообщения нормально, чисто из уважения к читающим? |
|
| Автор: | ivan dimir [ Вс сен 20, 2020 05:51:48 ] |
| Заголовок сообщения: | Re: stm32 eeprom |
спапсибо не наше это . while (!(I2C1->SR1& I2C_SR1_ADDR)) { } Виснет(гаснет) вот на этой строке .Всё написано не мною.Проверено в референс мануал.Вроде всё сходится.Да и в кубе тоже самое. Добавлено after 7 minutes 3 seconds: Да и ещё дюдюке.Не боги обжигали горшки. В stm32 сложная структура микросхемы .И они разные серии.А на русском объяснений мало.Не судите ибо вы судимы будете. Добавлено after 54 minutes 16 seconds: дюдюка сразу родился программистом высокого класса. |
|
| Автор: | ivan dimir [ Вс сен 20, 2020 09:31:05 ] |
| Заголовок сообщения: | Re: stm32 eeprom |
У вас одна пустота.По поводу ошибок.Да я ошибаюсь.Кто не ошибается тот ни чего не делает.По поводу присваивания я ещё со школы знал.Только в практике сыроват.Контроллер СТМ для меня новый.Не судите.У вас один большой пробел.Не не берите в голову..Я не хотел вас профи ни обидеть ни унизить.Я считаю если человек хочет знать.Я ему инфу для размышления кину.А он пускай сам думает как эту ситуацию разруливать.Сегодня СТМ.Вчера АВР.Пик контроллеры.А завтра что. Это правда всё философия.Подводные камни в СТМ .Я наткнулся на один из них. Добавлено after 18 minutes 47 seconds: Да это не причина.Я всё устранил.И воз и ныне там. |
|
| Автор: | VladislavS [ Вс сен 20, 2020 11:36:47 ] |
| Заголовок сообщения: | Re: stm32 eeprom |
Да это не причина.Я всё устранил.И воз и ныне там. Причина не только это. Всё надо с нуля переписывать. Там неправильного кода больше чем правильного.
|
|
| Автор: | 240265 [ Вс сен 20, 2020 11:40:37 ] |
| Заголовок сообщения: | Re: stm32 eeprom |
ivan dimir, "Подводные камни в СТМ .Я наткнулся на один из них." Если бы один, у тебя сплошной камнепад от нежелания самостоятельно искать выход путем изучения материалов. |
|
| Автор: | ivan dimir [ Вс сен 20, 2020 13:15:42 ] |
| Заголовок сообщения: | Re: stm32 eeprom |
Вы дайте материал для раздумия у меня яндекс не катит.У нас на Украине яндекс не идёт.А что имменно не правильно.Порты определены как альтернативная функция оупен-дроайн.А по поводу функций.Так я у ваших спецов перипесал. |
|
| Автор: | 240265 [ Вс сен 20, 2020 13:47:30 ] |
| Заголовок сообщения: | Re: stm32 eeprom |
Кроме яндекса больше поисковиков нет? Или даже на это смекалки не хватает??? Переписывать тоже с УМОМ нужно. Ни кто Вам материал не даст т.к. Вы не хотите приложить хоть какие-то усилия к поиску. |
|
| Автор: | ivan dimir [ Вс сен 20, 2020 15:00:18 ] |
| Заголовок сообщения: | Re: stm32 eeprom |
Это библиотека SPL? Добавлено after 22 minutes 50 seconds: она мне ничего не даст одни команды. |
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


