说明:
1、这种架构避免在更新STM32CUBEMX配置后把用户代码清除掉
2、利用这种时间片的架构可以使得代码架构清晰易于维护
创建步骤:
1、使用STM32CUBEMX创建基础工程
2、新建用户代码目录
3、构建基础的代码框架
选择外部高速时钟
配置下载调试接口
配置时钟线
开一个只有定时功能的定时器(中断1ms)
配置工程
打开KEIL工程
创建两个文件夹目录
把实际的这两个目录文件夹从别的工程拷贝到本工程根目录下或者是自己新建
添加文件
添加文件之后的实际效果
包含头文件
必须要勾选microlib才能打印日志
然后写一个闪灯的测试程序可以发现整个工程按照我们的意愿编译成功并且可以正常运行
#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