找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4123|回复: 3
收起左侧

大彩串口屏控制BYJ步进电机(基于freertos)源程序

[复制链接]
ID:544352 发表于 2019-8-5 21:59 | 显示全部楼层 |阅读模式
stm32f103rct6,正点原子mini板,大彩4.3寸串口屏,w25q16掉电保存数据。基于freerto。  //学习交流

单片机源程序如下:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "FreeRTOS.h"
  5. #include "task.h"

  6. #include "hmi_driver.h"
  7. #include "hmi_user_uart.h"
  8. #include "cmd_queue.h"
  9. #include "cmd_process.h"
  10. #include "stdio.h"
  11. #include "stdint.h"
  12. #include "hmi_ctl.h"
  13. #include "motor.h"
  14. #include "spi.h"
  15. #include "flash.h"
  16. extern struct Para xi;
  17. extern struct Para yu;

  18. volatile uint32  timer_tick_count = 0; //定时器节拍
  19. static uint8 update_en = 0;

  20. uint8 cmd_buffer[CMD_MAX_SIZE];//指令缓存

  21. uint8 jogadd ;    //对应ccw
  22. uint8 jogsub ;    //对应cw
  23. int32 jogSpeed;
  24. int32 Number=0;

  25. int32 huanLength;
  26. int32 huanSpeed;

  27.         const u8* inbuffer[];
  28.         #define SIZE 10
  29.   u8 datatemp[SIZE];
  30.         #define FLASH_SIZE 2*1024*1024        //FLASH 大小为2M字节

  31. //任务优先级
  32. #define START_TASK_PRIO                1
  33. //任务堆栈大小       
  34. #define START_STK_SIZE                 128  
  35. //任务句柄
  36. TaskHandle_t StartTask_Handler;
  37. //任务函数
  38. void start_task(void *pvParameters);

  39. //任务优先级
  40. #define LED0_TASK_PRIO                3
  41. //任务堆栈大小       
  42. #define LED0_STK_SIZE                 50  
  43. //任务句柄
  44. TaskHandle_t LED0Task_Handler;
  45. //任务函数
  46. void led0_task(void *pvParameters);

  47. //任务优先级
  48. #define LED1_TASK_PRIO                3
  49. //任务堆栈大小       
  50. #define LED1_STK_SIZE                 50  
  51. //任务句柄
  52. TaskHandle_t LED1Task_Handler;
  53. //任务函数
  54. void led1_task(void *pvParameters);
  55. u8 key;
  56. void SetScreen(uint16 screen_id);
  57. void UpdateUI(void);

  58. int main(void)
  59. {
  60.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4                  
  61.         delay_init();                                            //延时函数初始化          
  62.         uart_init(115200);                                        //初始化串口
  63.         LED_Init();                                                          //初始化LED


  64.          
  65.         //创建开始任务
  66.     xTaskCreate((TaskFunction_t )start_task,            //任务函数
  67.                 (const char*    )"start_task",          //任务名称
  68.                 (uint16_t       )START_STK_SIZE,        //任务堆栈大小
  69.                 (void*          )NULL,                  //传递给任务函数的参数
  70.                 (UBaseType_t    )START_TASK_PRIO,       //任务优先级
  71.                 (TaskHandle_t*  )&StartTask_Handler);   //任务句柄              
  72.     vTaskStartScheduler();          //开启任务调度

  73.                                                                
  74. }

  75. //开始任务任务函数
  76. void start_task(void *pvParameters)
  77. {
  78.     taskENTER_CRITICAL();           //进入临界区
  79.     //创建LED0任务
  80.     xTaskCreate((TaskFunction_t )led0_task,            
  81.                 (const char*    )"led0_task",          
  82.                 (uint16_t       )LED0_STK_SIZE,
  83.                 (void*          )NULL,                               
  84.                 (UBaseType_t    )LED0_TASK_PRIO,       
  85.                 (TaskHandle_t*  )&LED0Task_Handler);   
  86.     //创建LED1任务
  87.     xTaskCreate((TaskFunction_t )led1_task,     
  88.                 (const char*    )"led1_task",   
  89.                 (uint16_t       )LED1_STK_SIZE,
  90.                 (void*          )NULL,
  91.                 (UBaseType_t    )LED1_TASK_PRIO,
  92.                 (TaskHandle_t*  )&LED1Task_Handler);         
  93.     vTaskDelete(StartTask_Handler); //删除开始任务
  94.     taskEXIT_CRITICAL();            //退出临界区
  95. }

  96. //  LED0主任务函数
  97. void led0_task(void *pvParameters)
  98. {
  99.        
  100.   u8 i=0;
  101.         int32 speed=0;
  102.         qsize  size = 0;
  103.         uint32 timer_tick_last_update = 0; //上一次更新的时间

  104.         SPI_Flash_Init();                  //SPI FLASH 初始化          
  105.        
  106.                 /*串口初始化,波特率设置为9600*/
  107.         UartInit(9600);
  108.   SetScreen(0);
  109.         SetTextValueInt32(0,15,Number);
  110.         /*清空串口接收缓冲区*/
  111.         queue_reset();

  112.         /*延时等待串口屏初始化完毕,必须等待300ms*/
  113.          vTaskDelay(300);
  114.        
  115.        
  116.        
  117.                
  118.         while(1)
  119.         {
  120.                                  
  121.    key=KEY_Scan(0);

  122.                                 if(key==WKUP_PRES)        //WK_UP 按下,写入W25Q64   
  123.                 {
  124.                        
  125.           sprintf((char*)inbuffer, "%d",  xi.Length);
  126.                         SPI_Flash_Write((u8*)inbuffer,FLASH_SIZE-100,SIZE);                //从倒数第100个地址处开始,写入SIZE长度的数据

  127.                 }                                 
  128.                 if(key==KEY0_PRES)        //KEY0 按下,读取字符串并显示
  129.                 {
  130.                        
  131.                         SPI_Flash_Read(datatemp,FLASH_SIZE- 100,SIZE);                                //从倒数第100个地址处开始,读出SIZE个字节
  132.                         sscanf(datatemp, "%u", &xi.Length); //字符串转整数
  133.                         SetTextValueInt32(2,14,(int)xi.Length);  
  134.                        
  135.                 }
  136.                
  137. //                if(IN1==1) {LED0=1;}
  138.                                 size = queue_find_cmd(cmd_buffer,CMD_MAX_SIZE); //从缓冲区中获取一条指令        
  139.                 if(size>0)// 大于0表示是完整指令
  140.                 {
  141.                         ProcessMessage((PCTRL_MSG)cmd_buffer, size);//指令处理,将cmd_buffer强转为PCTRL_MSG数据结构
  142.                 }       

  143.                  if(jogadd==1)
  144.                  {  
  145.        for(i=0;i<8;i++)  //
  146.                          {
  147.                                         switch(i)
  148.                                         {               
  149.                                                 case 7:IN1=1;IN2=0;IN3=0;IN4=0;break;
  150.                                                 case 6:IN1=1;IN2=1;IN3=0;IN4=0;break;
  151.                                                 case 5:IN1=0;IN2=1;IN3=0;IN4=0;break;
  152.                                                 case 4:IN1=0;IN2=1;IN3=1;IN4=0;break;
  153.                                                 case 3:IN1=0;IN2=0;IN3=1;IN4=0;break;
  154.                                                 case 2:IN1=0;IN2=0;IN3=1;IN4=1;break;
  155.                                                 case 1:IN1=0;IN2=0;IN3=0;IN4=1;break;
  156.                                                 case 0:IN1=1;IN2=0;IN3=0;IN4=1;break;
  157.                                                 default:break;
  158.                                         }
  159.                                         vTaskDelay(1);

  160.                          }
  161.             }
  162.                 else if(jogadd==0)
  163.                  {  
  164.                   IN1=0;IN2=0;IN3=0;IN4=0;
  165.                  }       
  166.                  

  167.                          
  168.         }   //while(1)右括号

  169.        
  170. }   

  171. //LED1任务函数
  172. void led1_task(void *pvParameters)
  173. {
  174.         u8 i,j;
  175.     while(1)
  176.     {
  177.                         UpdateUI();  vTaskDelay(800);       
  178.                        
  179.                         key=KEY_Scan(0);
  180.                         if(key==2||jogadd==1)
  181.                         {
  182. //        LED1=0;
  183. //        vTaskDelay(800);
  184. //        LED1=1;
  185. //        vTaskDelay(200);
  186. //                                 LED1=0;
  187.                          for(i=0;i<8;i++)  //
  188.                          {
  189.                                  
  190.                                         switch(i%2)
  191.                                                         {
  192.                                                         case 0:LED1=0;break;
  193.                                                         case 1:LED1=1;break;
  194. //                                                        default:break;
  195.                                                         }

  196.                                         vTaskDelay(800);       

  197.                          }

  198.                         }
  199.     }
  200. }
复制代码

所有资料51hei提供下载:
Welding20190802掉电保存.7z (351.02 KB, 下载次数: 129)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:285863 发表于 2019-8-6 09:58 | 显示全部楼层
系统的思维了 更高一级了
回复

使用道具 举报

ID:870479 发表于 2020-12-29 18:48 | 显示全部楼层
看看电机和屏幕处理的程序
回复

使用道具 举报

ID:908534 发表于 2021-4-19 18:35 | 显示全部楼层
来学习,这程序有点长啊,对于初学者,头大
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表