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

Rudthaky

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

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

  • Посещение

Репутация

0 Обычный
  1. Спасибо bugdesigner, разобрался. Тема закрыта. :bb-offtopic:
  2. Банально помигать светодиодами на плате STM32F3 discavery... есть видео уроки на youtube-е вот по ним пытаюсь освоить Keil и ARM. Да, в уроках используется плата stm32f4xx discavery, но я думаю это не суть вещей. Адекватной литературы на тему "Самоучитель для чайников ARM" я не нашел, либо старье либо не для keil. Может быть плохо искал, не знаю. По этому и спрашиваю, уважаемых Вас, что бы ткнули пальцем, как слепому котенку. Типа делай так и так и будет тебе счастье... Не поняв как работать, вызывать прерывание через hel или нет, дальше смотреть туториалы и побывать по ним писать код - не вижу смысла так как это основа-основ. делал, результат тот же...
  3. Поменял- эффект то же... светодиоды просто горят... Напишите пожалуйста пример использования и объявления прирывания через хал...
  4. Спасибо за HAL, наконец знаю куда заглянуть, но проблема ни куда ну ушла. Попробовал так- светодиоды - просто горят =( #include "stm32f30x.h" // Device header #define LED_ON() GPIO_SetBits(GPIOE, GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_1 4|GPIO_Pin_15) #define LED_OFF() GPIO_ResetBits(GPIOE, GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_1 4|GPIO_Pin_15) //------------------------- #define RED_OFF() GPIO_ResetBits (GPIOE, GPIO_Pin_9|GPIO_Pin_13) #define RED_ON() GPIO_SetBits(GPIOE, GPIO_Pin_9|GPIO_Pin_13) //------------------------- #define BLUE_OFF() GPIO_ResetBits (GPIOE, GPIO_Pin_8|GPIO_Pin_12) #define BLUE_ON() GPIO_SetBits(GPIOE, GPIO_Pin_8|GPIO_Pin_12) //-------------------------- #define GREEN_OFF() GPIO_ResetBits (GPIOE, GPIO_Pin_11|GPIO_Pin_15) #define GREEN_ON() GPIO_SetBits(GPIOE, GPIO_Pin_11|GPIO_Pin_15) //-------------------------- #define ORANGE_OFF() GPIO_ResetBits (GPIOE, GPIO_Pin_10|GPIO_Pin_14) #define ORANGE_ON() GPIO_SetBits(GPIOE, GPIO_Pin_10|GPIO_Pin_14) //-------------------------- uint16_t delay_count = 0; void HAL_SYSTICK_Callback(void) { if(delay_count > 0) { delay_count--; } } void delay_ms(uint16_t delay_temp) { delay_count = delay_temp; while(delay_count){} } //------------------------------------------- void LEDs_ini(void) { GPIO_InitTypeDef GPIO_InitType_LED; //RCC_AHBPeriph_GPIOE RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE,ENABLE); GPIO_InitType_LED.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_1 4|GPIO_Pin_15; GPIO_InitType_LED.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitType_LED.GPIO_Speed = GPIO_Speed_Level_2; GPIO_InitType_LED.GPIO_OType = GPIO_OType_PP; GPIO_InitType_LED.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOE, &GPIO_InitType_LED); } int main(void) { SysTick_Config(SystemCoreClock/1000); // uint32_t i; LEDs_ini(); while(1) { RED_ON(); delay_ms(100); RED_OFF(); delay_ms(100); } } где-то я ошибаюсь, но не пойму где...
  5. поп поиску SysTick_Handler выдает: ни какого (by hal_cm4.o and main.o) не увидел... Где вообще искать hal_cm4 в keil 5? Упоминаний о ней много, все советуют в нее заглянуть, а вот где она находится - для меня загадка... :smile3046: в проекте присутствует core_cm4.h файл, в нем про SysTick только: #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ и вроде как инициализация: __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) { if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) { return (1UL); } /* Reload value impossible */ SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ return (0UL); /* Function successful */ }
  6. По поводу : void SisTick_Handler(void) , каюсь. Нет не хотел свою функцию, просто опечатался при исправлении на правлиьный void SysTick_Handler(void) появляется уже знакомая ошибка. Хотелось бы, но как этот поиск сделать... банальная ctrl+f не работает на глобальный, ищет постранично...
  7. Здравствуйте уважаемые форумчане. Такой вопрос: не работает прерывание на плате stm32f3discavery, ниже код: #include "stm32f30x.h" // Device header #define LED_ON() GPIO_SetBits(GPIOE, GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_1 4|GPIO_Pin_15) #define LED_OFF() GPIO_ResetBits(GPIOE, GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_1 4|GPIO_Pin_15) //------------------------- #define RED_OFF() GPIO_ResetBits (GPIOE, GPIO_Pin_9|GPIO_Pin_13) #define RED_ON() GPIO_SetBits(GPIOE, GPIO_Pin_9|GPIO_Pin_13) //------------------------- #define BLUE_OFF() GPIO_ResetBits (GPIOE, GPIO_Pin_8|GPIO_Pin_12) #define BLUE_ON() GPIO_SetBits(GPIOE, GPIO_Pin_8|GPIO_Pin_12) //-------------------------- #define GREEN_OFF() GPIO_ResetBits (GPIOE, GPIO_Pin_11|GPIO_Pin_15) #define GREEN_ON() GPIO_SetBits(GPIOE, GPIO_Pin_11|GPIO_Pin_15) //-------------------------- #define ORANGE_OFF() GPIO_ResetBits (GPIOE, GPIO_Pin_10|GPIO_Pin_14) #define ORANGE_ON() GPIO_SetBits(GPIOE, GPIO_Pin_10|GPIO_Pin_14) //-------------------------- static volatile uint16_t msTick= 0; void SisTick_Handler(void) { msTick++; } void delay_ms(uint16_t ms) { uint16_t startTicks; startTicks = msTick; while((msTick - startTicks)< ms); } void LEDs_ini(void) { GPIO_InitTypeDef GPIO_InitType_LED; //RCC_AHBPeriph_GPIOE RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE,ENABLE); GPIO_InitType_LED.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_1 4|GPIO_Pin_15; GPIO_InitType_LED.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitType_LED.GPIO_Speed = GPIO_Speed_Level_2; GPIO_InitType_LED.GPIO_OType = GPIO_OType_PP; GPIO_InitType_LED.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOE, &GPIO_InitType_LED); } int main(void) { SysTick_Config(SystemCoreClock/1000); // uint32_t i; LEDs_ini(); while(1) { RED_ON(); delay_ms(100); RED_OFF(); delay_ms(100); } } Выполняет только функция RED_ON(), соответственно диоды не моргают. Пробовал вариант: вместо: static volatile uint16_t msTick= 0; void SisTick_Handler(void) { msTick++; } void delay_ms(uint16_t ms) { uint16_t startTicks; startTicks = msTick; while((msTick - startTicks)< ms); } делать через uint16_t delay_count = 0; void SysTick_Handler(void) { if(delay_count > 0) { delay_count--; } } void delay_ms(uint16_t delay_temp) { delay_count = delay_temp; while(delay_count){} } Keil выдает ошибку: Где находятся (by hal_cm4.o and main.o) я не нашел. Помогите пожалуйста разобраться новичку с прерываниями :crying:
  8. т.е. будет что-то вроде.... module clkdiv( input wire clkIN, output reg clkOUT = 5'b00000 ); parameter clkfreq = 50000000; // Входная частота, Гц parameter outfreq = 31250; // Выходная частота, Гц integer count; always @ (posedge clkIN) if (count == 0) begin clkOUT <= ~clkOUT; count <= clkfreq / (2*outfreq); end else count <= count - 1; endmodule я правильно понял...
  9. Сам я зеленый новичок. С ПЛИС ни когда не работал, но поручили такую задачу. Нужно поделить 50 MHz клока на частоту соответствующую 32 мкс , тут -то я и встрял :crying: . Если я правильно понимаю 1/50 000 000, я получу 20 ns. Соответственно 1/32*10^(-3) = 31,25 , т.е. я понимаю, что это частота ? :laughing: В инете есть много примеров типа: module divider ( input clk50, output reg clk2 ); reg [32:0] counter = 0; always @(posedge clk50) if(counter == 24) begin counter <= (counter == 24) ? 0 : counter + 1; clk2 <= (counter == 24) ? 1 : 0; end endmodule или module clkdiv( input wire clkIN, output reg clkOUT = 1'b0 ); parameter clkfreq = 20000000; // Входная частота, Гц parameter outfreq = 2; // Выходная частота, Гц integer count; always @ (posedge clkIN) if (count == 0) begin clkOUT <= ~clkOUT; count <= clkfreq / (2*outfreq); end else count <= count - 1; endmodule или module clock_divider_50_MHz_to_1_49_Hz ( input clock_50_MHz, input resetn, output clock_1_49_Hz ); // 50 MHz / 2 ** 25 = 1.49 Hz reg [24:0] counter; always @ (posedge clock_50_MHz) begin if (! resetn) counter <= 0; else counter <= counter + 1; end assign clock_1_49_Hz = counter [24]; endmodule но мне не понятна сама логика вычисления нужной частоты. :smile3046: ПОЖАЛУЙСТА объясните на пальцах, как мне добиться вычисления нужной частоты. Заранее спасибо.
×
×
  • Создать...