用过原子哥开发板或者用过USMART调试组件的同学应该都知道,这是原子哥自家编写的一个在STM32系列单片机上调试程序用的一个组件,详情请看原子相关教程的介绍
接下来我将它移植到STM32F0系列片子上去,文件来自
这里(为原子哥修正了一个小bug)
工程来自
这里
一、拷贝USMART文件夹到工程文件夹,并添加到工程
二、双击打开usmart.c文件,大致浏览一下代码,发现原子哥用了TIM2作为定时扫描,再打开F0的编程参考手册,发现没有定时器2
除了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()函数大发送框,点击发送按钮,即可看到接收窗口显示了当前各总线的时钟主频
七、移植完成,后续的折腾中就会用到这货进行调试了
八、看完,送美女图片一张
大神出品,先顶再看。
在STM32F1上稍加修改移植过来的,呵呵
一周热门 更多>