本帖最后由 春娇霹雳娃 于 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)外观如下图所示:
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[AT_END_MARK_LEN]; /* the end mark of at command. */
- } at_server_t;
AT server可实现主从机通信,本实验直接使用PC与AT server进行通信,通过串口输入的AT指令,控制小灯两灭,实现人机交互工程。
4.实验样例
整个项目框架如下图所示:
终端软件波特率设置为9600 bps,接收发送设置如下图所示:
向串口发送AT,串口接收后打印READY- const 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[AT_CMD_BUF_SIZE];
- /* 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 电路图:
Mini-A0144_SCH.pdf
(999.53 KB, 下载次数: 4)
5.2 工程文件:
mini-a0140_at_basic_mdk.zip
(532.71 KB, 下载次数: 5)
[/pay]
|