返回列表 发新帖我要提问本帖赏金: 30.00元(功能说明)

[MM32软件] 基于MM32A0140实现AT从机的人机交互工程

[复制链接]
5145|19
 楼主| 春娇霹雳娃 发表于 2023-7-24 16:01 | 显示全部楼层 |阅读模式
本帖最后由 春娇霹雳娃 于 2023-8-16 17:32 编辑

#申请原创# @21小跑堂

[payamount]1.00[/payamount]
[pay]

1.简介
1.1 AT server
AT Commands最早由发明拨号调制解调器的贺氏公司发明的协议,当时是为了控制 MODEM 。随着网络带宽的升级,速度很低的拨号 MODEM 基本退出了一般的使用市场,但是 AT 指令保留了下来。当时主要的移动电话生产厂家共同为 GSM 研制了一整套 AT 指令,用于控制手机的 GSM 模块。AT 指令在此基础上演化并加入 GSM 07.05 标准以及后来的 GSM 07.07 标准,实现比较健全的标准化。如今,AT 指令也广泛应用于嵌入式开发领域,AT 指令作为主芯片和通讯模块的协议接口,硬件接口一般为串口,这样主控设备可以通过简单的指令和硬件设计完成多种操作。

本项目AT主要特点:
  • AT 组件由 AT Server 组成,组件完成 AT 命令的发送、命令格式及参数判断、命令的响应、响应数据的接收、响应数据的解析等整个 AT 命令数据交互流程。
  • AT Server 提供 AT 指令的注册,将解析完成后的数据提供至用户注册的命令回掉函数中,由用户做进一步处理

1.2 MM32A0140
MM32A0140 微控制器搭载 Arm® Cortex-M0 内核,最高工作频率可达 72MHz,内置 64KB 高速存储器,并集成丰富的 I/O 端口和外设模块。64KB Flash,8KB SRAM。开发板MiniBoard (MM32A0144C6PM)外观如下图所示:
8551364be267b04159.png

MM32A0140电路图如下所示:
6732364be27000d2b0.png

本实验核心为,MM32A0140芯片通过硬件接口(串口)发送AT命令给通讯模块,模块接收到数据之后响应数据。整个实验设计框架如下图所示:
8672764be265334ca7.png

2.实验环境

软件环境:
  • KEIL v5.37
  • A0140 PACK
  • 终端软件Tera Term

硬件环境:
  • JLINK v11.0
  • MiniBoard (MM32A0144C6PM)开发板

3.实验流程
本实验设计LED指令,控制电路板上一个LED,指令如下:
  • AT+LED      初始化LED灯。
  • AT+LED?   查看当前LED灯状态。
  • AT+LED=1(灯灭) 或者AT+LED=0(灯亮)

1742864be31f202e2f.png

3.1 AT软件配置

at_port.c文件放在整个软件board板级,可绑定具体芯片。本实验将MM32A0140的UART1作为传输端口,使用终端实现接收数据。

at_cmd_led.c文件创建指令组,实现对小灯的控制
main.c文件调用at_port.c中的at_server组件,在while循环函数中调用task函数,解析AT指令

配置LED1
  1. /* LED. */
  2. #define BOARD_LED0_GPIO_PORT         GPIOA
  3. #define BOARD_LED0_GPIO_PIN          GPIO_PIN_15
开启时钟
  1. void BOARD_InitBootClocks(void)
  2. {
  3.     CLOCK_ResetToDefault();
  4.     CLOCK_BootToHSI48MHz();

  5.     /* UART1. */
  6.     RCC_EnableAPB2Periphs(RCC_APB2_PERIPH_UART1, true);
  7.     RCC_ResetAPB2Periphs(RCC_APB2_PERIPH_UART1);

  8.     /* GPIOA. */
  9.     RCC_EnableAHB1Periphs(RCC_AHB1_PERIPH_GPIOA, true);
  10.     RCC_ResetAHB1Periphs(RCC_AHB1_PERIPH_GPIOA);
  11. }
设置结束字符为\r\n
  1. #define AT_CMD_END_MARK_DEFAULT "\r\n" /* the end mark of at command. */
  2. #define AT_END_MARK_LEN 4u /* the length of at command end mark. */
  3. #define AT_CMD_NAME_LEN 16u /* the length of at command name. */
定义AT指令参数格式
  1. #define AT_CMD_CHAR_0 '0'
  2. #define AT_CMD_CHAR_9 '9'
  3. #define AT_CMD_QUESTION_MARK '?'
  4. #define AT_CMD_EQUAL_MARK '='
  5. #define AT_CMD_L_SQ_BRACKET '['
  6. #define AT_CMD_R_SQ_BRACKET ']'
  7. #define AT_CMD_L_ANGLE_BRACKET '<'
  8. #define AT_CMD_R_ANGLE_BRACKET '>'
  9. #define AT_CMD_COMMA_MARK ','
  10. #define AT_CMD_SEMICOLON ';'
  11. #define AT_CMD_CR '\r'
  12. #define AT_CMD_LF '\n'
AT指令解析
  1. typedef enum
  2. {
  3. AT_RESULT_OK = 0, /* at command parsing result is no error */
  4. AT_RESULT_FAILE = 1, /* at command parsing result have a generic error
  5. */
  6. AT_RESULT_NULL = 2, /* at command parsing result not need return */
  7. AT_RESULT_CMD_ERR = 3, /* at command format error or No way to execute
  8. */
  9. AT_RESULT_CHECK_FAILE = 4, /* at command expression format is error */
  10. AT_RESULT_PARSE_FAILE = 5, /* at command arguments parse is error */
  11. } at_result_t;
AT 适配结构体
  1. typedef struct
  2. {
  3. at_server_init_t init; /* the at server initialization port. */
  4. at_server_write_t write; /* the at adapter writer buffer port.*/
  5. at_server_read_t read; /* the at adapter read buffer port. */
  6. char * buf; /* the at adapter receive buffer. */
  7. uint32_t buf_size; /* the at adapter receive buffer size. */
  8. } at_adapter_t;
AT指令格式
  1. typedef struct
  2. {
  3. char * name; /* the pointer of at command name. */
  4. char * args_expr; /* the pointer of at command parameter. */
  5. at_server_test_t test; /* query the command parameter format and value
  6. range. */
  7. at_server_query_t query; /* return the current value of the command
  8. parameter. */
  9. at_server_setup_t setup; /* set the parameters specified by the user to
  10. the corresponding function. */
  11. at_server_exec_t exec; /* execute related operations. */
  12. } at_cmd_t;
AT 结构定义
  1. typedef struct
  2. {
  3. at_adapter_t * adapter; /* the pointer of at adapter port. */
  4. at_cmd_t ** cmd_list; /* the pointer of at command list. */
  5. uint32_t cmd_num; /* the number of at command list. */
  6. uint32_t remaining; /* the remaining of the receive buffer. */
  7. char end_mark[AT_END_MARK_LEN]; /* the end mark of at command. */
  8. } at_server_t;

AT server可实现主从机通信,本实验直接使用PC与AT server进行通信,通过串口输入的AT指令,控制小灯两灭,实现人机交互工程。

4.实验样例
整个项目框架如下图所示:
6653164be2d8405e90.png

终端软件波特率设置为9600 bps,接收发送设置如下图所示:
7352364be2f6011963.png

向串口发送AT,串口接收后打印READY
  1. const at_cmd_t at_cmd_at =
  2. {
  3.     .name = "AT",
  4.     .args_expr = NULL,
  5.     .test = NULL,
  6.     .query = NULL,
  7.     .setup = NULL,
  8.     .exec = at_cmd_at_exec
  9. };
定义AT指令下LED
  1. const at_cmd_t at_cmd_led =
  2. {
  3. .name = "AT+LED",
  4. .args_expr = "<value>",
  5. .test = at_cmd_led_test, /* AT+LED=? */
  6. .query = at_cmd_led_query, /* AT+LED? */
  7. .setup = at_cmd_led_setup, /* AT+LED=1, 0 */
  8. .exec = at_cmd_led_exec /* AT+LED */
  9. };
向串口发送AT+LED,串口接收后打印OK
  1. /* when sending AT+LED command will call this function to execute led initialization. */
  2. at_result_t at_cmd_led_exec(at_server_write_t write)
  3. {
  4. char buf[AT_CMD_BUF_SIZE];
  5. /* LED initialize. */
  6. GPIO_Init_Type gpio_init;
  7. gpio_init.Pins = BOARD_LED0_GPIO_PIN;
  8. gpio_init.PinMode = GPIO_PinMode_Out_PushPull;
  9. gpio_init.Speed = GPIO_Speed_50MHz;
  10. GPIO_Init(BOARD_LED0_GPIO_PORT, &gpio_init);
  11. GPIO_WriteBit(BOARD_LED0_GPIO_PORT, BOARD_LED0_GPIO_PIN, 1u);
  12. sprintf(buf, "OK\r\n");
  13. write(buf, strlen(buf));
  14. return AT_RESULT_OK;
  15. }
向串口发送AT+LED?,可查询参数格式和取值范围
  1. /* to query the parameter format and value range for AT+LED=? command. */
  2. at_result_t at_cmd_led_test(at_server_write_t write);
发送AT+LED=0,小灯亮(为1 则灭灯)
  1. /* to set user-specified parameters into the corresponding function. */
  2. at_result_t at_cmd_led_setup(at_server_write_t write, char * args);
串口结果如下图所示:
1485364be3910b2e67.png

小灯LED1亮的结果如下图所示:
7885564be396b2acdb.png

主函数如下:
  1. extern const at_cmd_t at_cmd_at;
  2. extern const at_cmd_t at_cmd_led;

  3. /* set the at command tables. */
  4. const at_cmd_t * at_cmd_list[]={
  5.     &at_cmd_at,
  6.     &at_cmd_led};

  7. extern const at_adapter_t at_adapter;
  8. at_server_t at_server_local;

  9. void at_write(char * buf, uint32_t len);

  10. int main(void){
  11.     BOARD_Init();

  12.     /* at server initialization. */
  13.     at_server_init(&at_server_local,(at_adapter_t *)&at_adapter);
  14.     /* set the at command list for at server. */
  15.     at_server_set_cmd_list( &at_server_local, (at_cmd_t **)at_cmd_list, sizeof(at_cmd_list)/sizeof(* at_cmd_list));

  16.     while (1){
  17.         at_server_task(&at_server_local); /* loop the at server task. */}}

5.附件
5.1 电路图: Mini-A0144_SCH.pdf (999.53 KB, 下载次数: 4)
5.2 工程文件: mini-a0140_at_basic_mdk.zip (532.71 KB, 下载次数: 5)

[/pay]


打赏榜单

21小跑堂 打赏了 30.00 元 2023-07-28
理由:恭喜通过原创审核!期待您更多的原创作品~

评论

AT指令应用于终端设备与PC应用之间的连接与通信的指令,目前的 AT 指令着重应用在蜂窝模块、WiFi 模块、BLE 模块中,目的是为了简化嵌入式设备联网的复杂度。作者在MM32A0140上实现该过程,其原理阐述清晰,步骤详细,值得学习借鉴,  发表于 2023-7-28 13:51
xld0932 发表于 2023-7-26 09:23 | 显示全部楼层
 楼主| 春娇霹雳娃 发表于 2023-7-31 17:44 | 显示全部楼层
[payamount]20.00[/payamount]
[pay]请在此处填写付费后可见内容[/pay]
caigang13 发表于 2023-8-1 07:49 来自手机 | 显示全部楼层
我去,居然还有付费帖子。
 楼主| 春娇霹雳娃 发表于 2023-8-1 09:08 | 显示全部楼层
caigang13 发表于 2023-8-1 07:49
我去,居然还有付费帖子。

robertesth 发表于 2023-8-3 22:52 | 显示全部楼层
根据用户的指令执行相应的操作。              
 楼主| 春娇霹雳娃 发表于 2023-8-4 09:20 | 显示全部楼层
robertesth 发表于 2023-8-3 22:52
根据用户的指令执行相应的操作。

cashrwood 发表于 2023-8-4 17:37 | 显示全部楼层
通过通信连接,可以向AT从机发送命令,例如查询设备状态、设置参数等。
fengm 发表于 2023-8-4 18:30 | 显示全部楼层
实现AT从机的具体方法和细节取决于 应用场景和硬件平台。
backlugin 发表于 2023-8-4 18:44 | 显示全部楼层
从机需要解析和处理来自主机的AT命令。可以使用串口通信接收主机发送的数据,并解析出AT命令。常见的AT命令以"AT"开头,后跟具体的指令和参数。
mollylawrence 发表于 2023-8-4 19:46 | 显示全部楼层
据AT规范,响应通常包括一个响应码和一些额外的信息。可以使用串口通信将响应发送回主机。
pmp 发表于 2023-8-4 19:59 | 显示全部楼层
解析出AT命令,从机需要根据命令类型执行相应的操作。
单片小菜 发表于 2023-8-16 16:50 | 显示全部楼层
竟然还有付费帖子,厉害了,神呀。
lajfda002 发表于 2023-8-16 16:56 | 显示全部楼层
看个帖子,还需要花费十五块钱,真的没谁了。
 楼主| 春娇霹雳娃 发表于 2023-8-16 17:31 | 显示全部楼层
pmp 发表于 2023-8-4 19:59
解析出AT命令,从机需要根据命令类型执行相应的操作。

 楼主| 春娇霹雳娃 发表于 2023-8-16 17:32 | 显示全部楼层
backlugin 发表于 2023-8-4 18:44
从机需要解析和处理来自主机的AT命令。可以使用串口通信接收主机发送的数据,并解析出AT命令。常见的AT命令 ...

 楼主| 春娇霹雳娃 发表于 2023-8-16 17:32 | 显示全部楼层
lajfda002 发表于 2023-8-16 16:56
看个帖子,还需要花费十五块钱,真的没谁了。

 楼主| 春娇霹雳娃 发表于 2023-8-16 17:43 | 显示全部楼层
单片小菜 发表于 2023-8-16 16:50
竟然还有付费帖子,厉害了,神呀。

 楼主| 春娇霹雳娃 发表于 2023-8-16 17:43 | 显示全部楼层
cashrwood 发表于 2023-8-4 17:37
通过通信连接,可以向AT从机发送命令,例如查询设备状态、设置参数等。

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

本版积分规则

认证:灵动系统开发工程师
简介:none........

19

主题

154

帖子

3

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