1232|2

230

帖子

0

资源

一粒金砂(高级)

【AT-START-F425测评】 六、串口打印及串口调试组件评测 [复制链接]

本帖最后由 kit7828 于 2022-5-11 11:12 编辑

雅特力AT-Start-F425的Demo例程中,有好几个串口usart的例程

image.png 对开发者来说,还是非常不错的。对嵌入式开发来说,串口的功能是必不可少的,尤其是很多的调试信息的输出。

demo中提供了printf的例程,可以用于一般的信息打印。事实上,F425的board文件中都内置了printf串口输出的功能。

为了方便开发,移植了正点原子的串口调试组件usmart。

可以通过串口,输入命令进行调试

只要把需要调试的命令加入到结构数组中就可以完成串口调试,非常方便

							 
extern void LED1_OnOff(uint8_t OnOff); 
extern void LED2_OnOff(uint8_t OnOff); 
extern void LED3_OnOff(uint8_t OnOff); 
//extern void LED4(uint8_t OnOff); 

//函数名列表初始化(用户自己添加)
//用户直接在这里输入要执行的函数名及其查找串
struct _m_usmart_nametab usmart_nametab[]=
{
#if USMART_USE_WRFUNS==1 	//如果使能了读写操作
	(void*)read_addr,"u32 read_addr(u32 addr)",
	(void*)write_addr,"void write_addr(u32 addr,u32 val)",	 
#endif		   
	(void*)LED1_OnOff,"void LED1_OnOff(uint8_t OnOff)",
	(void*)LED2_OnOff,"void LED2_OnOff(uint8_t OnOff)",
	(void*)LED3_OnOff,"void LED3_OnOff(uint8_t OnOff)",
//	(void*)LED4,"void LED4(uint8_t OnOff)",
};						  

为了实现这个功能,需要对串口中断,即接收函数进行改写

void USART1_IRQHandler(void)
{
	u8 Res;
  if(usart_flag_get(USART1, USART_RDBF_FLAG) != RESET)
  {
    /* read one byte from the receive data register */
	  Res = usart_data_receive(USART1);

		
		if((usart1_rx_counter&0x8000)==0)//接收未完成
		{
			if(usart1_rx_counter&0x4000)//接收到0x0d
			{
				if(Res!=0x0a) usart1_rx_counter=0;//接收错误,重新开始
				else usart1_rx_counter|=0x8000;	//接收完成了
			}
			else //还没收到0x0d
			{	
					if(Res==0x0d) usart1_rx_counter|=0x4000;
					else
					{
						usart1_rx_buffer[usart1_rx_counter&0X3FFF]=Res ;
						usart1_rx_counter++;
						if(usart1_rx_counter>(USART1_RECV_LEN-1)) usart1_rx_counter=0;//接收数据错误,重新开始接收  
					}		 
			}
		}   		 

  }

代码是用的RX_TX这个例程修改的,并且修改了管脚的引用,GPIO复用选择PA9、PA10对应串口1的TX和RX

image.png 串口设置的代码如下

void usart_configuration(void)
{
  gpio_init_type gpio_init_struct;
  
  /* enable the usart2 and gpio clock */
//  crm_periph_clock_enable(CRM_USART2_PERIPH_CLOCK, TRUE);  
  crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  
  /* enable the usart1 and gpio clock */  
  crm_periph_clock_enable(CRM_USART1_PERIPH_CLOCK, TRUE);  
//  crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);    

  gpio_default_para_init(&gpio_init_struct);
  
  /* configure the usart2 tx/rx pin */
  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
//  gpio_init_struct.gpio_pins = GPIO_PINS_2 | GPIO_PINS_3;
  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
//  gpio_init(GPIOA, &gpio_init_struct);
 
  /* config usart2 iomux */
//  gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE2, GPIO_MUX_1); 
//  gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE3, GPIO_MUX_1);
  
  /* configure the usart1 tx/rx pin */
  gpio_init_struct.gpio_pins = GPIO_PINS_9 | GPIO_PINS_10;
  gpio_init(GPIOA, &gpio_init_struct);
  
  /* config usart1 iomux */
  gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE9, GPIO_MUX_1); 
  gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE10, GPIO_MUX_1);
  
  /* config usart2 and usart1 nvic interrupt */
//  nvic_irq_enable(USART2_IRQn, 0, 0);
  nvic_irq_enable(USART1_IRQn, 0, 0);
  
  /* configure usart2 param */
//  usart_init(USART2, 115200, USART_DATA_8BITS, USART_STOP_1_BIT);
//  usart_transmitter_enable(USART2, TRUE);
//  usart_receiver_enable(USART2, TRUE);
  
  /* configure usart1 param */
  usart_init(USART1, 115200, USART_DATA_8BITS, USART_STOP_1_BIT);
  usart_transmitter_enable(USART1, TRUE);
  usart_receiver_enable(USART1, TRUE);
  
  /* enable usart2 and usart1 interrupt */
//  usart_interrupt_enable(USART2, USART_RDBF_INT, TRUE);
//  usart_enable(USART2, TRUE);
  
  usart_interrupt_enable(USART1, USART_RDBF_INT, TRUE);		//USART_RDBF_INT:  rdbf interrupt
  usart_enable(USART1, TRUE);  
  
//  usart_interrupt_enable(USART2, USART_TDBE_INT, TRUE); 
//  usart_interrupt_enable(USART1, USART_TDBE_INT, TRUE);     //USART_TDBE_INT:  tdbe interrupt
} 

 关闭了发送中断和注释了串口2相关的设置

由于串口调试组件需要定期进行扫描,所以需要定期调用组件检测函数

int main(void)
{
  system_clock_config();
  nvic_priority_group_config(NVIC_PRIORITY_GROUP_4); 
  at32_board_init();
  usart_configuration();
//  tmr3_configuration(1000,95);
  
  printf("\r\n Test For USART-Debug");
  while(1)
  { 
      at32_led_toggle(LED2);
//      at32_led_toggle(LED3);
//      at32_led_toggle(LED4);      
      delay_ms(100);
		usmart_scan();
  }
}

这里偷懒了,就用了延时函数,后期可以通过定时器自动调用的方式进行扫描

下面是评测结果

image.png  串口命令,通过list可以答应

控制命令直接在串口发送窗口输入就可以,记得加上回车和换行

image.png

下面是接线示意图和效果

image.png

有需要的小伙伴,可以下载工程文件   usmart.rar

usmart.rar

55.59 KB, 下载次数: 1

串口调试组件


回复

1151

帖子

3

资源

版主

谢谢分享呀,这个有命令解释功能。串口是单片机的眼睛,手脚。必须掌握。。。

回复

5259

帖子

18

资源

五彩晶圆(中级)

谢谢分享,串口基础

个人签名

默认摸鱼


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

查找数据手册?

EEWorld Datasheet 技术支持

最新文章 更多>>
    推荐帖子
    DIY 16A 插座线遇到难题

    新买的热水器最大功率是3000W,安装说明上要求必须是16A插座,卫生间插座都是10A的 323132 打电话联系上门安装,人家说我这 ...

    【NXP Rapid IoT评测】+基于web的快速设计必学内容

    NXP Rapid IoT基于web的快速设计平台还是不错的,这个平台是由Atmosphere提供的,在Atmosphere的网站上比NXP网站介绍的更系统和 ...

    DSP与Always-on功能

    本帖最后由 灞波儿奔 于 2020-9-12 21:19 编辑 对于需要Always-on的功能,比如说语音控制或者,设备需要实时获取并实时处理传 ...

    什么是Q

    540066 540067

    大赛分享五:RSL10蓝牙SoC之使用J-Scope调试语音信号

    设备: RSL10-SENSE-GEVK:RSL10 传感器开发套件 关于INMP522(超低噪声数字麦克风)非常强大,无需外接麦克风,低噪声 ...

    【国民技术N32G457评测】一、初次上电简评

    【资料准备】 在拿到开发板之前,想要从网上各种渠道搜罗齐关于此次测评的芯片以及板子所有资料,但很无奈,不知道国民技术出 ...

    关闭
    站长推荐上一条 1/10 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表