OpenEdv-开源电子网

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

第三篇 STM32F030移植USMART调试组件

[复制链接]

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-5-9 22:45:57 | 显示全部楼层 |阅读模式
用过原子哥开发板或者用过USMART调试组件的同学应该都知道,这是原子哥自家编写的一个在STM32系列单片机上调试程序用的一个组件,详情请看原子相关教程的介绍

接下来我将它移植到STM32F0系列片子上去,文件来自这里(为原子哥修正了一个小bug)
工程来自这里
一、拷贝USMART文件夹到工程文件夹,并添加到工程
二、双击打开usmart.c文件,大致浏览一下代码,发现原子哥用了TIM2作为定时扫描,再打开F0的编程参考手册,发现没有定时器2
1.png
除了TIM2还剩下很多的定时器,这里我选择了TIM14
三、将原子哥代码中使用到TIM2的地方都换成TIM14,或者用自动适配的方式(本次采用的方式)
3.1 usmart_reset_runtime()函数修改
[mw_shl_code=applescript,true]void usmart_reset_runtime(void)
{
#if __CORTEX_M == 0x00  //Cortex-M0
  TIM_ClearFlag(TIM14, TIM_FLAG_Update);
  TIM_SetAutoreload(TIM14, 0xFFFF);
  TIM_SetCounter(TIM14, 0);
#else
        TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清除中断标志位
        TIM_SetAutoreload(TIM2,0XFFFF);//将重装载值设置到最大
        TIM_SetCounter(TIM2,0);                //清空定时器的CNT
#endif
        usmart_dev.runtime=0;       
       
}[/mw_shl_code]
3.2 usmart_get_runtime()函数代码
[mw_shl_code=applescript,true]u32 usmart_get_runtime(void)
{
#if __CORTEX_M == 0x00  //Cortex-M0
  if(TIM_GetFlagStatus(TIM14, TIM_FLAG_Update)==SET)
#else
   if(TIM_GetFlagStatus(TIM2,TIM_FLAG_Update)==SET)//在运行期间,产生了定时器溢出
#endif
        {
                usmart_dev.runtime+=0XFFFF;
        }
#if __CORTEX_M == 0x00  //Cortex-M0
  usmart_dev.runtime += TIM_GetCounter(TIM14);
#else
        usmart_dev.runtime+=TIM_GetCounter(TIM2);
#endif
        return usmart_dev.runtime;                //返回计数值
} [/mw_shl_code]
3.3 TIM2_IRQHandler()函数代码
[mw_shl_code=applescript,true]#if __CORTEX_M == 0x00  //Cortex-M0
void TIM14_IRQHandler(void)
#else
void TIM2_IRQHandler(void)
#endif
{
#if _SYSTEM_SUPPORT_ROTS == 1
        OSIntEnter();                //进入中断
#endif
#if __CORTEX_M == 0x00  //Cortex-M0
        if(TIM_GetITStatus(TIM14,TIM_IT_Update)==SET)
#else
        if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)//溢出中断
#endif
        {
                usmart_dev.scan();        //执行usmart扫描       
#if __CORTEX_M == 0x00  //Cortex-M0
                TIM_SetCounter(TIM14, 0);                //清空定时器的CNT
                TIM_SetAutoreload(TIM14, 100);//恢复原来的设置
#else
                TIM_SetCounter(TIM2,0);                //清空定时器的CNT
                TIM_SetAutoreload(TIM2,100);//恢复原来的设置
#endif
        }
#if __CORTEX_M == 0x00  //Cortex-M0
        TIM_ClearITPendingBit(TIM14,TIM_IT_Update);
#else
        TIM_ClearITPendingBit(TIM2,TIM_IT_Update);  //清除中断标志位
#endif
#if _SYSTEM_SUPPORT_ROTS == 1
    OSIntExit();        //触发任务切换软中断
#endif
}[/mw_shl_code]
3.4 Timer2_Init()函数代码
[mw_shl_code=applescript,true]void Timer2_Init(u16 arr,u16 psc)
{


    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

#if __CORTEX_M == 0x00  //Cortex-M0
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);
#else
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //TIM2时钟使能
#endif

        //TIM2初始化设置
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         计数到5000为500ms
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
#if __CORTEX_M == 0x00  //Cortex-M0
        TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure);
        TIM_ITConfig(TIM14, TIM_IT_Update | TIM_IT_Trigger, ENABLE);
       
        NVIC_InitStructure.NVIC_IRQChannel = TIM14_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPriority = 3;
#else
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

        TIM_ITConfig( TIM2, TIM_IT_Update|TIM_IT_Trigger, ENABLE );//TIM2 允许更新,触发中断

        //TIM2中断分组配置
        NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //TIM3中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;  //先占优先级03级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
#endif
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
        NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

#if __CORTEX_M == 0x00  //Cortex-M0
        TIM_Cmd(TIM14, ENABLE);
#else
        TIM_Cmd(TIM2, ENABLE);  //使能TIM2
#endif


}[/mw_shl_code]
四、修改完毕之后,在main函数中,添加调试组件的头文件定义#include "usmart.h",同时调用初始化usmart_dev.init(48),注意,TIM14所在时钟总线的频率是48MHz的,不清楚的可以参考上个帖子的说明
五、至此,修改完毕,点击make按钮,修改报错即可,如果没有错误就可以下载验证了,本工程,我在main函数中弄了一个获取时钟频率的函数,并在usmart_config.c文件中按照格式添加供串口助手调用的函数
[mw_shl_code=applescript,true]void System_GetClocks(void)
{
  RCC_ClocksTypeDef rcc_clocks;
  
  RCC_GetClocksFreq(&rcc_clocks);
  
  printf("SYSCLK    = %dMHz\r\n", rcc_clocks.SYSCLK_Frequency / 1000000);
  printf("HCLK(AHB) = %dMHz\r\n", rcc_clocks.HCLK_Frequency / 1000000);
  printf("HCLK(AHB) = %dMHz\r\n", rcc_clocks.HCLK_Frequency / 1000000);
  printf("PCLK(APB) = %dMHz\r\n", rcc_clocks.PCLK_Frequency / 1000000);
}[/mw_shl_code]
六、程序编译下载后,打开串口助手,输入list命令发送过去,接着打印出提供调用的函数,复制System_GetClocks()函数大发送框,点击发送按钮,即可看到接收窗口显示了当前各总线的时钟主频
2.png
3.png
4.png
七、移植完成,后续的折腾中就会用到这货进行调试了
八、看完,送美女图片一张
5.png

STM32F030RB-USMART.zip

10.54 MB, 下载次数: 1544

现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11555
金钱
11555
注册时间
2014-4-1
在线时间
1317 小时
发表于 2016-5-9 22:52:27 | 显示全部楼层

大神出品,先顶再看。


回复 支持 反对

使用道具 举报

14

主题

1592

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2622
金钱
2622
注册时间
2014-7-17
在线时间
350 小时
发表于 2016-5-9 23:55:25 | 显示全部楼层
顶起来!!!
回复 支持 反对

使用道具 举报

18

主题

238

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1823
金钱
1823
注册时间
2014-8-5
在线时间
211 小时
发表于 2016-6-5 21:43:28 | 显示全部楼层
谢谢大神,现在正在调030,串口接收中断能进去,但是发送没数据。您的代码学习学习
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-6-5 22:04:44 | 显示全部楼层
513393302@qq.co 发表于 2016-6-5 21:43
谢谢大神,现在正在调030,串口接收中断能进去,但是发送没数据。您的代码学习学习

在STM32F1上稍加修改移植过来的,呵呵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

0

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2015-5-12
在线时间
23 小时
发表于 2016-9-30 10:51:27 | 显示全部楼层
谢谢楼主的分享,非常好讲解!
回复 支持 反对

使用道具 举报

1

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2017-1-8
在线时间
27 小时
发表于 2017-3-20 10:13:46 | 显示全部楼层
流明查看
回复 支持 反对

使用道具 举报

0

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2017-11-24
在线时间
18 小时
发表于 2017-12-4 14:45:01 | 显示全部楼层
移植到030上来真是不错,学习了.
回复 支持 反对

使用道具 举报

2

主题

474

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6545
金钱
6545
注册时间
2018-6-27
在线时间
551 小时
发表于 2018-11-28 14:22:16 | 显示全部楼层
学习学习,学习学习。
回复 支持 反对

使用道具 举报

13

主题

633

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1331
金钱
1331
注册时间
2016-8-1
在线时间
229 小时
发表于 2018-11-28 14:25:56 | 显示全部楼层
精华帖
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 05:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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