STM32CUBEMX_创建时间片轮询架构的软件框架

STM32CUBEMX_创建时间片轮询架构的软件框架

说明:
1、这种架构避免在更新STM32CUBEMX配置后把用户代码清除掉
2、利用这种时间片的架构可以使得代码架构清晰易于维护
创建步骤:
1、使用STM32CUBEMX创建基础工程
2、新建用户代码目录
3、构建基础的代码框架

1、使用STM32CUBEMX创建基础工程

选择外部高速时钟
STM32CUBEMX_创建时间片轮询架构的软件框架_第1张图片
配置下载调试接口
STM32CUBEMX_创建时间片轮询架构的软件框架_第2张图片
配置时钟线
STM32CUBEMX_创建时间片轮询架构的软件框架_第3张图片
开一个只有定时功能的定时器(中断1ms)
STM32CUBEMX_创建时间片轮询架构的软件框架_第4张图片
配置工程
STM32CUBEMX_创建时间片轮询架构的软件框架_第5张图片

2、新建用户代码目录

打开KEIL工程
STM32CUBEMX_创建时间片轮询架构的软件框架_第6张图片
创建两个文件夹目录
STM32CUBEMX_创建时间片轮询架构的软件框架_第7张图片
把实际的这两个目录文件夹从别的工程拷贝到本工程根目录下或者是自己新建
STM32CUBEMX_创建时间片轮询架构的软件框架_第8张图片
添加文件
STM32CUBEMX_创建时间片轮询架构的软件框架_第9张图片
添加文件之后的实际效果
STM32CUBEMX_创建时间片轮询架构的软件框架_第10张图片
包含头文件
STM32CUBEMX_创建时间片轮询架构的软件框架_第11张图片
必须要勾选microlib才能打印日志
STM32CUBEMX_创建时间片轮询架构的软件框架_第12张图片

然后写一个闪灯的测试程序可以发现整个工程按照我们的意愿编译成功并且可以正常运行

3、构建基础的代码框架

STM32CUBEMX_创建时间片轮询架构的软件框架_第13张图片
mymain.c

#include "mymain.h"
#include "main.h"
#include "gpio.h"
//#include "adc.h"
//#include "i2c.h"
#include "tim.h"
//#include "usart.h"
//#include "uart_lcd.h"
//#include "encoder.h"
//#include "uart_485.h"
#include "board.h"
//#include "eeprom.h"
//#include "led.h"
//#include "dma.h"

/*************时间片轮转数组结构体*************/
system_task_t task_array[SYSTEM_TASK_MAX_NUM] = {
//	{0,0,0,50,uart_lcd_task},
//	{0,0,0,20,encoder_task},
//	{0,0,0,1,uart_485_task},
	{0,0,0,500,board_task}
//	{0,0,0,500,led_task},
//	{0,0,0,100,eeprom_24c64_task}
};

int main(void)
{
//	SCB->VTOR = FLASH_BASE | 0x14000;	
  HAL_Init();
  SystemClock_Config();//配置外部高速时钟

  MX_GPIO_Init();//GPIO口初始化
	
//	MX_DMA_Init();
//	MX_ADC1_Init();
//	
//  MX_I2C1_Init();
//	MX_I2C2_Init();
//	
//	MX_TIM1_Init();
//  MX_TIM2_Init();
//  MX_TIM3_Init();
//	MX_TIM4_Init();
//  MX_TIM5_Init();
	MX_TIM6_Init();
//	
//  MX_USART1_UART_Init();
//  MX_USART2_UART_Init();

	system_init();
	
  while (1)
  {
//		Debug_printf("StartDefaultTask:%f",1.153);
//		Debug_info("StartDefaultTask:%d",253);
//		Debug_debug("StartDefaultTask:%f",3.153);
//		Debug_warning("StartDefaultTask:%f",4.153);
//		Debug_error("StartDefaultTask:%f",5.153);
//		HAL_GPIO_WritePin(GPIOE, GPIO_PIN_8, GPIO_PIN_SET);
//		HAL_Delay(500);
//		HAL_GPIO_WritePin(GPIOE, GPIO_PIN_8, GPIO_PIN_RESET);
//		HAL_Delay(500);
		
		for(int i = 0; i < SYSTEM_TASK_MAX_NUM; i++)	//任务状态判断执行
		{
			if(task_array[i].taskStatus == 1)
			{                            
				task_array[i].task_function();
				task_array[i].taskCount = 0; 
				task_array[i].taskStatus = 0;
			} 
		}
	}
}

void system_init(void)
{
//	HAL_Delay(2000);	//等待串口屏启动完成
//	eeprom_24c64_init();
//	board_init();
//	uart_485_init();
//	uart_lcd_init();
//	led_init();
//	
//	HAL_TIM_Base_Start_IT(&htim1);
	HAL_TIM_Base_Start_IT(&htim6);
//	HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
//	HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL

mymain.h

#ifndef __MYMAIN_H
#define __MYMAIN_H
#include "log.h"

extern void SystemClock_Config(void);

#define SYSTEM_TASK_MAX_NUM 1	//任务数量

typedef struct system_task
{
	unsigned char taskStatus;			//任务运行状态
	unsigned char taskPriority; 	//任务运行优先级
	unsigned int  taskCount;			//任务运行中计数
	unsigned int  taskInterva1;		//任务运行时间间隔(单位:ms)
	void (* task_function)(void);	//任务运行的回调函数
}system_task_t;

void system_init(void);

#endif


board.c

#include "board.h"

void board_init(void)
{
	BOARD_LED_OFF;
//	BOARD_FUN_SPEED;
}

void board_task(void)
{
	BOARD_LED_CYCLE;
	Debug_printf("system run ......\r\n");
}



board.h

#ifndef __BOARD_H
#define __BOARD_H
#include "main.h"
#include "log.h"
#include "tim.h"

/********1~5档位,档位越高风扇转速越高*******/
enum{
	board_fun_one = 3600,
	board_fun_two = 2700,
	board_fun_three = 1800,
	board_fun_four = 1200,
	board_fun_five = 600,
};

#define BOARD_PIN_LED 		GPIO_PIN_8
#define BOARD_LED_ON 			HAL_GPIO_WritePin(GPIOE, BOARD_PIN_LED, GPIO_PIN_RESET)
#define BOARD_LED_OFF 		HAL_GPIO_WritePin(GPIOE, BOARD_PIN_LED, GPIO_PIN_SET)
#define BOARD_LED_CYCLE		HAL_GPIO_TogglePin(GPIOE, BOARD_PIN_LED)

//#define BOARD_FUN_SPEED		__HAL_TIM_SET_COMPARE(&htim5,TIM_CHANNEL_1,board_fun_three);	//板载风扇转速与占空比成反比,机箱散热风扇
//#define BOARD_FUN2_SPEED	__HAL_TIM_SET_COMPARE(&htim5,TIM_CHANNEL_2,board_fun_three);	//板载风扇转速与占空比成反比,灯珠散热风扇

void board_task(void);
void board_init(void);

#endif



log.c

#include "log.h"

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

PUTCHAR_PROTOTYPE
{
	SEGGER_RTT_PutChar(0, ch);  //重映射RTT
	return ch;
}

log.h

#ifndef __LOG_H
#define __LOG_H
#include "stdio.h"
#include "SEGGER_RTT.h"

#define USER_DEBUG_EN 1 //用户使用日志打印的总开关
 
#ifdef USER_DEBUG_EN
	#define Debug_printf(format, ...) 	printf(RTT_CTRL_TEXT_WHITE format , ##__VA_ARGS__)//"\r\n"
	#define Debug_info(format, ...)   	printf(RTT_CTRL_TEXT_GREEN"[main]info:" format "\r\n", ##__VA_ARGS__)
	#define Debug_debug(format, ...)  	printf(RTT_CTRL_TEXT_WHITE"[main]debug:" format "\r\n", ##__VA_ARGS__)
	#define Debug_warning(format, ...)  printf(RTT_CTRL_TEXT_YELLOW"[main]debug:" format "\r\n", ##__VA_ARGS__)
	#define Debug_error(format, ...)  	printf(RTT_CTRL_TEXT_RED"[main]error:" format "\r\n",##__VA_ARGS__)
#else
	#define Debug_printf(format, ...)
	#define Debug_info(format, ...)
	#define Debug_debug(format, ...)
	#define Debug_warning(format, ...)
	#define Debug_error(format, ...)
#endif

#endif


你可能感兴趣的:(STMCUBE_IDE,stm32,架构,嵌入式硬件)