[学习笔记] 【杰发科技AC7802x测评】linux下开发按键中断试验

[复制链接]
210920|2
 楼主| lulugl 发表于 2023-6-2 08:07 | 显示全部楼层 |阅读模式
【感谢】非常感谢@GrootBrain 大佬的耐心教导,让我学习到了在linux下面开发AC7802x的乐趣。
【实现步聚】
1、在【杰发科技AC7802x测评】1.开箱+linux开发环境搭建+点灯 - - 21ic电子技术开**坛下面下载到工程示例包。我们拿到这个示例包,主要与mdk工程不同的文件有AC78022MBQA_FLASH.ld、Makefile、startup_AC7802x.s这三个文件。
liux_三个不同文件.png
其中startup_AC7802x.s与MDK工程的startup_AC7802x.s区别就是汇编语言的格式不对。
2、用vscode找开工程文件夹后。添加Usre文件夹,下面分别添加Inc和Src文件夹。在Inc下面新建gpio.h,Src下面新建gpio.c。内容如下:

  1. #ifndef _GPIO_H__
  2. #define _GPIO_H__

  3. #include "ac780x_gpio.h"

  4. #define LED1_PORT           (GPIOA)
  5. #define LED1_PIN            (GPIO_PIN2)

  6. #define LED2_PORT           (GPIOA)
  7. #define LED2_PIN            (GPIO_PIN3)

  8. /*LED1动作定义.*/
  9. #define LED1_ON             do{GPIO_SetPinLevel(LED1_PORT, LED1_PIN, GPIO_LEVEL_HIGH);}while(0)
  10. #define LED1_OFF            do{GPIO_SetPinLevel(LED1_PORT, LED1_PIN, GPIO_LEVEL_LOW);}while(0)
  11. #define LED1_TOGGLE         do{if(GPIO_GetPinLevel(LED1_PORT, LED1_PIN)){LED1_OFF;}else{LED1_ON;}}while(0)

  12. /*LED2动作定义.*/
  13. #define LED2_ON             do{GPIO_SetPinLevel(LED2_PORT, LED2_PIN, GPIO_LEVEL_HIGH);}while(0)
  14. #define LED2_OFF            do{GPIO_SetPinLevel(LED2_PORT, LED2_PIN, GPIO_LEVEL_LOW);}while(0)
  15. #define LED2_TOGGLE         do{if(GPIO_GetPinLevel(LED2_PORT, LED2_PIN)){LED2_OFF;}else{LED2_ON;}}while(0)

  16. #define KEY_PORT            (GPIOA)
  17. #define KEY_PIN             (GPIO_PIN11)

  18. #define NMI_PORT            (GPIOB)
  19. #define NMI_PIN             (GPIO_PIN2)


  20. void GPIO_LedInit(void);


  21. void GPIO_KeyInit(void);

  22. #endif
gpio.c
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("AutoChips Software") are
  4. * protected under relevant copyright laws. The information contained herein is
  5. * confidential and proprietary to AutoChips Inc. and/or its licensors. Without
  6. * the prior written permission of AutoChips inc. and/or its licensors, any
  7. * reproduction, modification, use or disclosure of AutoChips Software, and
  8. * information contained herein, in whole or in part, shall be strictly
  9. * prohibited.
  10. *
  11. * AutoChips Inc. (C) 2022. All rights reserved.
  12. *
  13. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  14. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("AUTOCHIPS SOFTWARE")
  15. * RECEIVED FROM AUTOCHIPS AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
  16. * ON AN "AS-IS" BASIS ONLY. AUTOCHIPS EXPRESSLY DISCLAIMS ANY AND ALL
  17. * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
  18. * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
  19. * NONINFRINGEMENT. NEITHER DOES AUTOCHIPS PROVIDE ANY WARRANTY WHATSOEVER WITH
  20. * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
  21. * INCORPORATED IN, OR SUPPLIED WITH THE AUTOCHIPS SOFTWARE, AND RECEIVER AGREES
  22. * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
  23. * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
  24. * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN AUTOCHIPS
  25. * SOFTWARE. AUTOCHIPS SHALL ALSO NOT BE RESPONSIBLE FOR ANY AUTOCHIPS SOFTWARE
  26. * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  27. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND AUTOCHIPS'S
  28. * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE AUTOCHIPS SOFTWARE
  29. * RELEASED HEREUNDER WILL BE, AT AUTOCHIPS'S OPTION, TO REVISE OR REPLACE THE
  30. * AUTOCHIPS SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
  31. * CHARGE PAID BY RECEIVER TO AUTOCHIPS FOR SUCH AUTOCHIPS SOFTWARE AT ISSUE.
  32. */

  33. /******************************************************************************
  34. * @version: V1.0.0  demo
  35. ******************************************************************************/

  36. /*!
  37. * [url=home.php?mod=space&uid=288409]@file[/url] gpio.c
  38. *
  39. * [url=home.php?mod=space&uid=247401]@brief[/url] This file contains the user gpio function..
  40. *
  41. */

  42. /* ===========================================  Includes  =========================================== */
  43. #include "gpio.h"
  44. #include "stdbool.h"

  45. /* ============================================  Define  ============================================ */
  46. #define GET_KEY1_STS()      (bool)(GPIO_GetPinLevel(KEY_PORT, KEY_PIN))
  47. #define GET_NMI_STS()       (bool)(GPIO_GetPinLevel(NMI_PORT, NMI_PIN))

  48. /* ===========================================  Typedef  ============================================ */

  49. /* ==========================================  Variables  =========================================== */

  50. /* ====================================  Functions declaration  ===================================== */

  51. /* ======================================  Functions define  ======================================== */

  52. /*!
  53. * @brief   EXTI_Key_Callback(void *device, uint32_t wpara, uint32_t lpara)
  54. *
  55. * @param   device:
  56. * @param   wpara:
  57. * @param   lpara: 0
  58. *
  59. * [url=home.php?mod=space&uid=266161]@return[/url]  none
  60. */
  61. void EXTI_Key_Callback(void *device, uint32_t wpara, uint32_t lpara)
  62. {
  63.     if (GET_KEY1_STS() == false)  /*判断是否为KEY1唤醒*/
  64.     {
  65.         LED1_ON;
  66.         LED2_ON;
  67.     }
  68.     else
  69.     {
  70.         /*None*/
  71.     }
  72. }
  73. /*!
  74. * [url=home.php?mod=space&uid=555622]@prototype[/url] SPM_Callback(void *device, uint32_t wpara, uint32_t lpara)
  75. *
  76. * @param   device:
  77. * @param   wpara:
  78. * @param   lpara: 0
  79. *
  80. * @return   void
  81. *
  82. */
  83. void SPM_Callback(void *device, uint32_t wpara, uint32_t lpara)
  84. {

  85. }
  86. /*!
  87. * @brief   GPIO_LedInit(void)
  88. *
  89. * @param   none
  90. *
  91. * @return  none
  92. */
  93. void GPIO_LedInit(void)
  94. {
  95.     /*初始化引脚功能,如果引脚上电后默认为GPIO,可省略掉初始化步骤.
  96.       有部分引脚上电默认为非GPIO,则必须选择其功能为GPIO才能作为GPIO使用.*/
  97.     GPIO_SetFunc(LED1_PORT, LED1_PIN, GPIO_FUN0);/*! 功能复用选择.*/
  98.     GPIO_SetFunc(LED2_PORT, LED2_PIN, GPIO_FUN0);

  99.     /*! 设置LED引脚为GPIO输出.*/
  100.     GPIO_SetDir(LED1_PORT, LED1_PIN, GPIO_OUT);
  101.     GPIO_SetDir(LED2_PORT, LED2_PIN, GPIO_OUT);

  102.     LED1_ON;
  103.     LED2_ON;
  104. }

  105. /*!
  106. * @brief   GPIO_KeyInit(void)
  107. *
  108. * @param   none
  109. *
  110. * @return  none
  111. */
  112. void GPIO_KeyInit(void)
  113. {
  114.     /*初始化引脚功能,如果引脚上电后默认为GPIO,可省略掉初始化步骤.
  115.       有部分引脚上电默认为非GPIO,则必须选择其功能为GPIO才能作为GPIO使用.*/
  116.     GPIO_SetFunc(KEY_PORT, KEY_PIN, GPIO_FUN0); /*功能复用选择.*/

  117.     /*设置按键引脚为输入,检测按键动作.*/
  118.     GPIO_SetDir(KEY_PORT, KEY_PIN, GPIO_IN);    /*设置为输入模式.*/

  119.     /*使能KEY1的外部中断,设置为下降沿产生中断,当按下按键时产生中断.*/
  120.     GPIO_EnableExtInterrupt(KEY_PORT, KEY_PIN, EXTI_TRIGGER_FALLING);

  121.     /*设置外部中断,中断回调函数.*/
  122.     GPIO_SetCallback(KEY_PIN, EXTI_Key_Callback);

  123.     SPM_EnableModuleWakeup(SPM_MODULE_GPIO, ENABLE);
  124.     /*设置中断回调函数*/   /*注意,GPIO唤醒,只会进GPIO口中断,不会进SPM中断,部分外设会进SPM中断*/
  125.     /*SPM_SetCallback(SPM_Callback);*/
  126. }

  127. /*!
  128. * @prototype GPIO_MCUGotoSleep(void)
  129. *
  130. * @param[in] void
  131. *
  132. * @return   void
  133. *
  134. */
  135. void GPIO_MCUGotoSleep(void)
  136. {
  137.     mdelay(2000);
  138.     /*休眠前关闭LED1/LED2.*/
  139.     LED1_OFF;
  140.     LED2_OFF;
  141.     /*进入STOP模式.*/
  142.     SysStop();
  143. }


  144. /* =============================================  EOF  ============================================== */
3、添加新加的.c文件、.h头文件到makefile文件中。
gcc添加头文件包含路径.png gcc添加c源文件包含路径.png
4、为了在烧写时避免书写太长的命令,添加.pack包到工程里面,在工程目录下面新建pyocd.yaml文件,里面包含pack包:
yaml文件.png
5、make工程,在build目录下生成的.bin、.elf、.hex文件:
gccmake工程OK.png
6、接上stlink到开发板,开发板接12V,并打开电源开关。虚拟机会提示USB设备接入到哪里,我们选择接入到虚拟机:
usb设备接入到虚拟机.png
7、烧写固件到开发板:
输入命令:pyocd load ./build/AC7802_GPIO.elf --target ac78022mbqa
  1. lugl@lugl-virtual-machine:~/ac7802/AC7802_GPIO$ pyocd load ./build/AC7802_GPIO.elf --target ac78022mbqa
  2. 0000345 I Loading /home/lugl/ac7802/AC7802_GPIO/build/AC7802_GPIO.elf [load_cmd]
  3. [==================================================] 100%
  4. 0000782 I Erased 0 bytes (0 sectors), programmed 0 bytes (0 pages), skipped 4608 bytes (9 pages) at 10.31 kB/s [loader]
8、重启开发板后,两个LED灯亮,2秒钟后灯熄灭进入睡眠模式,我们按下KEY1,可以唤醒MCU,两个LED灯又亮了,如此循环。
【总结】
优点:
使用gcc编译,相比mdk的编译速度要快很多。而且可以跨平台开发。
缺点:
新建工程有点难度,对汇编、makefile的基础知识要有所了解。烧写需要用到命令行,交互不是很方便。

GrootBrain 发表于 2023-6-2 09:55 | 显示全部楼层
相互学习呀,也跟你学到了yaml文件的用法。其实还有make file做法
 楼主| lulugl 发表于 2023-6-2 10:53 | 显示全部楼层
GrootBrain 发表于 2023-6-2 09:55
相互学习呀,也跟你学到了yaml文件的用法。其实还有make file做法

再次感谢大佬!想办法把有空再教教我的debug。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

188

主题

844

帖子

12

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