[学习笔记] 【AutoChips 7801x MCU评测报告】+基于UCOS的生产线计数系统

[复制链接]
3419|7
 楼主| yljon 发表于 2020-6-9 22:34 | 显示全部楼层 |阅读模式
基于UCOS的生产线计数系统

一、设计我要的计数系统:
我要将生产线的产品进行计数:1.记录产品总数;2.记录不良品数量;
这个逻辑关系是:检测到产品是良品就将总数+1;检测到产品是不良品将总数+1同时将不良品数+1,如下图所示:

0.逻辑.png

二、初识开发板,准备好硬件
       收到快递短信,去拿快递,一眼就认出是我的,因为快递包装秉承二姨家的作风:黑色塑料袋+气泡袋+静电袋。
拿到开发板,看上去很不错,
1.供电是USB口,我要准备USB线
2.找到手头ST_Link
3.找到我这个多次出场的串口屏
有这几样就满足我测试需求了,好了,开动。

0.硬件.jpg

三、到官网找资料看看,电路图要搞到
上官网( http://www.autochips.com/cn/MCU/info/AC7801x/ )找些资料看看,
电路图找到了:
确认了几个信息:
串口使用UART1,在PA4和PA5;
按钮作为计数用,K6/K7在PC6和PA11;
这个信息在后面写程序要用啊,提前准备着

0.dianlu.png

5.电路图.png

四、搭建环境,开始让KEIL工作
ST-LINK的驱动以前好像装过,
用USB线将开发板连接电脑,在设备管理器看见这样:

4.DD.png

打开KEIL,在设置里看见这样,至此驱动安装就OK啦。

2.DD.png

五、搭建环境,芯片的PACK下载安装
由于我的开发环境是KEIL,从官网下载安装的是AutoChips.AC780x_DFP.0.0.2.pack
在KEIL里看见如下就意味着PACK搞好了。

1.芯片.png

六、搞定代码,点亮屏幕
从官网直接下载了一个UCOS,这可是好东西,都移植好的UCOS,使用爽歪歪啊

6.down UCOS.png

AC7801X的串口驱动和按钮驱动都很简单,如下代码看一下就懂了;
移植好的UCOS也不费劲,用它演示的这2个线程即可;
干脆将所有代码都贴出来,这就这么一点,全部放在main.c文件中了:



  1. #include "main.h"
  2. #include "ac780x_gpio.h"
  3. #include "ucos_ii.h"  

  4. #include "ac780x_uart.h"
  5. #include "ac780x_uart_reg.h"

  6. static OS_STK s_task0Stk [Task0StkLengh];       /* Define the DemoTask0 stack */
  7. static OS_STK s_task1Stk [Task1StkLengh];       /* Define the DemoTask1 stack */


  8. #define KEY_PRESS                      (GPIO_LEVEL_LOW)
  9. #define KEY_RELEASE                    (GPIO_LEVEL_HIGH)
  10. #define KEY6_PORT                        (GPIOC)
  11. #define KEY6_PIN                        (GPIO_PIN6)

  12. #define KEY7_PORT                        (GPIOA)
  13. #define KEY7_PIN                        (GPIO_PIN11)
  14. #define GET_KEY6_STS()                (GPIO_GetPinLevel(KEY6_PORT, KEY6_PIN))       
  15. #define GET_KEY7_STS()                (GPIO_GetPinLevel(KEY7_PORT, KEY7_PIN))       

  16. uint32_t TT;
  17. uint32_t NG;

  18. void mydelay()
  19. {
  20.         uint16_t nn=0;
  21.         for(nn=0;nn<3000;nn++)
  22.         {
  23.         }
  24. }

  25. void EXTI_Key6_Callback(void *device, uint32_t wpara, uint32_t lpara)
  26. {
  27.         if (GET_KEY6_STS() == KEY_PRESS)
  28.         {
  29.                         TT=TT+1;
  30.                         NG=NG+1;
  31.         }
  32. }

  33. void EXTI_Key7_Callback(void *device, uint32_t wpara, uint32_t lpara)
  34. {
  35.         if (GET_KEY7_STS() == KEY_PRESS)
  36.         {
  37.                         TT=TT+1;
  38.         }
  39. }
  40. void KEY_Init(void)
  41. {
  42.         GPIO_SetFunc(KEY6_PORT, KEY6_PIN, GPIO_FUN0);
  43.         GPIO_SetFunc(KEY7_PORT, KEY7_PIN, GPIO_FUN0);
  44.         GPIO_SetDir(KEY6_PORT, KEY6_PIN, GPIO_IN);
  45.         GPIO_SetDir(KEY7_PORT, KEY7_PIN, GPIO_IN);
  46.         GPIO_SetPullup(KEY6_PORT, KEY6_PIN, ENABLE);
  47.         GPIO_SetPullup(KEY7_PORT, KEY7_PIN, ENABLE);
  48.         GPIO_EnableExternalInterrupt(KEY6_PORT, KEY6_PIN, EXTI_TRIGGER_FALLING);
  49.         GPIO_EnableExternalInterrupt(KEY7_PORT, KEY7_PIN, EXTI_TRIGGER_FALLING);
  50.         GPIO_SetCallback(KEY6_PIN, EXTI_Key6_Callback);
  51.         GPIO_SetCallback(KEY7_PIN, EXTI_Key7_Callback);       
  52. }


  53. void UART1_Init(void)
  54. {
  55.     GPIO_SetFunc(GPIOA,GPIO_PIN4, GPIO_FUN3);
  56.     GPIO_SetFunc(GPIOA,GPIO_PIN5, GPIO_FUN3);
  57.     CKGEN_Enable(CLK_UART1, ENABLE);
  58.     CKGEN_SoftReset(SRST_UART1, ENABLE);
  59.     UART_SetDivisor(UART1, (float)APB_BUS_FREQ / 16 / 9600);
  60.     UART_SetDataBits(UART1, UART_WORD_LEN_8BIT);
  61.     UART_SetStopBit(UART1, UART_STOP_1BIT);
  62.     UART_EnableTX(UART1, ENABLE);
  63.     UART_EnableRX(UART1, ENABLE);
  64.     UART_Set2ByteFIFO(UART1, ENABLE);

  65.     UART_SetInterruptEn(UART1, 9);       
  66. }


  67. int main(void)
  68. {
  69.         TT=0;
  70.         NG=0;
  71.         UART1_Init();
  72.         KEY_Init();
  73.     SysTick_Config(SYSTICK_CLOCK);
  74.     OSInit();
  75.     OSTaskCreate(DemoTask0, (void *)0, &s_task0Stk[Task0StkLengh - 1], Task0Prio);
  76.     OSTaskCreate(DemoTask1, (void *)0, &s_task1Stk[Task1StkLengh - 1], Task1Prio);
  77.     OSStart();
  78.     return 0;
  79. }

  80. void DemoTask0(void *pdata)
  81. {
  82.                 uint8_t SendBuf[11];
  83.                 uint8_t ll=0;
  84.                 SendBuf[0]='n';
  85.                 SendBuf[1]='0';
  86.                 SendBuf[2]='.';
  87.                 SendBuf[3]='v';
  88.                 SendBuf[4]='a';
  89.                 SendBuf[5]='l';
  90.                 SendBuf[6]='=';
  91.                 SendBuf[7]='1';
  92.                 SendBuf[8]=0xff;
  93.                 SendBuf[9]=0xff;
  94.                 SendBuf[10]=0xff;
  95.     while (1)
  96.     {
  97.                         SendBuf[7]=TT+0x30;
  98.                         for (ll=0;ll<11;ll++)
  99.                         {
  100.                                         UART_SendData(UART1, SendBuf[ll]);
  101.                                         mydelay();
  102.                         }     
  103.         OSTimeDly(97);
  104.     }
  105. }


  106. void DemoTask1(void *pdata)
  107. {
  108.                 uint8_t SendBuf[11];
  109.                 uint8_t ll=0;
  110.                 SendBuf[0]='n';
  111.                 SendBuf[1]='1';
  112.                 SendBuf[2]='.';
  113.                 SendBuf[3]='v';
  114.                 SendBuf[4]='a';
  115.                 SendBuf[5]='l';
  116.                 SendBuf[6]='=';
  117.                 SendBuf[7]='1';
  118.                 SendBuf[8]=0xff;
  119.                 SendBuf[9]=0xff;
  120.                 SendBuf[10]=0xff;
  121.     while (1)
  122.     {
  123.                         SendBuf[7]=NG+0x30;
  124.                         for (ll=0;ll<11;ll++)
  125.                         {
  126.                                         UART_SendData(UART1, SendBuf[ll]);
  127.                                         mydelay();
  128.                         }
  129.         OSTimeDly(103);
  130.     }
  131. }

七、学习将视频上传
将上述代码编译烧录,看看效果,完全符合设计思路,也具有实用价值,哈哈哈哈

6.run.png

下面演示按钮,视频网址如下:https://www.bilibili.com/video/BV1n54y1Q77A
K7:生产线产品的良品过站,将生产总数+1;
K6:生产线产品检测到不良品,将生产总数+1同时将不良品数量+1;


八、开发板评价
1. AutoChips的这个M0系列的开发板,方便使用;
2. 代码风格和指令有一些特殊,上手时候要看看示例才可以
3. 外设功能大同小异,指令有一些不太一样,看过手册也都能明白
4. 这块开发板的其它功能,待后续慢慢搞
5. 最后,为二姨家举办这样的活动,点赞!!

@21ic小喇叭@21小跑堂 ,我提交作业啦


评论

好嘞,收到~  发表于 2020-6-10 09:07
 楼主| yljon 发表于 2020-6-9 22:40 | 显示全部楼层
本帖最后由 yljon 于 2020-6-9 22:47 编辑

认认真真来评测,改造了几点:
1. 将UART1和UART2的接头由pitch2改造为pitch2.54;
2.装了支撑柱,避免板子背面引脚刮伤;
3.串口屏也加装了支撑柱;

AAAA.jpg


视频那个链接还是不能点啊


Cjy_JDxy 发表于 2020-6-10 09:06 | 显示全部楼层
顶一下。
marginer 发表于 2020-6-10 09:16 | 显示全部楼层
不错不错,改造的也很精致
AutochipsMCU 发表于 2020-6-10 09:20 | 显示全部楼层
caizhiwei 发表于 2020-6-11 15:39 | 显示全部楼层
不错不错,改造的也很精致
zjgchenzhen 发表于 2020-6-12 08:45 | 显示全部楼层
赞,很不错
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

420

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部