第三篇 STM32F030移植USMART调试组件

2019-07-21 07:23发布

用过原子哥开发板或者用过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 ", rcc_clocks.SYSCLK_Frequency / 1000000);
  printf("HCLK(AHB) = %dMHz ", rcc_clocks.HCLK_Frequency / 1000000);
  printf("HCLK(AHB) = %dMHz ", rcc_clocks.HCLK_Frequency / 1000000);
  printf("PCLK(APB) = %dMHz ", rcc_clocks.PCLK_Frequency / 1000000);
}[/mw_shl_code]
六、程序编译下载后,打开串口助手,输入list命令发送过去,接着打印出提供调用的函数,复制System_GetClocks()函数大发送框,点击发送按钮,即可看到接收窗口显示了当前各总线的时钟主频
2.png
3.png
4.png
七、移植完成,后续的折腾中就会用到这货进行调试了
八、看完,送美女图片一张
5.png

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。