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

Isaev_ivan

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

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

  • Посещение

Репутация

0 Обычный

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

  • Звание
    Участник
    Участник
  1. Добрый день! Пишу в iar для arm. До этого писал на си, а сейчас захотелось более подробно узнать о работе ядра. Для этого решил создать ассемблерный проект и тут же появились ошибки. Ниже приведен листинг программы: asm.s: NAME example_project PUBLIC __vector_table PUBLIC __iar_program_start INCLUDE startup_stm32f303xc.s __iar_program_start B main SECTION .text : CODE (2) THUMB main NOP B main END Файл startup_stm32f303xc.s(немного укороченный): Stack_Size EQU 0x2000 SECTION SET_STACK:DATA:NOROOT(3) CSTACK DS32 Stack_Size __initializ_sp Heap_Size EQU 0x2000 SECTION SET_HEAP:DATA:NOROOT(3) HEAP DS32 Heap_Size __heap_limit DATA __vector_table DCD __initializ_sp DCD Reset_Handler ; Reset Handler DCD NMI_Handler ; NMI Handler DCD HardFault_Handler ; Hard Fault Handler DCD MemManage_Handler ; MPU Fault Handler DCD BusFault_Handler ; Bus Fault Handler DCD UsageFault_Handler ; Usage Fault Handler DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved DCD SVC_Handler ; SVCall Handler DCD DebugMon_Handler ; Debug Monitor Handler DCD 0 ; Reserved DCD PendSV_Handler ; PendSV Handler DCD SysTick_Handler .... .... Файл я немного изменил по аналогии со стартап файлом кейла. В итоге появляются 2 предупреждения (скриншоты ниже). Вроде как не верная инициализация таблицы векторов и вершины стека. Добавление стартап файла iar порождает те же предупреждения. Кто-нибудь может подсказать в чем дело?
  2. Проблема разрешилась тактированием АЦП от PLL. В связи с этим назрел новый вопрос. Когда пишу код: void establish_clock() { RCC->CR = 0x00001183; RCC->CFGR = 0; ............... ............... значения регистров CR и CFGR не меняются никак! На си начал писать недавно и буду признателен, если кто-нибудь объяснит, почему ничего не происходит:) заранее благодарю!
  3. Доброго времени суток! Пытаюсь настроить АЦП на плате stm32f3discovery, ничего не выходит( вроде все делал как в мануале написано, но чего-то видимо не хватает, а чего - понять не могу. Кто подскажет буду очень признателен!:) Ниже приведен код #include "stm32f30x.h"//It should be included necessary void establish_clock(); void establish_TIM1(); void establish_int(); void establish_ports(); void TIM1_UP_TIM16_IRQHandler(void); void USART1_IRQHandler(void); void ADC1_2_IRQHandler(void); void set_USART(); void set_ADC(); #define clock 8000000 #define baudrate 19200 void main() { establish_clock(); establish_ports(); //establish_TIM1(); establish_int(); //set_USART(); set_ADC(); do{} while(1); } void establish_clock() { RCC->CR |= RCC_CR_HSION;//Сброшен бит HSE_by_pass RCC->CFGR = 0; do {} while(!(RCC->CR&RCC_CR_HSIRDY)); RCC->AHBENR |= RCC_AHBENR_GPIOEEN|RCC_AHBENR_GPIOAEN|RCC_AHBENR_ADC12EN; RCC->APB2ENR |= RCC_APB2ENR_TIM1EN|RCC_APB2ENR_USART1EN; } void establish_TIM1() { TIM1->RCR = 0; TIM1->PSC = 1000; TIM1->ARR = clock/(1*1000)-1; TIM1->DIER = TIM_DIER_UIE;//Прерывания разрешены TIM1->CR1 |= TIM_CR1_CEN; } void establish_int() { //NVIC->ISER[0] = (1<<TIM1_UP_TIM16_IRQn);//TIM1_UP_TIM16_IRQn = 25 - позиция в таблице прерывания от TIM1_UP/TIM16 //NVIC->ISER[1] = (1<<(USART1_IRQn-32)); NVIC->ISER[0] = 1<<ADC1_2_IRQn; } void establish_ports() { GPIOE->MODER |= GPIO_MODER_MODER8_0|GPIO_MODER_MODER9_0|GPIO_MODER_MODER10_0|GPIO_MODER_MODER11_ 0|GPIO_MODER_MODER12_0|GPIO_MODER_MODER13_0|GPIO_MODER_MODER14_0|GPIO_MODER_MODE R 15_0; GPIOA->MODER &= ~(GPIO_MODER_MODER10_0|GPIO_MODER_MODER9_0); GPIOA->MODER |= GPIO_MODER_MODER10_1|GPIO_MODER_MODER9_1|GPIO_MODER_MODER1; GPIOA->AFR[1] = (0x7<<8)|(0x7<<4); } void set_USART() { USART1->CR1 &= ~((1<<28)|(USART_CR1_M)); USART1->BRR = clock/baudrate; USART1->CR1 |= USART_CR1_RXNEIE|USART_CR1_RE|USART_CR1_TE|USART_CR1_TXEIE|USART_CR1_UE; } void set_ADC() { ADC1->CR &= ~(ADC_CR_ADVREGEN_0|ADC_CR_ADVREGEN_1); ADC1->CR |= ADC_CR_ADVREGEN_0; for(int i=0;i<1000;i++) {} ADC1->CR &= ~(ADC_CR_ADCALDIF); ADC1->CR |= ADC_CR_ADCAL; do{} while(ADC1->CR&ADC_CR_ADCAL); for(int i=0;i<5;i++) {}//Delay after ADCAL bit is cleared by hardware ADC1->CR |= ADC_CR_ADEN; do{} while(!(ADC1->IER&ADC_IER_RDY)); ADC1->SQR1 |= ADC_SQR1_L_0; ADC1->SMPR1 |= ADC_SMPR1_SMP2; ADC1->IER |= ADC_IER_EOC; ADC1->SQR1 |= ADC_SQR1_SQ1_0; ADC1->CR |= ADC_CR_ADSTART; } Это код всей программы, прошу посмотреть только АЦП) Программа зацикливается в ожидании сброса бита ADC_CR_ADCAL и все
  4. sigmaN, спасибо! :) все заработало! А то я уж было подумал, что конец плате пришел.. фух:)
  5. sigmaN, питание я проверил в первую очередь. Перемычки никакие не трогал, раньше в течение месяца все работало нормально
  6. Ошибка No MCU device found

    Добрый день! Пользуюсь платой stm32f3discovery и вчера при прошивке появилась ошибка: IAR написал Fatal Error: ST-link, no MCU device found. Перелазил пол интернета, но толкового ответа, что делать, так и не нашел. Может кто-нибудь подскажет, что с платой? Надеюсь что она не умерла, потому что ничего запретного с ней я не делал) заранее благодарю за помощь!!:)
  7. Lagman, спасибо, сейчас буду пробовать!)
  8. Всем добрый вечер! Стоит такая задача - зажечь светодиод от нажатия кнопки, а при следующем нажатии потушить. Пересмотрел много различных тем, связанных с EXTI, но своего случая не нашел. Работаю с платой stm32f3discovery. Ниже приведен мой код: #include "stm32f30x.h" #include "startup_stm32f30x.s" #include "system_stm32f30x.c" #include "system_stm32f30x.h" void establish_clock(); void delay(int); void establish_ports(); void establish_int(); void EXTI0_IRQHandler(); void main() { establish_clock(); establish_ports(); establish_int(); do{} while(1); } void establish_clock() { RCC->CR |= RCC_CR_HSEBYP|RCC_CR_HSEON; RCC->AHBENR |= RCC_AHBENR_GPIOAEN|RCC_AHBENR_GPIOEEN; RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; do { delay(500); } while(RCC->CR&(RCC_CR_HSERDY)==0); //Checking RCC_CR_CSSON } void delay(int time) { do{} while(time--!=0); } void establish_ports() { GPIOA->MODER &= ~(GPIO_MODER_MODER0); GPIOE->MODER |= GPIO_MODER_MODER8_0|GPIO_MODER_MODER9_0|GPIO_MODER_MODER10_0|GPIO_MODER_MODER11_ 0|GPIO_MODER_MODER12_0|GPIO_MODER_MODER13_0|GPIO_MODER_MODER14_0|GPIO_MODER_MODER 15_0; } void establish_int() { EXTI->RTSR |= EXTI_RTSR_TR0; EXTI->IMR |= EXTI_IMR_MR0; //EXTI->SWIER = EXTI_SWIER_SWIER0; SYSCFG->EXTICR[0] |= SYSCFG_EXTICR1_EXTI0_PA; NVIC->ISER[0] |= 0x40; } void EXTI0_IRQHandler(void) { EXTI->PR|=EXTI_PR_PR0; if(GPIOE->ODR&(GPIO_ODR_8)==0) { GPIOE->ODR |= GPIO_ODR_8|GPIO_ODR_9|GPIO_ODR_10|GPIO_ODR_11|GPIO_ODR_12|GPIO_ODR_13|GPIO_ODR_1 4|GPIO_ODR_15; } else { GPIOE->ODR &= ~(GPIO_ODR_8|GPIO_ODR_9|GPIO_ODR_10|GPIO_ODR_11|GPIO_ODR_12|GPIO_ODR_13|GPIO_O DR_14|GPIO_ODR_15); } } Кнопка висит на порте PA0, а светодиоды на PE8...15. Однако, при нажатии кнопки прерывание все-таки происходит, и программа улетает неизвестно куды) Это на скрине получается адрес, где прога зависает после прерывания? Может я тогда чего намудрил с векторами прерываний?
  9. Fatal Error[Li004] iar

    Добрый день! В iar вылезла вот такая ошибка: Fatal Error[Li004]: file "D:\Projects_for_ARM\Project_1\Debug\Obj\main.o" is not an object or archive file Пишу для Stm32, пишу на Си, и пишу первый раз:) так что прошу помощи и сильно не ругать!) При необходимости могу выложить код! Заранее благодарен:)
  10. Добрый вечер, друзья! Обращаюсь к вам с такой проблемой: недавно приобрел китайскую копию Arduino Mega 2560 R3, установил Atmel studio, и не смог прошить там контроллер. У кого-нибудь был опыт работы с такой платой в Atmel St?
  11. Здравствуйте, после попытки скомпилировать появилась такая ошибка. Что это может значить?? и кстати, есть ли разница при указании файла .h в <> или ""?
  12. Сергей Борщ, у меня АЦП на три канала и данные записываются по адресам этих ячеек памяти. Возможно, Вы и правы, нужно пойти по другому пути. Просто язык С для меня новое и поэтому иду напролом) спасибо за советы!
  13. k155la3, это в смысле мне можно написать вот так на языке С? asm(RSEG CSTACK DS16 0 RSEG DATA16_N N1 ds16 1 N2 ds16 1 N3 ds16 1);
  14. Добрый день! У меня совсем небольшой вопрос. Хочу перейти с ассемблера на язык С. И интересует, как можно ниже представленный код интерпретировать на языке С: #include "msp430F1232.h" RSEG CSTACK DS16 0 RSEG DATA16_N N1 ds16 1 N2 ds16 1 N3 ds16 1 ...... Т.е выделение какого-то сегмента памяти.
  15. Все понятно, спасибо большое за советы!:)
×
×
  • Создать...