Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- ******************************************************************************
- * @file main.c
- * @author Raymond Mango
- * @version V1.0
- * @date 01-December-2013
- * @brief Default main function.
- ******************************************************************************
- */
- #include <stdio.h>
- #include <stdint.h>
- #include <string.h>
- #include "stm32f4xx.h"
- #include "FreeRTOS.h"
- #include "task.h"
- #include "queue.h"
- #include "timers.h"
- TaskHandle_t xTaskhHandle1 = NULL;
- TaskHandle_t xTaskhHandle2 = NULL;
- TaskHandle_t xTaskhHandle3 = NULL;
- TaskHandle_t xTaskhHandle4 = NULL;
- TimerHandle_t LedTimerHandle = NULL;
- void Led_Toggle( TimerHandle_t xTimer);
- //Queue handle
- QueueHandle_t command_queue = NULL;
- QueueHandle_t uart_write_queue = NULL;
- void vTask_menudisplay_Handler(void *params);
- void vTask_cmd_Handler(void *params);
- void vTask_cmd_processing_Handler(void *params);
- void vTask_uart_write_Handler(void *params);
- void prvSetup_Hardware(void);
- void prvSetupGPIO();
- void rtos_delay(uint32_t delay_in_ms);
- uint8_t getCommandCode(uint8_t *buffer);
- void getArguments(uint8_t *buffer);
- void makeLedOn();
- void makeLedOff();
- void startToggle(uint32_t duration);
- void stopToggle();
- void readLedStatus(char *taskMsg);
- void readRtc(char *taskMsg);
- void printErrorMsg(char *taskMsg);
- void printMsg(char *msg);
- #define TRUE 1
- #define FALSE 0
- #define AVAILABLE TRUE
- #define NOT_AVAILABLE FALSE
- uint8_t UART_ACCESS_KEY = AVAILABLE;
- #ifdef USE_SEMIHOSTING
- //enable arm semihosting
- extern void initialise_monitor_handles();
- #endif
- char userbuf[250];
- //command structure
- typedef struct APP_CMD
- {
- uint8_t CommandNum;
- uint8_t CommandArgs[10];
- }APP_CMD_t;
- uint8_t commandBuffer[20];
- uint8_t commandLen = 0;
- char menu[] = {"\
- \r\nLED_ON-------------------------> 1\
- \r\nLED_OFF------------------------> 2\
- \r\nLED_TOGGLE---------------------> 3\
- \r\nLED_TOGGLE_OFF-----------------> 4\
- \r\nLED_READ_STATUS----------------> 5\
- \r\nRTC_PRINT_DATETIME-------------> 6\
- \r\nEXIT_APP-----------------------> 0\
- \r\nType your option here: "};
- #define LED_ON_COMMAND 1
- #define LED_OFF_COMMAND 2
- #define LED_TOGGLE_COMMAND 3
- #define LED_TOGGLE_OFF_COMMAND 4
- #define LED_READ_STATUS_COMMAND 5
- #define RTC_PRINT_DATETIME 6
- int main(void)
- {
- #ifdef USE_SEMIHOSTING
- initialise_monitor_handles();
- printf("This is a test!!!!\n");
- #endif
- //enable the cycle counter
- DWT->CTRL |= (1<<0);
- //reset RCC clock to default reset state,HSI ON, HSE OFF, SYS clock and CPU clock = 16MHz
- RCC_DeInit();
- //update the system call clock variable
- SystemCoreClockUpdate();
- prvSetup_Hardware();
- //Start Recording
- SEGGER_SYSVIEW_Conf();
- SEGGER_SYSVIEW_Start();
- //creating the queues;
- command_queue = xQueueCreate(10, sizeof(APP_CMD_t*)); //this helps save heap memory
- uart_write_queue = xQueueCreate(10, sizeof(char*));
- if((command_queue != NULL)&&(uart_write_queue != NULL)){
- //creating tasks
- xTaskCreate(vTask_menudisplay_Handler,
- "Task1", /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
- 500,
- NULL,
- 2,
- &xTaskhHandle1 );
- xTaskCreate(vTask_cmd_Handler,
- "Task2", /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
- 500,
- NULL,
- 2,
- &xTaskhHandle2 );
- xTaskCreate(vTask_cmd_processing_Handler,
- "Task3", /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
- 500,
- NULL,
- 2,
- &xTaskhHandle3 );
- xTaskCreate(vTask_uart_write_Handler,
- "Task4", /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
- 500,
- NULL,
- 2,
- &xTaskhHandle4 );
- vTaskStartScheduler();
- }else
- {
- printMsg("Queue Creation failed\r\n");
- }
- //will never reach here
- for(;;);
- }
- void vTask_menudisplay_Handler(void *params){
- char *pData = menu;
- while(1){
- xQueueSend(uart_write_queue, &pData, portMAX_DELAY );
- //lets wait here until someone notifies
- xTaskNotifyWait(0,0,NULL,portMAX_DELAY);
- }
- //-specs=rdimon.specs -1c -1rdimon
- }
- void vTask_cmd_Handler(void *params){
- uint8_t command_code = 0;
- APP_CMD_t *newCmd;
- while(1){
- xTaskNotifyWait(0,0,NULL,portMAX_DELAY);
- //send command to the queue
- taskENTER_CRITICAL();
- command_code = getCommandCode(commandBuffer);
- newCmd = (APP_CMD_t*)pvPortMalloc(sizeof(APP_CMD_t));
- newCmd->CommandNum = command_code;
- getArguments(newCmd->CommandArgs);
- taskEXIT_CRITICAL();
- //send the command to the command queue
- xQueueSend(command_queue, &newCmd, portMAX_DELAY );
- }
- }
- void vTask_cmd_processing_Handler(void *params){
- APP_CMD_t *newCmd;
- char taskMsg[50];
- uint8_t toggle_duration = pdMS_TO_TICKS(500);
- while(1){
- xQueueReceive(command_queue, (void*)&newCmd,portMAX_DELAY);
- switch(newCmd->CommandNum)
- {
- case LED_ON_COMMAND:
- makeLedOn();
- break;
- case LED_OFF_COMMAND:
- makeLedOff();
- break;
- case LED_TOGGLE_COMMAND:
- startToggle(500);
- break;
- case LED_TOGGLE_OFF_COMMAND:
- stopToggle();
- break;
- case LED_READ_STATUS_COMMAND:
- readLedStatus(taskMsg);
- break;
- case RTC_PRINT_DATETIME:
- readRtc(taskMsg);
- break;
- default:
- printErrorMsg(taskMsg);
- }
- //free dynamic memory
- vPortFree(newCmd);
- }
- }
- void vTask_uart_write_Handler(void *params){
- char *pData = NULL;
- while(1){
- xQueueReceive(uart_write_queue, &pData, portMAX_DELAY);
- printMsg(pData);
- }
- }
- void prvSetup_Hardware(){
- GPIO_InitTypeDef gpio_uart3_pins;
- USART_InitTypeDef uart3Init;
- //enable Uart3 and GPIOD Peripheral clock
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
- //configure alternate function of pins PD8-TX and PD9-RX
- //zeroing each member of gpio structure
- memset(&gpio_uart3_pins,0, sizeof(gpio_uart3_pins));
- gpio_uart3_pins.GPIO_Pin = GPIO_Pin_9;
- gpio_uart3_pins.GPIO_Mode = GPIO_Mode_AF;
- gpio_uart3_pins.GPIO_PuPd = GPIO_PuPd_UP;
- gpio_uart3_pins.GPIO_Pin = GPIO_Pin_8;
- gpio_uart3_pins.GPIO_Mode = GPIO_Mode_AF;
- gpio_uart3_pins.GPIO_PuPd = GPIO_PuPd_UP;
- GPIO_Init(GPIOD, &gpio_uart3_pins);
- //AF mode settings for the pins
- GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_USART3);
- GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_USART3);
- //Uart Parameter Initialization
- //memset(&uart3Init,0, sizeof(uart3Init));
- uart3Init.USART_BaudRate = 115200;
- uart3Init.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
- uart3Init.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
- uart3Init.USART_Parity = USART_Parity_No;
- uart3Init.USART_StopBits = USART_StopBits_1;
- uart3Init.USART_WordLength = USART_WordLength_8b;
- USART_Init(USART3, &uart3Init);
- //USART_CR1_UE = 1;
- // enable uart byte reception interrupt
- USART_ITConfig(USART3, USART_IT_RXNE, ENABLE );
- //set priority
- NVIC_SetPriority(USART3_IRQn, 6);
- //enable the uart3 irq in the nvic
- NVIC_EnableIRQ(USART3_IRQn);
- //enable the usart3 peripheral
- USART_Cmd(USART3, ENABLE);
- }
- void prvSetupGPIO(){
- GPIO_InitTypeDef Led_pin, Button_pin;
- //enable GPIO-B&C Peripheral clocks
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
- Led_pin.GPIO_Mode = GPIO_Mode_OUT;
- Led_pin.GPIO_OType = GPIO_OType_PP;
- Led_pin.GPIO_Pin = GPIO_Pin_14;
- Led_pin.GPIO_Speed = GPIO_Low_Speed;
- Led_pin.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_Init(GPIOB, &Led_pin);
- Button_pin.GPIO_Mode = GPIO_Mode_IN;
- Button_pin.GPIO_OType = GPIO_OType_PP;
- Button_pin.GPIO_Pin = GPIO_Pin_13;
- Button_pin.GPIO_Speed = GPIO_Low_Speed;
- Button_pin.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_Init(GPIOC, &Button_pin);
- }
- void rtos_delay(uint32_t delay_in_ms)
- {
- uint32_t current_tick_count = xTaskGetTickCount();
- uint32_t delay_in_ticks = (delay_in_ms * configTICK_RATE_HZ)/1000;
- while(xTaskGetTickCount()<(current_tick_count + delay_in_ticks));
- }
- void printMsg(char *msg){
- for(int i = 0; i < strlen(msg); i++ ){
- while(USART_GetFlagStatus(USART3, USART_FLAG_TXE)!= SET);//wait till data register is empty
- USART_SendData(USART3, msg[i]);
- }
- }
- void USART3_IRQHandler(void){
- char taskMsg[20];
- uint16_t rxByte;
- BaseType_t xHigherPriorityTaskWoken = pdFALSE;
- char *pData = "ISR Awoken";
- xQueueSend(uart_write_queue,&pData,portMAX_DELAY);
- if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET){
- USART_ClearFlag(USART3, USART_FLAG_RXNE);
- rxByte = USART_ReceiveData(USART3);
- sprintf(taskMsg, "\r\nLED status is: ");
- xQueueSend(uart_write_queue,&taskMsg,portMAX_DELAY);
- commandBuffer[commandLen++] = (rxByte & 0xFF);
- if(rxByte == '\r'){
- commandLen = 0;
- //if the enter key is pressed, the user is done entering the data
- //notify the command handling task
- xTaskNotifyFromISR(xTaskhHandle2,0,eNoAction,&xHigherPriorityTaskWoken);
- xTaskNotifyFromISR(xTaskhHandle1,0,eNoAction,&xHigherPriorityTaskWoken);
- }
- }
- //if the above freertos apis woke up any higher priority task, then yield the processor to the higher priority task which was woken up
- if(xHigherPriorityTaskWoken)
- {
- taskYIELD();
- }
- }
- uint8_t getCommandCode(uint8_t *buffer){
- return buffer[0]-48;
- }
- void getArguments(uint8_t *buffer){
- }
- void makeLedOn(){
- GPIO_WriteBit(GPIOB, GPIO_Pin_14, Bit_SET);
- }
- void makeLedOff(){
- GPIO_WriteBit(GPIOB, GPIO_Pin_14, Bit_RESET);
- }
- void startToggle(uint32_t duration){
- if (LedTimerHandle == NULL)
- {
- //1.//create the software timer
- //LedTimerHandle = xTimerCreate("LedTimer",duration, pdTRUE, Led_Toggle );
- }else
- {
- //2.Start the software timer
- xTimerStart(LedTimerHandle, portMAX_DELAY );
- }
- }
- void stopToggle(){
- xTimerStop(LedTimerHandle, portMAX_DELAY );
- }
- void readLedStatus(char *taskMsg){
- char count[3];
- sprintf(taskMsg, "\r\nLED status is: ");
- itoa(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_14),count,10);
- count[1] = '\r';
- count[2] = '\n';
- xQueueSend(uart_write_queue,&taskMsg,portMAX_DELAY);
- xQueueSend(uart_write_queue,&count,portMAX_DELAY);
- }
- void readRtc(char *taskMsg){
- }
- void printErrorMsg(char *taskMsg){
- }
- void Led_Toggle( TimerHandle_t xTimer){
- GPIO_ToggleBits(GPIOB, GPIO_Pin_14);
- }
Advertisement
Add Comment
Please, Sign In to add comment