这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【换取手持数字示波器】+AT-START-F405之串口通讯

共2条 1/1 1 跳转至

【换取手持数字示波器】+AT-START-F405之串口通讯

专家
2024-04-07 19:15:53   被打赏 40 分(兑奖)     打赏

      本人有幸获得雅特力的新品:AT-START-F405 V1.0开发板,关于该板卡评测全网首发。板卡AT32F405RCT7-7MCU,两组USB type-C和type-A的连接器,板上还集成了1颗16M字节的SPI闪存存储器,自带调试/烧录工具AT-Link-EZ,无需额外开发调试工具即可对程序进行在线调试。MCU为Arm Cortex-M4内核,主频高达216MHz。更多资料可移步雅特力官网获取,链接:https://www.arterytek.com/cn/product/AT32F405.jsp#Resource

       开发板外观如下:

布局图.png

正面.jpg背面.jpg       该板卡的主要特色是支HS USB OTG (with PHY)与FS USB OTG,并全面支持雅特力官方主推的AT32 Workbench图形化配置软件。此次就环境搭建,使用PC端的串口调试工具去控制板上的LED展开功能评测。

●环境搭建与资料阅读

    通过上述网站可以获取到SDK包,以及一些数据手册、入门指南等资料,可以使用雅特力官方推荐的IDE(AT32_IDE_V1.0.09)开发,也可使用Keil、IAR等第三方IDE,这里笔者采用Keil搭建开发环境。首先从官方下载基于Keil的pack支持包,见如下附件:

Keil5_AT32MCU_AddOn_V2.3.1.zip

接下来将下载好后的压缩包解压出来,安装“ArteryTek.AT32F402_405_DFP.2.0.5.pack”文件,如下图所示,傻瓜式安装即可。

安装pack包.png安装完成即可使用Keil打开SDK中任意一个demo工程。这里我们就以“printf”例程为参考模板,官方提供了丰富的参考工程,工程路径:“AT32F402_405_Firmware_Library_V2.0.6\project\at_start_f405\examples\usart\printf”,该工程只用到串口输出,在此基础上添加串口接收功能接口函数。

通过“AT_START_F405_V1.0_SCH”原理图文档,可知连接了AT-Link-EZ模块端的Type-C接口,意味着连接串口1。

串口连线.png再者,我们需要查看管脚复用功能参考手册,以及需要注意串口状态寄存器的设置,主要查看“RM_AT32F402_405_CH_V2.00.pdf”文档,复用功能以及状态寄存器标志位设置正确后,才能在串口接收中断函数中处理接收数据。

管脚复用.png串口状态寄存器.png

●代码编写

编写串口接收中断函数,在“at32f402_405_usart.c”中实现。

void USART1_IRQHandler(void)
{
	u8 Res;
	
	if(usart_interrupt_flag_get(USART1, USART_RDBF_FLAG) != RESET)
	{
		Res = usart_data_receive(USART1);	//读取接收到的数据
		if((USART_RX_status & 0x0020) == 0)//接收未完成
		{
			if(USART_RX_status & 0x0040)  //接收到0x0d
			{
				if(Res != 0x0a)USART_RX_status = 0; //接收错误,重新开始接收
				else 
				{
					USART_RX_status |= 0x0020;     //接收完成
					USART_RX_FLAG = 0x01;
				}
			}
			else   //还没接收到到0x0d
			{
				if(Res == 0x0d)USART_RX_status |= 0X0040;
				else
				{
					USART_RX_BUF[USART_RX_status & 0X3fff] = Res;
					USART_RX_status++;
					if(USART_RX_status > USART_REC_LEN -1)USART_RX_status = 0;  //接收错误,重新开始接收
				}
			}
		}
	}
}

main.c中具体代码实现如下:

#include "at32f402_405_board.h"
#include "at32f402_405_clock.h"
#include "string.h"

//用于命令解析用的命令值
#define LED3ON	1
#define LED3OFF	2
#define LED4ON	3
#define LED4OFF	4
#define COMMANDERR	0XFF

extern u16 USART_RX_status;
extern u8 USART_RX_BUF[USART_REC_LEN];
extern u8 USART_RX_FLAG;


//将字符串中的小写字母转换为大写
void LowerToUpp(u8 *str,u8 len)
{
	u8 i;
	for(i=0;i<len;i++)
	{
		if((96<str[i])&&(str[i]<123))	
		str[i]=str[i]-32;				
	}
}

u8 dataprocess(u8 * str)
{
	u8 commanddata = COMMANDERR;
	if(strcmp((char *)str,"LED3ON")==0)commanddata = LED3ON;
	else if(strcmp((char *)str,"LED3OFF")==0)commanddata = LED3OFF;
	else if(strcmp((char *)str,"LED4ON")==0)commanddata = LED4ON;
	else if(strcmp((char*)str,"LED4OFF")==0)commanddata = LED4OFF;
	return commanddata;
}	


__IO uint32_t time_cnt = 0;


/**
  * @brief  main function.
  * @param  none
  * @retval none
  */
int main(void)
{
	u8 len = 0;
  u8 temp_string[100]={0};
	u8 command = COMMANDERR;
  system_clock_config();
  at32_board_init();
  uart_print_init(115200);
	
  while(1)
  {
		if(USART_RX_FLAG == 0x01)
		{
		len = USART_RX_status & 0x3fff;
		sprintf((char *)temp_string,"%s",USART_RX_BUF);
		LowerToUpp(temp_string,len);
		command = dataprocess(temp_string);
		if(command != COMMANDERR)
		{
			printf("receive command data: %d\r\n",command);
			switch(command)
			{
				case LED3ON:
					if(gpio_output_data_bit_read(LED3_GPIO,LED3_PIN)==RESET)
						printf("LED3 already ON!\r\n");
					else
						at32_led_on(LED3);
					break;
				case LED3OFF:
					if(gpio_output_data_bit_read(LED3_GPIO,LED3_PIN)==SET)
						printf("LED3 already OFF!\r\n");
					else
						at32_led_off(LED3);
					break;
				case LED4ON:
					if(gpio_output_data_bit_read(LED4_GPIO,LED4_PIN)==RESET)
						printf("LED4 already ON!\r\n");
					else
						at32_led_on(LED4);
					break;
				case LED4OFF:
					if(gpio_output_data_bit_read(LED4_GPIO,LED4_PIN)==SET)
						printf("LED4 already OFF!\r\n");
					else
						at32_led_off(LED4);
					break;
			}					
		}
    else
		{
			printf("此命令无效!\r\n");
		}
		USART_RX_status = 0;
		USART_RX_FLAG = 0;
		memset(USART_RX_BUF,0,sizeof(USART_RX_BUF));
	}
		else
    delay_ms(500);
  }
}

由以上源码可知,可通过Type-C数据线连接到电脑端,通过串口调试工具,发送“LED3ON”、“LED3OFF”、“LED4ON”、“LED4OFF”字符,即可对板上的LED3、LED4进行开、关控制,当然命令中字母的大小写均有效,不是其中的字符则会打印输出“此命令无效!”提示信息。中断函数中主要注意USART_STS寄存器的第5位与第6位的值。

●下载、效果展示

识别下载器.png下载算法.png在PC端上的串口调试助手上发送指定字符,则可实现对板上的LED3、LED4控制。

串口输出.png两盏灯同时被点亮的状态如下:

点灯.jpg




关键词: 换取手持数字示波器     AT-START-F405    

工程师
2024-04-14 14:39:48     打赏
2楼


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]