春娇霹雳娃 发表于 2023-7-24 16:01

基于MM32A0140实现AT从机的人机交互工程

本帖最后由 春娇霹雳娃 于 2023-8-16 17:32 编辑

#申请原创# @21小跑堂

1.00


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)外观如下图所示:


MM32A0140电路图如下所示:


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


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(灯亮)



3.1 AT软件配置

at_port.c文件放在整个软件board板级,可绑定具体芯片。本实验将MM32A0140的UART1作为传输端口,使用终端实现接收数据。
at_cmd_led.c文件创建指令组,实现对小灯的控制
main.c文件调用at_port.c中的at_server组件,在while循环函数中调用task函数,解析AT指令

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

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

    /* GPIOA. */
    RCC_EnableAHB1Periphs(RCC_AHB1_PERIPH_GPIOA, true);
    RCC_ResetAHB1Periphs(RCC_AHB1_PERIPH_GPIOA);
}设置结束字符为\r\n#define AT_CMD_END_MARK_DEFAULT "\r\n" /* the end mark of at command. */
#define AT_END_MARK_LEN 4u /* the length of at command end mark. */
#define AT_CMD_NAME_LEN 16u /* the length of at command name. */定义AT指令参数格式
#define AT_CMD_CHAR_0 '0'
#define AT_CMD_CHAR_9 '9'
#define AT_CMD_QUESTION_MARK '?'
#define AT_CMD_EQUAL_MARK '='
#define AT_CMD_L_SQ_BRACKET '['
#define AT_CMD_R_SQ_BRACKET ']'
#define AT_CMD_L_ANGLE_BRACKET '<'
#define AT_CMD_R_ANGLE_BRACKET '>'
#define AT_CMD_COMMA_MARK ','
#define AT_CMD_SEMICOLON ';'
#define AT_CMD_CR '\r'
#define AT_CMD_LF '\n'AT指令解析
typedef enum
{
AT_RESULT_OK = 0, /* at command parsing result is no error */
AT_RESULT_FAILE = 1, /* at command parsing result have a generic error
*/
AT_RESULT_NULL = 2, /* at command parsing result not need return */
AT_RESULT_CMD_ERR = 3, /* at command format error or No way to execute
*/
AT_RESULT_CHECK_FAILE = 4, /* at command expression format is error */
AT_RESULT_PARSE_FAILE = 5, /* at command arguments parse is error */
} at_result_t;AT 适配结构体
typedef struct
{
at_server_init_t init; /* the at server initialization port. */
at_server_write_t write; /* the at adapter writer buffer port.*/
at_server_read_t read; /* the at adapter read buffer port. */
char * buf; /* the at adapter receive buffer. */
uint32_t buf_size; /* the at adapter receive buffer size. */
} at_adapter_t;AT指令格式
typedef struct
{
char * name; /* the pointer of at command name. */
char * args_expr; /* the pointer of at command parameter. */
at_server_test_t test; /* query the command parameter format and value
range. */
at_server_query_t query; /* return the current value of the command
parameter. */
at_server_setup_t setup; /* set the parameters specified by the user to
the corresponding function. */
at_server_exec_t exec; /* execute related operations. */
} at_cmd_t;AT 结构定义
typedef struct
{
at_adapter_t * adapter; /* the pointer of at adapter port. */
at_cmd_t ** cmd_list; /* the pointer of at command list. */
uint32_t cmd_num; /* the number of at command list. */
uint32_t remaining; /* the remaining of the receive buffer. */
char end_mark; /* the end mark of at command. */
} at_server_t;
AT server可实现主从机通信,本实验直接使用PC与AT server进行通信,通过串口输入的AT指令,控制小灯两灭,实现人机交互工程。

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


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


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


小灯LED1亮的结果如下图所示:


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

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

extern const at_adapter_t at_adapter;
at_server_t at_server_local;

void at_write(char * buf, uint32_t len);

int main(void){
    BOARD_Init();

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

    while (1){
      at_server_task(&at_server_local); /* loop the at server task. */}}
5.附件
5.1 电路图:
5.2 工程文件:




xld0932 发表于 2023-7-26 09:23

春娇霹雳娃 发表于 2023-7-31 17:44

20.00
请在此处填写付费后可见内容

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从机发送命令,例如查询设备状态、设置参数等。

页: [1]
查看完整版本: 基于MM32A0140实现AT从机的人机交互工程