OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 257|回复: 0

《M144Z-M3最小系统板使用指南——STM32F103版》第二十六章 USMART调试实验

[复制链接]

1070

主题

1081

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4443
金钱
4443
注册时间
2019-5-8
在线时间
1199 小时
发表于 2024-4-16 11:12:53 | 显示全部楼层 |阅读模式
本帖最后由 正点原子运营 于 2024-4-15 17:30 编辑

第二十六章 USMART调试实验
1)实验平台:正点原子 M144Z-M3 STM32F103最小系统板

2) 章节摘自【正点原子】M144Z-M3最小系统板使用指南——STM32F103版


4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boar ... _mini_sysboard.html

5)正点原子官方B站:https://space.bilibili.com/394620890

6)正点原子STM32技术交流QQ群:725095144

155537c2odj87vz1z9vj6l.jpg

155537nfqovl2gg9faaol9.png

USMART调试组件是正点原子开发的一款灵巧的串口调试交互组件,其功能类似Linux的Shell,支持通过串口调用程序中的任意函数,对调试代码有很大的帮助。通过本章的学习,读者将学习到USMART调试组件的使用。
本章分为如下几个小节:
26.1 硬件设计
26.2 程序设计
26.3 下载验证

26.1硬件设计
26.1.1 例程功能
1. 通过USMART调用程序中的函数,实现对LCD、LED和延时操作
2. LED0闪烁,指示程序正在运行

26.1.2 硬件资源
1. LED
       LED0 - PB5
       LED1 - PE5
2. 正点原子2.8/3.5/4.3/7/10寸TFTLCD模块
3. USART1
       USART1_TX - PA9
       USART1_RX - PA10
4. TIM4

26.1.3 原理图
本章实验使用的USMART组件为应用软件,因此没有对应的连接原理图。

26.2 程序设计
26.2.1 USMART组件
使用USMART组件需要先进行相应的移植操作,USMART组件的移植也非常简单,只需要实现usmart_port.c文件中的5个函数即可完成移植。
第一个函数为usmart_get_input_string(),该函数用于USMART获取串口输入的数据流,该函数的实现,如下所示:
  1. /**
  2. *@brief   获取输入数据流(字符串)
  3. *@note    USMART通过解析该函数返回的字符串以获取函数名及参数等信息
  4. *@param   无
  5. *@retval
  6. *   @arg   0,  没有接收到数据
  7. *   @arg   其他,数据流首地址(不能是0)
  8. */
  9. char *usmart_get_input_string(void)
  10. {
  11.     uint8_t len;
  12.     char *pbuf = 0;
  13.    
  14.     if (g_usart_rx_sta & 0x8000)        /* 串口接收完成? */
  15.     {
  16.          len = g_usart_rx_sta & 0x3fff; /* 得到此次接收到的数据长度 */
  17.          g_usart_rx_buf[len] = '\0';    /* 在末尾加入结束符. */
  18.          pbuf = (char*)g_usart_rx_buf;
  19.          g_usart_rx_sta = 0;            /* 开启下一次接收 */
  20.     }
  21.    
  22.     return pbuf;
  23. }
复制代码
从上面的代码中可以看出,该函数就是从SYSTEM文件夹USART驱动中获取USART1输入的数据。
剩余的四个函数,在宏USMART_ENTIMX_SCAN开启后才需要定义,该宏用于使能runtime统计等功能。
第二个函数为usmart_timx_reset_time(),该函数用于复位runtime,该函数的实现,如下所示:
  1. /**
  2. *@brief   复位runtime
  3. *@note    需要根据所移植到的MCU的定时器参数进行修改
  4. *@param   无
  5. *@retval  无
  6. */
  7. voidusmart_timx_reset_time(void)
  8. {
  9.     /* 清除中断标志位 */
  10.    __HAL_TIM_CLEAR_FLAG(&g_timx_usmart_handle, TIM_FLAG_UPDATE);
  11.     /* 将重装载值设置到最大 */
  12.    __HAL_TIM_SET_AUTORELOAD(&g_timx_usmart_handle, 0XFFFF);
  13.     /* 清空定时器的CNT */
  14.    __HAL_TIM_SET_COUNTER(&g_timx_usmart_handle, 0);
  15.    usmart_dev.runtime = 0;
  16. }
复制代码
该函数复位了runtime功能和用于runtime功能的相关TIM。
第三个函数为usmart_timx_get_time(),用于runtime功能获取时间,该函数的实现,如下所示:
  1. /**
  2. *@brief   获得runtime时间
  3. *@note    需要根据所移植到的MCU的定时器参数进行修改
  4. *@param   无
  5. *@retval  执行时间,单位:0.1ms,最大延时时间为定时器CNT值的2倍*0.1ms
  6. */
  7. uint32_t usmart_timx_get_time(void)
  8. {
  9.     /* 在运行期间,产生了定时器溢出 */
  10.     if (__HAL_TIM_GET_FLAG(&g_timx_usmart_handle, TIM_FLAG_UPDATE) == SET)
  11.     {
  12.          usmart_dev.runtime += 0XFFFF;
  13.     }
  14.    usmart_dev.runtime +=__HAL_TIM_GET_COUNTER(&g_timx_usmart_handle);
  15.     return usmart_dev.runtime;
  16. }
复制代码
应为该函数能够处理一次定时器的溢出情况,因此能获取到的时间上限为定时器计数最大值的两倍。
第四个函数为usmart_timx_init(),用于初始化用于runtime功能的定时器,该函数的实现,如下所示:
  1. /**
  2. *@brief   定时器初始化函数
  3. *@param   arr:自动重装载值
  4. *@param   psc:定时器分频系数
  5. *@retval  无
  6. */
  7. voidusmart_timx_init(uint16_t arr, uint16_t psc)
  8. {
  9.    USMART_TIMX_CLK_ENABLE();
  10.    
  11.    g_timx_usmart_handle.Instance = USMART_TIMX;
  12.    g_timx_usmart_handle.Init.Prescaler = psc;
  13.    g_timx_usmart_handle.Init.CounterMode = TIM_COUNTERMODE_UP;
  14.    g_timx_usmart_handle.Init.Period = arr;
  15.    g_timx_usmart_handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  16.    HAL_TIM_Base_Init(&g_timx_usmart_handle);
  17.    HAL_TIM_Base_Start_IT(&g_timx_usmart_handle);
  18.    HAL_NVIC_SetPriority(USMART_TIMX_IRQn,3,3);
  19.    HAL_NVIC_EnableIRQ(USMART_TIMX_IRQn);
  20. }
复制代码
可以看到,该函数初始化了一个用于runtime功能的定时器,同时使能了该定时器的更新中断。
第五个函数就是用于runtime功能的定时器的中断服务函数,该函数的实现,如下所示:
  1. /**
  2. *@briefUSMART定时器中断服务函数
  3. *@param无
  4. *@retval无
  5. */
  6. voidUSMART_TIMX_IRQHandler(void)
  7. {
  8.     /* 溢出中断 */
  9.     if(__HAL_TIM_GET_IT_SOURCE(&g_timx_usmart_handle,TIM_IT_UPDATE)==SET)
  10.     {
  11.          usmart_dev.scan();                                 /* 执行usmart扫描 */
  12.          __HAL_TIM_SET_COUNTER(&g_timx_usmart_handle, 0);   /* 清空定时器的CNT */
  13.          __HAL_TIM_SET_AUTORELOAD(&g_timx_usmart_handle, 100); /* 恢复原来的设置 */
  14.     }
  15.    
  16.    __HAL_TIM_CLEAR_IT(&g_timx_usmart_handle, TIM_IT_UPDATE);  /* 清除中断标志位 */
  17. }
复制代码
以上就是移植USMART组件时需要实现的五个函数,至此USMART组件的移植也就基本完成了,接下来便可在usart_config.c文件中的usmart_nametab数组中添加需要调试的函数。

26.2.2 实验应用代码
本章实验的应用代码,如下所示:
  1. /**
  2. *@brief   LED状态设置
  3. *@param   无
  4. *@retval  无
  5. */
  6. void led_set(uint8_t sta)
  7. {
  8.    LED1(sta);
  9. }
  10. /**
  11. *@brief   测试函数参数调用
  12. *@param   无
  13. *@retval  无
  14. */
  15. void test_fun(void (*ledset)(uint8_t), uint8_t sta)
  16. {
  17.    ledset(sta);
  18. }
  19. int main(void)
  20. {
  21.    HAL_Init();                         /* 初始化HAL库 */
  22.    sys_stm32_clock_init(RCC_PLL_MUL9); /* 配置时钟,72MHz */
  23.    delay_init(72);                     /* 初始化延时 */
  24.    usart_init(115200);                 /* 初始化串口 */
  25.    usmart_dev.init(72);                /* 初始化USMART */
  26.    led_init();                         /* 初始化LED */
  27.    lcd_init();                         /* 初始化LCD */
  28.    
  29.    lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
  30.    lcd_show_string(30, 70, 200, 16, 16, "USMARTTEST", RED);
  31.    lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
  32.    
  33.     while (1)
  34.     {
  35.          LED0_TOGGLE();
  36.          delay_ms(500);
  37.     }
  38. }
复制代码
从上面的代码中可以看出,main()函数中初始化了USMART组件,并且另外定义了两个函数,分别为:函数led_set()和函数test_fun(),这两个函数都被添加到了usmart_config.c文件的usmart_nametab数组中,用于测试USMART组件,同时也添加了LCD操作和延时等函数,读者也可以添加自行编写的函数进行测试和调试。

26.3 下载验证
在完成编译和烧录操作后,便可通过串口调试助手“体验”USMART组件,例如通过串口调试助手发送“led_set(0)\r\n”或“led_set(1)\r\n”,即可看到板载的LED1亮起或熄灭,也可使用同样的方式调用LCD的操作函数操作LCD进行显示。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-9 18:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表