diff options
Diffstat (limited to 'app/led_driver')
-rw-r--r-- | app/led_driver/led_driver_config.c | 138 | ||||
-rw-r--r-- | app/led_driver/led_driver_config.h | 44 | ||||
-rw-r--r-- | app/led_driver/led_driver_process.c | 31 | ||||
-rw-r--r-- | app/led_driver/led_driver_process.h | 6 | ||||
-rw-r--r-- | app/led_driver/led_driver_task.c | 26 | ||||
-rw-r--r-- | app/led_driver/led_driver_task.h | 9 |
6 files changed, 254 insertions, 0 deletions
diff --git a/app/led_driver/led_driver_config.c b/app/led_driver/led_driver_config.c new file mode 100644 index 0000000..3b2b081 --- /dev/null +++ b/app/led_driver/led_driver_config.c @@ -0,0 +1,138 @@ +#include "led_driver_config.h" + +static void LED_TIMConfig ( void ); +static void LED_SPIConfig ( void ); + +// ---------------------------------------------------------------------------- +// Подготовка железа, прерываний и тд для работы с RGB светодиодиками +// ---------------------------------------------------------------------------- +void LED_Driver_Config ( void ) +{ + LED_TIMConfig (); + LED_SPIConfig (); +} + + +// ---------------------------------------------------------------------------- +// +// ---------------------------------------------------------------------------- +static void LED_TIMConfig ( void ) +{ + NVIC_InitTypeDef NVIC_InitStructure; + TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; + + /* LED_TIMx clock enable */ + LED_RCC_APBxPeriphClockCmd ( LED_TIM_RCC, ENABLE ); + + /* Enable the LED_TIMx gloabal Interrupt */ + NVIC_InitStructure.NVIC_IRQChannel = LED_TIM_IRQx; + NVIC_InitStructure.NVIC_IRQChannelPriority = 2; // Установим приоритет ниже, чем у модуля NixieDriver + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init ( &NVIC_InitStructure ); + + /* ----------------------------------------------------------------------- + In this example TIM7 counter clock (TIM7CLK) is set to APB1 clock (PCLK1), since + APB1 prescaler is set to 1 and TIM7 prescaler is set to 0. + + In this example TIM7 input clock (TIM7CLK) is set to APB1 clock (PCLK1), + since APB1 prescaler is set to 1. + TIM7CLK = PCLK1 = HCLK = SystemCoreClock + + With Prescaler set to 479 and Period to 24999, the TIM7 counter is updated each 250 ms + (i.e. and interrupt is generated each 250 ms) + TIM7 counter clock = TIM7CLK /((Prescaler + 1)*(Period + 1)) + = 48 MHz / ((25000)*(480)) + = 4 Hz + ==> TIM7 counter period = 250 ms + + Note: + SystemCoreClock variable holds HCLK frequency and is defined in system_stm32f0xx.c file. + Each time the core clock (HCLK) changes, user had to call SystemCoreClockUpdate() + function to update SystemCoreClock variable value. Otherwise, any configuration + based on this variable will be incorrect. + ----------------------------------------------------------------------- */ + + /* Time base configuration */ + TIM_TimeBaseStructure.TIM_Period = 1000; // Это миксросекунды //24999 + TIM_TimeBaseStructure.TIM_Prescaler = (SystemCoreClock/1000000)-1; //479; + TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; + TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; + TIM_TimeBaseInit ( LED_TIMx, &TIM_TimeBaseStructure ); + + /* LED_TIMx Interrupts enable */ + TIM_ITConfig ( LED_TIMx, TIM_IT_Update, ENABLE ); + + /* LED_TIMx enable counter */ + TIM_Cmd ( LED_TIMx, ENABLE ); +} + + +// ---------------------------------------------------------------------------- +// +// ---------------------------------------------------------------------------- +static void LED_SPIConfig ( void ) +{ + GPIO_InitTypeDef GPIO_InitStructure; + SPI_InitTypeDef SPI_InitStructure; + NVIC_InitTypeDef NVIC_InitStructure; + + /* Enable the SPI periph */ + LED_SPIx_RCC_APBxPeriphClockCmd ( LED_SPIx_CLK, ENABLE ); + + /* Enable SCK, MOSI, MISO and NSS GPIO clocks */ + RCC_AHBPeriphClockCmd ( LED_SPIx_SCK_GPIO_CLK | + LED_SPIx_MOSI_GPIO_CLK | + LED_SPIx_ST_GPIO_CLK, + ENABLE ); + + GPIO_PinAFConfig ( LED_SPIx_SCK_GPIO_PORT, LED_SPIx_SCK_SOURCE, LED_SPIx_SCK_AF ); + GPIO_PinAFConfig ( LED_SPIx_MOSI_GPIO_PORT, LED_SPIx_MOSI_SOURCE, LED_SPIx_MOSI_AF ); + + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3; + + /* SPI SCK pin configuration */ + GPIO_InitStructure.GPIO_Pin = LED_SPIx_SCK_PIN; + GPIO_Init ( LED_SPIx_SCK_GPIO_PORT, &GPIO_InitStructure ); + + /* SPI MOSI pin configuration */ + GPIO_InitStructure.GPIO_Pin = LED_SPIx_MOSI_PIN; + GPIO_Init ( LED_SPIx_MOSI_GPIO_PORT, &GPIO_InitStructure ); + + /* GPIO ST pin configuration */ + GPIO_InitStructure.GPIO_Pin = LED_SPIx_ST_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3; + GPIO_Init ( LED_SPIx_ST_GPIO_PORT, &GPIO_InitStructure ); + + /* SPI configuration -------------------------------------------------------*/ + SPI_I2S_DeInit ( LED_SPIx ); + SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; + SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b; + SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; + SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; + SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; + SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; + SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; + SPI_InitStructure.SPI_CRCPolynomial = 7; + SPI_InitStructure.SPI_Mode = SPI_Mode_Master; + SPI_Init ( LED_SPIx, &SPI_InitStructure ); + + /* Enable the SPI peripheral */ + SPI_Cmd ( LED_SPIx, ENABLE ); + + /* Configure the SPI interrupt priority */ + NVIC_InitStructure.NVIC_IRQChannel = LED_SPIx_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init ( &NVIC_InitStructure ); + + /* Enable the Rx buffer not empty interrupt */ + SPI_I2S_ITConfig ( LED_SPIx, SPI_I2S_IT_RXNE, ENABLE ); + + LED_ST_PIN_RESET; +} diff --git a/app/led_driver/led_driver_config.h b/app/led_driver/led_driver_config.h new file mode 100644 index 0000000..39927ec --- /dev/null +++ b/app/led_driver/led_driver_config.h @@ -0,0 +1,44 @@ +#ifndef LED_DRIVER_CONFIG_INCLUDED +#define LED_DRIVER_CONFIG_INCLUDED + +#include "stm32f0xx_conf.h" + +/* Communication boards SPIx Interface */ +#define LED_SPIx SPI2 +#define LED_SPIx_CLK RCC_APB1Periph_SPI2 +#define LED_SPIx_IRQn SPI2_IRQn +#define LED_SPIx_IRQHandler SPI2_IRQHandler + +#define LED_SPIx_SCK_PIN GPIO_Pin_10 +#define LED_SPIx_SCK_GPIO_PORT GPIOB +#define LED_SPIx_SCK_GPIO_CLK RCC_AHBPeriph_GPIOB +#define LED_SPIx_SCK_SOURCE GPIO_PinSource10 +#define LED_SPIx_SCK_AF GPIO_AF_5 + +#define LED_SPIx_MOSI_PIN GPIO_Pin_15 +#define LED_SPIx_MOSI_GPIO_PORT GPIOB +#define LED_SPIx_MOSI_GPIO_CLK RCC_AHBPeriph_GPIOB +#define LED_SPIx_MOSI_SOURCE GPIO_PinSource15 +#define LED_SPIx_MOSI_AF GPIO_AF_0 + +#define LED_SPIx_ST_PIN GPIO_Pin_9 +#define LED_SPIx_ST_GPIO_PORT GPIOB +#define LED_SPIx_ST_GPIO_CLK RCC_AHBPeriph_GPIOA +#define LED_SPIx_ST_SOURCE GPIO_PinSource9 +#define LED_SPIx_ST_AF GPIO_AF_5 + +#define LED_SPIx_RCC_APBxPeriphClockCmd RCC_APB1PeriphClockCmd + +// Определения для таймера LedRgbDriver ------------------------------------- // +#define LED_TIMx TIM3 +#define LED_TIM_IRQHandler TIM3_IRQHandler +#define LED_TIM_RCC RCC_APB1Periph_TIM3 +#define LED_TIM_IRQx TIM3_IRQn +#define LED_RCC_APBxPeriphClockCmd RCC_APB1PeriphClockCmd + +#define LED_ST_PIN_SET GPIO_SetBits ( LED_SPIx_ST_GPIO_PORT, LED_SPIx_ST_PIN ) +#define LED_ST_PIN_RESET GPIO_ResetBits ( LED_SPIx_ST_GPIO_PORT, LED_SPIx_ST_PIN ) + +void LED_Driver_Config ( void ); + +#endif //LED_DRIVER_CONFIG_INCLUDED diff --git a/app/led_driver/led_driver_process.c b/app/led_driver/led_driver_process.c new file mode 100644 index 0000000..165ef99 --- /dev/null +++ b/app/led_driver/led_driver_process.c @@ -0,0 +1,31 @@ +#include "led_driver_process.h" +#include "led_driver_config.h" +#include <stdint.h> + + +// ---------------------------------------------------------------------------- +// +// ---------------------------------------------------------------------------- +void LEDDriverProcessFromISR ( void ) +{ + return; + asm volatile("cpsid i"); + LED_ST_PIN_RESET; + for (int j = 0; j < 4; j++) { + LED_SPIx->DR = 0; + while (SPI_I2S_FLAG_BSY & LED_SPIx->SR); + for (int i = 0; i < 4; i++) { + LED_SPIx->DR = 0xf8f8; + while (SPI_I2S_FLAG_BSY & LED_SPIx->SR); + } + for (int i = 0; i < 4; i++) { + LED_SPIx->DR = 0xe0e0; + while (SPI_I2S_FLAG_BSY & LED_SPIx->SR); + } + for (int i = 0; i < 4; i++) { + LED_SPIx->DR = 0xe0e0; + while (SPI_I2S_FLAG_BSY & LED_SPIx->SR); + } + } + asm volatile("cpsie i"); +} diff --git a/app/led_driver/led_driver_process.h b/app/led_driver/led_driver_process.h new file mode 100644 index 0000000..fa02241 --- /dev/null +++ b/app/led_driver/led_driver_process.h @@ -0,0 +1,6 @@ +#ifndef LED_DRIVER_PROCESS_INCLUDED +#define LED_DRIVER_PROCESS_INCLUDED + +void LEDDriverProcessFromISR ( void ); + +#endif //LED_DRIVER_PROCESS_INCLUDED diff --git a/app/led_driver/led_driver_task.c b/app/led_driver/led_driver_task.c new file mode 100644 index 0000000..d38deb4 --- /dev/null +++ b/app/led_driver/led_driver_task.c @@ -0,0 +1,26 @@ +#include "led_driver_task.h" +#include "led_driver_config.h" + +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "semphr.h" + + +void LED_DriverInit ( void ) +{ + LED_Driver_Config (); +} + +void ProcessFSM_LED_RGB ( void ) +{ + taskYIELD(); +} + +// ---------------------------------------------------------------------------- +// Задача ОС, реализующая задачу обработки светодиодиков RGB +// ---------------------------------------------------------------------------- +void LED_Driver_Task ( void *pvParameters ) +{ + while(1)ProcessFSM_LED_RGB (); +} diff --git a/app/led_driver/led_driver_task.h b/app/led_driver/led_driver_task.h new file mode 100644 index 0000000..63f3ff1 --- /dev/null +++ b/app/led_driver/led_driver_task.h @@ -0,0 +1,9 @@ +#ifndef LED_RGB_TASK_INCLUDED +#define LED_RGB_TASK_INCLUDED + +#include "stm32f0xx.h" + +void LED_DriverInit ( void ); +void LED_Driver_Task ( void *pvParameters ); + +#endif //LED_RGB_TASK_INCLUDED
\ No newline at end of file |