STM32F103R8t6 FreeRTOS工程adc+flash模拟EEPROM源程序
2020-07-23 来源:51hei
STM32单片机源程序如下:
#include 'sys.h'
#include 'delay.h'
#include 'usart.h'
#include 'led.h'
#include 'FreeRTOS.h'
#include 'task.h'
#include 'ADC.h'
#include '74HC595.h'
#include 'key.h'
#include 'stmflash.h'
//const
u8 TEXT_Buffer[]={'0123456789'};
//任务优先级
#define START_TASK_PRIO 1
//任务堆栈大小
#define START_STK_SIZE 128
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);
//任务优先级
#define LED0_TASK_PRIO 2
//任务堆栈大小
#define LED0_STK_SIZE 50
//任务句柄
TaskHandle_t LED0Task_Handler;
//任务函数
void led0_task(void *pvParameters);
//任务优先级
#define LED1_TASK_PRIO 3
//任务堆栈大小
#define LED1_STK_SIZE 50
//任务句柄
TaskHandle_t LED1Task_Handler;
//任务函数
void led1_task(void *pvParameters);
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
delay_init(); //延时函数初始化
uart_init(115200); //初始化串口
LED_Init(); //初始化LED
My_ADC_Init();
Display_74HC595_Init();
KEY_Init();
if(EEPROM_dat1.MASK != 0x50)
{
EEPROM_dat1.F_1=0;
EEPROM_dat1.F_2=0;
EEPROM_dat1.GL=0;
EEPROM_dat1.P_offset=0;
EEPROM_dat1.P_1=0;
EEPROM_dat1.P_2=0;
EEPROM_dat1.SL=0;
EEPROM_dat1.MASK = 0x50;
save_eeprom();
}
//创建开始任务
xTaskCreate((TaskFunction_t )start_task, //任务函数
(const char* )'start_task', //任务名称
(uint16_t )START_STK_SIZE, //任务堆栈大小
(void* )NULL, //传递给任务函数的参数
(UBaseType_t )START_TASK_PRIO, //任务优先级
(TaskHandle_t* )&StartTask_Handler); //任务句柄
vTaskStartScheduler(); //开启任务调度
}
//开始任务任务函数
void start_task(void *pvParameters)
{
taskENTER_CRITICAL(); //进入临界区
//创建LED0任务
xTaskCreate((TaskFunction_t )led0_task,
(const char* )'led0_task',
(uint16_t )LED0_STK_SIZE,
(void* )NULL,
(UBaseType_t )LED0_TASK_PRIO,
(TaskHandle_t* )&LED0Task_Handler);
//创建LED1任务
xTaskCreate((TaskFunction_t )led1_task,
(const char* )'led1_task',
(uint16_t )LED1_STK_SIZE,
(void* )NULL,
(UBaseType_t )LED1_TASK_PRIO,
(TaskHandle_t* )&LED1Task_Handler);
vTaskDelete(StartTask_Handler); //删除开始任务
taskEXIT_CRITICAL(); //退出临界区
}
int times=0;
//LED0任务函数
/*
修改之后保存,再读;如果修改之后直接读会覆盖掉修改的内容。
*/
void led0_task(void *pvParameters)
{
// u8 datatemp[SIZE];
int i;
while(1)
{
// LED0=~LED0;
vTaskDelay(300);
if(KEY3==0)
{
EEPROM_dat1.F_1++;
vTaskDelay(100);
}
// times--;
//
// //Half_show(times);
// printf('KEY_times:%drn',times);
if(KEY1==0)//KEY1??,??STM32 FLASH
{
save_eeprom();
printf('rnsave.............rn');
}
if(KEY2==0) //KEY0??,????????
{
read_eeprom();
printf('F_1:%x ',EEPROM_dat1.F_1);//????????
}
}
}
//LED1任务函数
void led1_task(void *pvParameters)
{
uint16_t i=0;
double k=0.02;
while(1)
{
LED1=0;
vTaskDelay(100);
LED1=1;
vTaskDelay(100);
i = ADC_Value();
i = i * (33000/4095);
// printf('ADC_Vaule:%drn',i);
display_number(i/100,2);
// printf('%lfrn',k);
}
}