⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 app.c

📁 通过手动烧写flash,实现了stm32的自动更新功能,用户可以再本例程的基础上修改实现通过串口或者网络实现程序的自动更新
💻 C
字号:
/*
*********************************************************************************************************
*                                              EXAMPLE CODE
*
*                          (c) Copyright 2003-2006; Micrium, Inc.; Weston, FL
*
*               All rights reserved.  Protected by international copyright laws.
*               Knowledge of the source code may NOT be used to develop a similar product.
*               Please help us continue to provide the Embedded community with the finest
*               software available.  Your honesty is greatly appreciated.
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*
*                                            EXAMPLE CODE
*
*                                     ST Microelectronics STM32
*                                              with the
*                                   STM3210B-EVAL Evaluation Board
*
* Filename      : app.c
* Version       : V1.00
* Programmer(s) : Brian Nagel
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                             INCLUDE FILES
*********************************************************************************************************
*/

#include <includes.h>
#include <stdio.h>
#include "..\\uvdebug\\UV_Debug.h"




/*
*********************************************************************************************************
*                                            LOCAL DEFINES
*********************************************************************************************************
*/



/*
*********************************************************************************************************
*                                       LOCAL GLOBAL VARIABLES
*********************************************************************************************************
*/

/* ----------------- APPLICATION GLOBALS ------------------ */
static  OS_STK          AppTaskRangeStk[APP_TASK_RANGE_STK_SIZE];
static  OS_STK          AppTaskUserIFStk[APP_TASK_USER_IF_STK_SIZE];

//static  OS_EVENT       *evtUartReceiver;



/*
*********************************************************************************************************
*                                      LOCAL FUNCTION PROTOTYPES
*********************************************************************************************************
*/

static  void            AppTaskCreate               (void);
//static  void            AppTaskStart                (void *p_arg);

static  void            AppTaskUserIF               (void *p_arg);
//static  void            AppTaskKbd                  (void *p_arg);

static void             AppTaskRange                (void* parg);

/*
*********************************************************************************************************
*                                                main()
*
* Description : This is the standard entry point for C code.  It is assumed that your code will call
*               main() once you have performed all necessary initialization.
*
* Arguments   : none
*
* Returns     : none
*********************************************************************************************************
*/

int  main (void)
{
//	CPU_INT08U  err;


	BSP_IntDisAll();											/* Disable all interrupts until we are ready to accept them */

	OSInit();													/* Initialize "uC/OS-II, The Real-Time Kernel"              */


	BSP_Init();													/* Initialize BSP functions                                 */






#if (OS_TASK_STAT_EN > 0)
	OSStatInit();												/* Determine CPU capacity                                   */
#endif


	AppTaskCreate();											/* Create application tasks                                 */

#if (OS_TASK_NAME_SIZE > 13)
//	OSTaskNameSet(APP_TASK_START_PRIO, "Start Task", &err);
#endif

	OSStart();													/* Start multitasking (i.e. give control to uC/OS-II)       */

}




/*
*********************************************************************************************************
*                                      CREATE APPLICATION TASKS
*
* Description:  This function creates the application tasks.
*
* Arguments  :  none
*
* Returns    :  none
*********************************************************************************************************
*/

static  void  AppTaskCreate (void)
{
	CPU_INT08U      err;


	OSTaskCreateExt(AppTaskUserIF,
					(void *)0,
					(OS_STK *)&AppTaskUserIFStk[APP_TASK_USER_IF_STK_SIZE - 1],
					APP_TASK_USER_IF_PRIO,
					APP_TASK_USER_IF_PRIO,
					(OS_STK *)&AppTaskUserIFStk[0],
					APP_TASK_USER_IF_STK_SIZE,
					(void *)0,
					OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);

#if (OS_TASK_NAME_SIZE > 8)
	OSTaskNameSet(APP_TASK_USER_IF_PRIO, "User I/F", &err);
#endif
	OSTaskCreateExt(AppTaskRange,
					(void *)0,
					(OS_STK *)&AppTaskRangeStk[APP_TASK_RANGE_STK_SIZE - 1],
					APP_TASK_RANGE_PRIO,
					APP_TASK_RANGE_PRIO,
					(OS_STK *)&AppTaskRangeStk[0],
					APP_TASK_RANGE_STK_SIZE,
					(void *)0,
					OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);

}


/*
*********************************************************************************************************
*                                         USER INTERFACE TASK
*
* Description : This task updates the LCD screen based on messages passed to it by AppTaskKbd().
*
* Arguments   : p_arg   is the argument passed to 'AppStartUserIF()' by 'OSTaskCreate()'.
*
* Returns     : none
*********************************************************************************************************
*/
void USART_RECV_ISR(void)
{
	INT16U inChar;
	OS_CPU_SR  cpu_sr;


	OS_ENTER_CRITICAL();                                        /* Tell uC/OS-II that we are starting an ISR                */
	OSIntNesting++;
	OS_EXIT_CRITICAL();
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
	{
  		  /* Clear the USART2 Receive interrupt */
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);
		inChar = USART_ReceiveData(USART1);
		if (inChar == 0)
			return;
	//	ProcInput((INT8U)inChar);
	}
	if(USART_GetITStatus(USART1,USART_IT_TC) != RESET)
	{
//		if(m_tx_header != m_tx_tail)
		{
//			USART_SendData(USART1,(INT16U)uart_tx_buffer[m_tx_header++]);
//			m_tx_header &= 0x7f;
		}
		USART_ClearITPendingBit(USART1,USART_IT_TC);
	}
	OSIntExit();   

}

static  void  AppTaskUserIF (void *p_arg)
{
	/*
	unsigned long* p = (unsigned long*)0x8000;
	unsigned long i, j;
	FLASH_Unlock();
	FLASH_ErasePage(0x8000);
	FLASH_ErasePage(0x8400);
	FLASH_Unlock();
	for (i = 0; i < 2048; i+=4)
	{
		FLASH_ProgramWord(0x8000+i, 0x12345678);
		for (j = 0; j < 1024; j++)
		;
	}
	FLASH_ErasePage(0x8000);
	OSTimeDly(100);
	//FLASH_Unlock();

	
	//FLASH_ProgramWord(0x8004, 0x56781234);
	OSTimeDly(100);
	if (*p == 0x12)
		return;		
	while(0)
	{
		FLASH_Unlock();
		FLASH_ErasePage(0x8000);
		OSTimeDly(100);
		FLASH_Unlock();
		FLASH_ProgramWord(0x8000, 0x1234);
		FLASH_ProgramWord(0x8004, 0x5678);
		OSTimeDly(100);
		if (*p == 0x12)
			return;
	}*/
	while(1)
	;
}

void AppTaskRange(void* parg)
{		 	
	unsigned char i = 0;
	unsigned char j = 0;
	NVIC_InitTypeDef NVIC_InitStructure;
	//串口例程
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure; //定义串口初始化结构体
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	/* Configure USART1 Tx (PA.09) as alternate function push-pull */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	USART_InitStructure.USART_BaudRate = 115200;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_Parity = USART_Parity_No ;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_InitStructure.USART_Clock = USART_Clock_Disable;
	USART_InitStructure.USART_CPOL = USART_CPOL_Low;
	USART_InitStructure.USART_CPHA = USART_CPHA_2Edge;
	USART_InitStructure.USART_LastBit = USART_LastBit_Disable;
	//最后数据位的时钟脉冲不输出到SCLK引脚
	USART_Init(USART1, &USART_InitStructure);//初始化串口1
	USART_Cmd(USART1, ENABLE);//串口1使能	

	//Enable the USART1 Interrupt 
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);		
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);	
	while(1)
	{
		OSTimeDly(200);
		for (i = 0; i < 100; i++)
		{
		    //ll = USART1->SR;
			USART_SendData(USART1, i);
			//
			while(1)
			{	
				if (USART_GetFlagStatus(USART1, USART_FLAG_TC) == SET)
					break;
				//ll = USART1->SR;
				//if (ll == 0xC0)
				//	break;
			}
		}
		j++;
		if (j == 10)
		{
			FLASH_Unlock();
			FLASH_ErasePage(0x0000FC00);
			FLASH_ProgramWord(0x0000FC00, 0);
			FLASH_Lock();
		}
	}	 
}


/*
*********************************************************************************************************
*                                   APPLICATION-DEFINED HOOKS
*
* Description: These functions are called by the hooks in os_cpu_c.c.
*
* Returns    : none
*********************************************************************************************************
*/

#if (OS_APP_HOOKS_EN > 0)
void  App_TaskCreateHook (OS_TCB *ptcb)
{
#if (uC_PROBE_OS_PLUGIN > 0) && (OS_PROBE_HOOKS_EN > 0)
	OSProbe_TaskCreateHook(ptcb);
#endif
}


void  App_TaskDelHook (OS_TCB *ptcb)
{
	(void)ptcb;
}


	#if OS_VERSION >= 251
void  App_TaskIdleHook (void)
{
}
	#endif


void  App_TaskStatHook (void)
{
}


	#if OS_TASK_SW_HOOK_EN > 0
void  App_TaskSwHook (void)
{
#if (uC_PROBE_OS_PLUGIN > 0) && (OS_PROBE_HOOKS_EN > 0)
	OSProbe_TaskSwHook();
#endif

//进入低功耗模式
}
	#endif


	#if OS_VERSION >= 204
void  App_TCBInitHook (OS_TCB *ptcb)
{
	(void)ptcb;
}
	#endif


	#if OS_TIME_TICK_HOOK_EN > 0
void  App_TimeTickHook (void)
{
#if (uC_PROBE_OS_PLUGIN > 0) && (OS_PROBE_HOOKS_EN > 0)
	OSProbe_TickHook();
#endif
}
	#endif
#endif

void App_Fault_ISR(void)
{
	NVIC_GenerateSystemReset();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -