stm32f103rct6,正點原子mini板,大彩4.3寸串口屏,w25q16掉電保存數據;趂reerto。 //學習交流
單片機源程序如下:
- #include "led.h"
- #include "delay.h"
- #include "sys.h"
- #include "FreeRTOS.h"
- #include "task.h"
- #include "hmi_driver.h"
- #include "hmi_user_uart.h"
- #include "cmd_queue.h"
- #include "cmd_process.h"
- #include "stdio.h"
- #include "stdint.h"
- #include "hmi_ctl.h"
- #include "motor.h"
- #include "spi.h"
- #include "flash.h"
- extern struct Para xi;
- extern struct Para yu;
- volatile uint32 timer_tick_count = 0; //定時器節拍
- static uint8 update_en = 0;
- uint8 cmd_buffer[CMD_MAX_SIZE];//指令緩存
- uint8 jogadd ; //對應ccw
- uint8 jogsub ; //對應cw
- int32 jogSpeed;
- int32 Number=0;
- int32 huanLength;
- int32 huanSpeed;
- const u8* inbuffer[];
- #define SIZE 10
- u8 datatemp[SIZE];
- #define FLASH_SIZE 2*1024*1024 //FLASH 大小為2M字節
- //任務優先級
- #define START_TASK_PRIO 1
- //任務堆棧大小
- #define START_STK_SIZE 128
- //任務句柄
- TaskHandle_t StartTask_Handler;
- //任務函數
- void start_task(void *pvParameters);
- //任務優先級
- #define LED0_TASK_PRIO 3
- //任務堆棧大小
- #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);
- u8 key;
- void SetScreen(uint16 screen_id);
- void UpdateUI(void);
- int main(void)
- {
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//設置系統中斷優先級分組4
- delay_init(); //延時函數初始化
- uart_init(115200); //初始化串口
- LED_Init(); //初始化LED
-
- //創建開始任務
- 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(); //退出臨界區
- }
- // LED0主任務函數
- void led0_task(void *pvParameters)
- {
-
- u8 i=0;
- int32 speed=0;
- qsize size = 0;
- uint32 timer_tick_last_update = 0; //上一次更新的時間
- SPI_Flash_Init(); //SPI FLASH 初始化
-
- /*串口初始化,波特率設置為9600*/
- UartInit(9600);
- SetScreen(0);
- SetTextValueInt32(0,15,Number);
- /*清空串口接收緩沖區*/
- queue_reset();
- /*延時等待串口屏初始化完畢,必須等待300ms*/
- vTaskDelay(300);
-
-
-
-
- while(1)
- {
-
- key=KEY_Scan(0);
- if(key==WKUP_PRES) //WK_UP 按下,寫入W25Q64
- {
-
- sprintf((char*)inbuffer, "%d", xi.Length);
- SPI_Flash_Write((u8*)inbuffer,FLASH_SIZE-100,SIZE); //從倒數第100個地址處開始,寫入SIZE長度的數據
- }
- if(key==KEY0_PRES) //KEY0 按下,讀取字符串并顯示
- {
-
- SPI_Flash_Read(datatemp,FLASH_SIZE- 100,SIZE); //從倒數第100個地址處開始,讀出SIZE個字節
- sscanf(datatemp, "%u", &xi.Length); //字符串轉整數
- SetTextValueInt32(2,14,(int)xi.Length);
-
- }
-
- // if(IN1==1) {LED0=1;}
- size = queue_find_cmd(cmd_buffer,CMD_MAX_SIZE); //從緩沖區中獲取一條指令
- if(size>0)// 大于0表示是完整指令
- {
- ProcessMessage((PCTRL_MSG)cmd_buffer, size);//指令處理,將cmd_buffer強轉為PCTRL_MSG數據結構
- }
- if(jogadd==1)
- {
- for(i=0;i<8;i++) //
- {
- switch(i)
- {
- case 7:IN1=1;IN2=0;IN3=0;IN4=0;break;
- case 6:IN1=1;IN2=1;IN3=0;IN4=0;break;
- case 5:IN1=0;IN2=1;IN3=0;IN4=0;break;
- case 4:IN1=0;IN2=1;IN3=1;IN4=0;break;
- case 3:IN1=0;IN2=0;IN3=1;IN4=0;break;
- case 2:IN1=0;IN2=0;IN3=1;IN4=1;break;
- case 1:IN1=0;IN2=0;IN3=0;IN4=1;break;
- case 0:IN1=1;IN2=0;IN3=0;IN4=1;break;
- default:break;
- }
- vTaskDelay(1);
- }
- }
- else if(jogadd==0)
- {
- IN1=0;IN2=0;IN3=0;IN4=0;
- }
-
-
- } //while(1)右括號
-
- }
- //LED1任務函數
- void led1_task(void *pvParameters)
- {
- u8 i,j;
- while(1)
- {
- UpdateUI(); vTaskDelay(800);
-
- key=KEY_Scan(0);
- if(key==2||jogadd==1)
- {
- // LED1=0;
- // vTaskDelay(800);
- // LED1=1;
- // vTaskDelay(200);
- // LED1=0;
- for(i=0;i<8;i++) //
- {
-
- switch(i%2)
- {
- case 0:LED1=0;break;
- case 1:LED1=1;break;
- // default:break;
- }
- vTaskDelay(800);
- }
- }
- }
- }
復制代碼
所有資料51hei提供下載:
Welding20190802掉電保存.7z
(351.02 KB, 下載次數: 130)
2019-8-6 00:23 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|